предотвратить wpf заголовок списка дважды щелкнуть столбец авторазмера - PullRequest
1 голос
/ 21 апреля 2010

У меня есть просмотр списка, в котором я шаблонизировал заголовки столбцов, а также элементы списка просмотра. Однако у меня есть разные шаблоны для некоторых строк в виде сетки. Когда пользователь дважды щелкает заголовок столбца представления списка, куда можно перетащить ширину столбца, заголовок столбца автоматически изменит размер, то есть увеличит его размер. Это вызывает у меня проблему, поскольку ширина заголовка моего столбца больше не синхронизируется с шириной столбцов в шаблонах строк.

Существует ли быстрый и простой способ предотвратить такое двойное нажатие на заголовок столбца?

Ответы [ 2 ]

2 голосов
/ 21 апреля 2010

Да, настроить обработчик двойного щелчка на самом 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);
}
0 голосов
/ 02 июля 2017

Я нашел рабочее решение после копания в исходном коде GridViewColumnHeader. Мой XAML для ListView со столбцами:

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

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

И вам нужно поместить такой код в событие Loaded вашего View (при создании столбцов):

    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);
                    }
                }
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...