防止wpf列表视图标题双击自动调整列大小

bprjcwpo  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(230)

我有一个列表视图,我已经模板化了列标题和列表视图项目也模板化了。然而,我对网格视图中的一些行有不同的模板。当用户双击列表视图列标题时,您可以拖动列的宽度,列标题将自动调整大小,这对我来说是个问题,因为我的列标题宽度不再与行模板中的列宽度同步。
有没有一个快速简单的方法来防止这种双击列标题的行为?

ffvjumwh

ffvjumwh1#

是的,在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);
}

bkkx9g8r

bkkx9g8r2#

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

相关问题