InputBinding на самом ToggleButton не сработает, но есть два хороших решения WPF для вашей проблемы:
- Используйте RoutedCommand, которая обновляет модель.
- Зарегистрируйте ключ доступа.
Почему ваше решение InputBinding не будет работать
Определенная вами InputBinding в настоящее время не будет работать, потому что в ней нет команды. Создать команду, которая переключает кнопку, очень просто:
public void Execute(object parameter)
{
((ToggleButton)parameter).IsChecked = !((ToggleButton)parameter).IsChecked;
}
Однако это не даст того, что вы ищете. Вы хотите, чтобы Ctrl-H переключал вашу кнопку , даже если кнопка не сфокусирована . InputBinding не выполнит это за вас, поскольку он работает только тогда, когда кнопка имеет фокус. Сейчас я расскажу о двух решениях, которые вы можете использовать.
Вариант 1: используйте RoutedCommand, которая обновляет модель
Весь смысл архитектуры WPF заключается в том, что вам никогда не понадобится «переключать кнопку» в первую очередь: концептуально все действия клавиатуры и мыши в WPF должны служить для переключения привязанного свойства в вашей модели или модели представления. Тогда ToggleButton просто становится механизмом принятия щелчков мыши, но не обязательно должен быть единственным.
Имя, которое вы выбрали для своего свойства IsShowHistoryChecked, указывает на фундаментальную проблему в вашей концепции модели представления. Ваша модель представления не должна быть разработана вокруг представления - скорее, она должна представлять логические понятия, такие как свойство «ShowHistory». Представление может связать это с CheckBox или ToggleButton, или оно может выбрать какой-то другой механизм, или оно может вообще не раскрывать его. Весь смысл в связывании данных и моделях представления заключается в том, что при создании модели представления вам все равно, каким будет фактическое представление. На самом деле, во время автоматического модульного тестирования флажок не будет установлен, поэтому «IsShowHistoryChecked» будет явно ошибочным.
Допустим, вы правильно отделили свое представление от модели представления и у вас есть свойство "ShowHistory". Сначала реализуйте команду «ToggleShowHistory» в вашей модели представления, которая при запуске переключает свойство ShowHistory. Теперь все, что вам нужно сделать, это назначить этой команде InputBinding Ctrl-H на уровне просмотра, и все готово. Даже если ToggleButton полностью удален из представления, InputBinding все равно вступит в силу, а Ctrl-H будет работать. Nirvanna.
Вариант 2: зарегистрировать ключ доступа
В Windows имеется стандартный механизм связывания клавиш с произвольными кнопками и метками, который является концепцией «ключа доступа». Если вы зарегистрируете клавишу доступа «h» на кнопке ToggleButton, нажатие Alt-H переключит кнопку, и просто отобразит H, если у вас нет TextBox или другого элемента управления, примите его первым.
Очень просто зарегистрировать ключ доступа в коде:
AccessKeyManager.Register("h", togleButton);
Регистрирует "h" в качестве текста доступа. Теперь, если пользователь нажимает Alt-H где-нибудь в области видимости (или просто вводит h, если не обрабатывает TextBox), ваша кнопка будет переключаться.
Вы также можете сделать это в XAML. Если вы показываете текст в своей кнопке, просто используйте подчеркивание перед буквой ключа доступа:
<Button Text="Show _History" ... />
Если вы показываете что-то кроме текста, включите скрытый элемент AccessText в содержимое кнопки:
<Button ...>
<Grid>
<AccessText Text="_h" Visibility="Collapsed" />
<Image ...>
</Grid>
</Button>
Если вам интересно, у WPF нет встроенного механизма, чтобы запрашивать, чтобы регистрации AccessKey реагировали на Ctrl вместо Alt, поэтому это не позволит вам установить Ctrl-H в качестве ключа доступа.