Широкое применение KeyboardNavigation.ControlTabNavigation? - PullRequest
1 голос
/ 27 марта 2012

У меня есть проблема, с которой я пытался разобраться - следующее:

KeyboardNavigation.ControlTabNavigation="None"

, кажется, не работает в моем приложении, несмотря на все мои усилия ... Я не совсемконечно, почему, но независимо от того, что я делаю, функциональность CTRL + TAB всегда работает, и в моем случае поведение отрицательно сказывается на том, как бы я хотел, чтобы мои элементы управления вкладками работали.В идеале, вместо размещения вышеуказанного тега в каждом контейнере в моем приложении (которое я все равно не могу заставить работать), я бы хотел отключить ControlTabNavigation для всего приложения.Есть ли способ сделать это без необходимости переходить от контейнера к контейнеру, и есть ли очевидные "ошибки", которые обычно мешают вышеуказанному функционировать должным образом?

Спасибо!Aj

Ответы [ 2 ]

1 голос
/ 24 апреля 2012

Я считаю, что KeyboardNavigation не работает так, как я ожидал, поскольку он касается Ctrl-Tab и TabControl.Я собрал простой прототип, и KeyboardNavigation.ControlTabNavigation="None", похоже, не оказывает ожидаемого влияния на переключение вкладок с помощью Ctrl-Tab, как только я щелкаю левой кнопкой мыши по вкладке, и фокус клавиатуры находится внутри TabControl.

Тем не менее, использование InputBindings с командой может переопределить нежелательное поведение Ctrl-Tab по умолчанию.Оттуда я обнаружил, что KeyboardNavigation.TabNavigation="Cycle", так же как и другие опции TabNavigation, похоже, ведут себя разумно.Использование FocusManager и других методов, описанных в ссылках на ресурсы, приведенных ниже, должно позволить получить желаемую навигацию с помощью клавиатуры, хотя и с использованием несколько нелогичных методов.

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

Обратите внимание, что ниже привязки команд требуется целевой WPF 4.0;пожалуйста, посмотрите ресурсы в конце публикации, чтобы узнать, как настроить таргетинг на WPF 3.5 или более раннюю версию

В XAML:

<TabControl 
    x:Name="tabControl1"
    IsSynchronizedWithCurrentItem="True"
    SelectedItem="{Binding SelectedTabItem}"
    ItemsSource="{Binding TabItemViewModels}"
    KeyboardNavigation.ControlTabNavigation="None"
    KeyboardNavigation.TabNavigation="Continue">

            <TabControl.InputBindings>
                <KeyBinding Modifiers="Control"
                    Key="Tab"
                    Command="{Binding ShowDialogCommand}" />
            </TabControl.InputBindings>
</TabControl>

Обратите внимание, что в приведенном выше XAML KeyboardNavigation.ControlTabNavigation="None" не имеет никакого эффекта и можетбыть исключены.

При поддержке DataContext, как правило, ViewModel:

Объявите свойство привязки:

public RelayCommand ShowDialogCommand
{
     get;
     private set;
}

Инициализируйте свойство;например, может быть в конструкторе ViewModel (примечание, RelayCommand из библиотеки MVVM-Light.):

ShowDialogCommand = new RelayCommand(() =>
            {
                MessageBox.Show("Show dialog box command executed", "Show Dialog Box Command", MessageBoxButton.OK, MessageBoxImage.Information); 
            });

Ресурсы:

Полезное сообщение StackOverflow на связках клавиш

Подробнее о привязке клавиш к команде;описывает специальную технику CommandReference, необходимую при нацеливании на WPF framewrok 3.5 или более ранней версии

Обзор Microsoft Focus

0 голосов
/ 24 апреля 2012

Я давно не смотрел на эту проблему, но с тех пор, как Билл спросил, она вызвала новый интерес.Вместо того, чтобы переходить от контроля к контролю, я использовал пустую команду, как предложил Билл, но применил ее к шаблону TabControl ... как указал Билл, что-то вроде нелогичного решения, но оно работает (я также учел Ctrl + Shift+ Tab, который является противоположным направлением Ctrl + Tab):

MyClass:

public static readonly RoutedCommand CancelTabChangeCommand = new RoutedCommand() { };

XAML:

<Style TargetType="{x:Type TabControl}">    
  <Setter Property="Template">
     <Setter.Value>
        <ControlTemplate TargetType="{x:Type TabControl}">
           <Grid ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
                    <Grid.InputBindings>
                        <KeyBinding Command="{x:Static local:myClass.CancelTabChangeCommand}" Key="Tab" Modifiers="Control" />
                        <KeyBinding Command="{x:Static star:Startup.CancelTabChangeCommand}" Key="Tab" Modifiers="Shift+Control"/>
                    </Grid.InputBindings>

Я оставил остальную часть своего классаи XAML, поскольку это не относится к примеру, но я рад предоставить больше, если это кому-то понадобится.В связи с этим я также обнаружил, что создание шаблона элемента управления для TabItem и установка для свойства IsTabStop значения false также не позволяет моим пользователям переходить между вкладками и изменять вкладки таким же образом ... на случай, если у кого-то возникнет эта проблема, когда ябыл.

Надеюсь, это поможет!

...