2010-04-21 3 views
1

나는 열 머리글을 템플릿으로 만든 listview를 가지고 있으며 listview 항목도 템플릿 화되어 있습니다. 그러나 표보기에서 일부 행에 대해 다른 임시 표기가 있습니다. 사용자가 열 너비를 끌 수있는 목록보기 열 머리글을 두 번 클릭하면 열 머리글의 크기가 자동으로 조정되어 크기가 커집니다. 내 열 머리글 너비가 더 이상 내 행 템플리트의 열 너비와 일치하지 않기 때문에이 문제가 발생합니다.wpf listview 머리글을 방지 더블 클릭 열을 자동으로 크기 조정

열 헤더에서이 두 번 클릭 동작을 방지하는 빠르고 쉬운 방법이 있습니까?

답변

2

예, ListView에서 더블 클릭 처리기를 설정하십시오. 그런 다음 처리기에서, 다음과 같은 코드를 사용 : 나는 GridViewColumnHeader 소스 코드에 파고 후 작업 솔루션 발견

public static T TryFindParent<T>(DependencyObject current) where T : class 
{ 
    DependencyObject parent = VisualTreeHelper.GetParent(current); 

    if (parent == null) return null; 

    if (parent is T) return parent as T; 
    else return TryFindParent<T>(parent); 
} 
+0

이상한 .. upvoted과 대답을 받아, 그러나'e.Handled = true'를 설정해도 필자의 경우에는 자동 크기 조정에서 열을 방지하지 못합니다. 나는 이것을 테스트하기 위해 새로운 wpf 솔루션을 만들었다. 작동하지 않습니다. – Sinatr

0

:

private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    if (TryFindParent<GridViewColumnHeader>(e.OriginalSource as DependencyObject) != null) 
     e.Handled = true; 
} 

TryFindParent는 다음과 같이 정의된다. 열 ListView에 대한 나의 XAML은 다음과 같습니다

      <ListView.View> 
           <GridView AllowsColumnReorder="False" x:Name="ListGridView"> 
            <GridView.Columns> 

             <GridViewColumn x:Name="ExpandHeader" 
                 Width="40"> 
              <GridViewColumn.Header> 
               <GridViewColumnHeader IsHitTestVisible="False" /> 
              </GridViewColumn.Header> 
             </GridViewColumn> 

그리고 당신은 (열을 만들 때) 뷰의로드 이벤트에 다음과 같은 코드를 삽입해야합니다

private void ViewOnLoaded(object sender, RoutedEventArgs e) 
    { 
     var fields = typeof(GridViewColumnHeader).GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
     var thumbFieldInfo = fields.FirstOrDefault(fi => fi.FieldType == typeof(Thumb)); 
     var methods = typeof(GridViewColumnHeader).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance); 
     var eventHandlerMethodInfo = methods.FirstOrDefault(mi => mi.Name == "OnGripperDoubleClicked"); 

     if (thumbFieldInfo != null && eventHandlerMethodInfo != null) 
     { 
      foreach (var column in ListGridView.Columns) 
      { 
       var header = column.Header as GridViewColumnHeader; 
       if (header != null) 
       { 
        var headerGripper = thumbFieldInfo.GetValue(header) as Thumb; 
        if (headerGripper != null) 
        { 
         var handler = Delegate.CreateDelegate(typeof(MouseButtonEventHandler), header, eventHandlerMethodInfo); 
         headerGripper.RemoveHandler(Control.MouseDoubleClickEvent, handler); 
        } 
       } 
      } 
     } 
    }