Я считаю, что 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