Установите Сочетание клавиш для ToggleButton с Содержимым изображения

Я создал a ToggleButton чтобы показать и скрыть часть UI и я отправил 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>
7
задан Dave Clemmer 3 September 2011 в 03:42
поделиться

1 ответ

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 будет работать. Нирванна.

Вариант 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 в качестве клавиши доступа.

11
ответ дан 6 December 2019 в 23:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: