prevent wpf listview header double click autosizes column

后端 未结 2 1394
北恋
北恋 2020-12-21 20:06

I have a listview where I have templated the column headers and the listview items are templated also. However I have different tempalates for some of the rows in the grid

相关标签:
2条回答
  • 2020-12-21 20:47

    Yes, set up a double-click handler on the ListView itself. Then in the handler, use code like this:

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

    Where TryFindParent is defined as:

    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 讨论(0)
  • 2020-12-21 20:47

    I found working solution after digging in GridViewColumnHeader source code. My XAML for ListView with columns is:

                                <ListView.View>
                                    <GridView AllowsColumnReorder="False" x:Name="ListGridView">
                                        <GridView.Columns>
    
                                            <GridViewColumn x:Name="ExpandHeader"
                                                            Width="40">
                                                <GridViewColumn.Header>
                                                    <GridViewColumnHeader IsHitTestVisible="False" />
                                                </GridViewColumn.Header>
                                            </GridViewColumn>
    

    And you need to put code like this in your View's Loaded event (when columns are created):

        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);
                        }
                    }
                }
            }
        }
    
    0 讨论(0)
提交回复
热议问题