2010-06-22 3 views
7

Я создал ToggleButton, чтобы показать и скрыть часть пользовательского интерфейса, и я отправил ее Content на значок.Установить Горячую клавишу для ToggleButton с изображением

Теперь я хочу добавить клавишу быстрого доступа к ToggleButton, но я не уверен, как это сделать, не связывая команду. Поскольку все, что я делаю, является привязкой к состоянию IsChecked, мне не нужна команда для выполнения каких-либо других функций, и создание пустого кажется неправильным.

Это мой ToggleButton, поскольку он в настоящее время не функционирует и не отвечает, когда я нажимаю указанную комбинацию клавиш.

<ToggleButton ToolTip="Command History" 
       MinWidth="24" 
       IsChecked="{Binding IsShowHistoryChecked}" 
       Margin="7"> 
    <ToggleButton.InputBindings> 
     <KeyBinding Gesture="Ctrl+H" /> 
    </ToggleButton.InputBindings> 
    <Image Source="/Amuse;component/Images/ComHistory256.png" 
      Width="24" /> 
</ToggleButton> 

ответ

11

InputBinding на самом ToggleButton не будет делать трюк, но есть два хороших решений WPF для вашей проблемы:

  1. Используйте RoutedCommand, который обновляет модель.
  2. Зарегистрировать ключ доступа.

Почему ваше решение 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); 

Это регистрирует «ч» в качестве текста доступа. Теперь, если пользователь нажимает Alt-H в любой области (или простой «h», если не обрабатывается TextBox), ваша кнопка будет переключаться.

Вы также можете сделать это в XAML. Если вы показываете текст в кнопке, просто используйте подчеркивание перед ключевой буквой доступа:

<Button Text="Show _History" ... /> 

Если вы показываете что-то другое, чем просто текст, включить скрытый элемент AccessText в содержании кнопки:

В случае, если вам интересно, WPF не имеет встроенного механизма, чтобы запросить регистрацию AccessKey на Ctrl вместо Alt, так что это не позволит вам установить Ctrl-H в качестве ключа доступа.

+2

Когда видимость рушится, она не работает для меня. Но я попытался установить Opacity = 0, и это сработало отлично! – Haacked