2012-03-28 2 views
0

WPF ListView을 항상 볼 수있는 바닥 글로 확장해야합니다. 바닥 글은 머리글처럼 동작해야하며 멀리 스크롤하지 않아야합니다. 다음 XAML 외부 ScrollViewer리스트 뷰의에서 ScrollViewer를 조종 뒤에 코드에 연결 사용ListView의 기본 크기에 어떻게 바인딩합니까?

<Window x:Class="LayoutTests.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="125" Width="176"> 
    <Grid> 
    <StackPanel> 
     <ListView Name="L" ScrollViewer.HorizontalScrollBarVisibility="Hidden"> 
     <ListViewItem Content="Brown brownie with a preference for white wheat."/> 
     <ListViewItem Content="Red Redish with a taste for oliv olives."/> 
     </ListView> 
     <ScrollViewer CanContentScroll="False" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" ScrollChanged="ScrollViewer_ScrollChanged"> 
     <!-- Would like to bind Rectangle.Width to the preferred width of L --> 
     <Rectangle Height="20" Width="500" Fill="Red"/> 
     </ScrollViewer> 
    </StackPanel> 
    </Grid> 
</Window> 

이 뒤에있는 코드에서는 다음과 같습니다

private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e) 
{ 
    var bottomScrollViewer = sender as ScrollViewer; 
    var listScrollViewer = GetScrollViewer(L) as ScrollViewer; 
    if (listScrollViewer != null && bottomScrollViewer != null) 
    listScrollViewer.ScrollToHorizontalOffset(bottomScrollViewer.HorizontalOffset); 
} 

GetScrollViewer()는 다음과 같이 정의 (되지만,) 중요 :

public static DependencyObject GetScrollViewer(DependencyObject depObj) 
{ 
    if (depObj is ScrollViewer) 
    { return depObj; } 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
    { 
    var child = VisualTreeHelper.GetChild(depObj, i); 
    var result = GetScrollViewer(child); 
    if (result == null) { continue; } 
    else { return result; } 
    } 
    return null; 
} 

ScrollViewerListView의 분명히 AB를 알고 그 아이의 적절한 폭을 지정합니다. 문제는 그 너비에 바인딩하는 방법을 찾을 수 없다는 것입니다. 따라서 여기에 있습니다 :

Rectangle.WidthListView의 기본 크기로 어떻게 바인딩합니까?

또는 ListView에 항상 표시되는 바닥 글을 포함시키는 방법은 무엇입니까?

답변

1

ScrollViewerExtentWidth에 바인딩해야합니다. http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollviewer.extentwidth.aspx에 따르면 DependencyProperty입니다. ListViewScrollViewer이 필요하며 목록보기 아래에 추가로 작성하는 것은 아닙니다.

GetScrollViewer 함수를 사용하여 ListView에서 ScrollViewer을 찾을 수 있습니다. 물론 코드 숨김에 바인딩을 설정해야합니다. 다음과 같은 것 :

Binding b = new Binding("ExtentWidth") { Source = GetScrollViewer(L) }; 
rect.SetBinding(Rectangle.WidthProperty, b); 
+0

바인딩 설정이 매우 흥미 롭습니다. {}에 코드를 지정하여 내용을 엉망으로 만들 수 있다는 것을 알지 못했습니다. 거기에 이름이 있나요? 현재 그것은 나를 위해 작동하지 않습니다 - 스크롤바가 나타나지 않습니다. 지금 디버깅 중입니다. – Pascal

+0

이상한 - 너비는 얼마입니까? ([Snoop 유틸리티] (http://snoopwpf.codeplex.com/)를 사용하여 찾을 수 있습니다. – Vlad

+0

글쎄, 더미 변환기를 지정하고 (자신의'Convert' 메소드에 중단 점을 설정하여) 바인딩을 디버깅 할 수 있습니다. – Vlad

관련 문제