Установить горячую клавишу для ToggleButton с содержимым изображения - PullRequest
7 голосов
/ 22 июня 2010

Я создал ToggleButton, чтобы показать и скрыть часть пользовательского интерфейса, и отправил Content на иконку.

Теперь я хочу добавить комбинацию клавиш к 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>

1 Ответ

11 голосов
/ 22 июня 2010

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);

Регистрирует "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 в качестве ключа доступа.

...