WPF — TabControl — Предотвратить изменение выбора

Кажется, что WPF TabControl не поддерживает возможность отмены изменения выбора, поскольку нет события SelectionChanging(), только событие SelectionChanged. Кто-нибудь нашел способ сделать это?

Единственный способ, который я нашел, — это присоединить событие PreviewMouseLeftButtonDown() к каждому TabItem и установить для e.Handled значение true, если я не хочу, чтобы эта конкретная страница выбиралась. Кажется, это работает, но неуклюже.


person Randy Minder    schedule 31.01.2011    source источник
comment
‹a href=joshsmithonwpf.wordpress.com/2009/09/04/› вы найдете хороший способ, как это сделать. Я помню, как смотрел его некоторое время назад, и он мне тоже понравился, но в конце концов я сделал это с помощью обходного пути. У меня были проблемы с этим решением, которые заставили меня использовать обходной путь, но я не могу вспомнить, что это было.   -  person HCL    schedule 31.01.2011
comment
Не только неуклюжий, но и мышь — не единственный способ для пользователя переключать вкладки.   -  person Tergiver    schedule 31.01.2011
comment
Разве это не просто переключение обратно после того, как переключение уже было сделано? Элементы управления на левой вкладке, возможно, уже исчезли.   -  person ygoe    schedule 29.10.2014
comment
В этом, наверное, дело :)   -  person HCL    schedule 29.10.2014
comment
Почитав другие сайты и изучив справочный исходный код Microsoft, я пришел к выводу, что запретить выбор элемента вкладки просто невозможно. Ни за что. Это невозможно остановить. Если вам (мне) это нужно, используйте другой элемент управления или сверните свой собственный TabControl. Я, вероятно, буду использовать другую концепцию пользовательского интерфейса.   -  person ygoe    schedule 29.10.2014


Ответы (1)


Я нашел способ сделать это, используя стиль для TabItem, а затем привязав свойство Focusable к логическому значению, которое управляет поведением. Получение привязки к родительской модели представления было немного шатким, но это, вероятно, можно было бы улучшить.

Это хорошо, потому что позволяет избежать трюков с событиями щелчка, которые могут не сработать, например, если пользователь использует клавиатуру.

<TabControl.Resources>
    <Style TargetType="{x:Type TabItem}">
        <Setter Property="Focusable"  Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.IsUpToDate}" />
        <Setter Property="HeaderTemplate">
             <Setter.Value>
                <DataTemplate>
                    <TextBlock Text="{Binding Group}" />
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</TabControl.Resources>
person Ben    schedule 22.09.2016