【问题标题】:prevent wpf listview header double click autosizes column防止 wpf listview 标题双击自动调整列
【发布时间】:2011-02-10 18:37:39
【问题描述】:

我有一个列表视图,其中我已经对列标题进行了模板化,并且列表视图项也被模板化了。但是,对于网格视图中的某些行,我有不同的模板。当用户双击可以拖动列宽的列表视图列标题时,列标题将自动调整大小,这意味着它会增加其大小。这给我带来了一个问题,因为我的列标题宽度不再与我的行模板中的列宽度同步。

是否有一种快速简便的方法可以防止在列标题上出现这种双击行为?

【问题讨论】:

    标签: wpf gridview listview


    【解决方案1】:

    在挖掘 GridViewColumnHeader 源代码后,我找到了可行的解决方案。 我的带有列的 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>
    

    并且您需要将这样的代码放入 View 的 Loaded 事件中(当创建列时):

        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);
                        }
                    }
                }
            }
        }
    

    【讨论】:

      【解决方案2】:

      是的,在ListView 本身上设置一个双击处理程序。然后在处理程序中,使用如下代码:

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

      其中TryFindParent定义为:

      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);
      }
      

      【讨论】:

      • 奇怪.. 赞成和接受的答案,但设置 e.Handled = true 并不能阻止列在我的情况下自动调整大小。我创建了一个新的 wpf 解决方案来测试它。没用。
      猜你喜欢
      • 2011-09-25
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2016-02-18
      • 2018-06-11
      • 2010-12-23
      • 1970-01-01
      • 2011-03-23
      相关资源
      最近更新 更多