Это на самом деле не считается «ответом» (я не могу явно добавить комментарий), но я бы сказал, что то, что вы делаете, не является предполагаемым методом в WPF.Вы делаете это способом Windows Forms (и, как и во многих других инструментах) - определяете свой UX в коде.Вы продвинулись так же далеко, как и раньше, но теперь вы наткнулись на кирпичную стену: ключевые жесты - чисто UX, определенно не должны быть указаны в code-behind.Внешний вид (как функция модели представления) и взаимодействие с ним пользователя (способы выполнения заданной команды) предназначены для определения XAML.
Значения свойств, а команды - для вашего представления.модель, так что вы можете повторно использовать эту модель представления для других представлений, а также легко создавать для нее модульные тесты.Как реализация сочетаний клавиш в модели представления поможет тестируемости?А для использования в других представлениях можно утверждать, что фактические ярлыки могут не относиться к новому представлению, так что они не принадлежат.Конечно, у вас могут быть и другие причины, но я бы посоветовал вам просто определить их в XAML.
-Добавлено в ответ на ваш комментарий-
Вы совершенно правы - иЯ видел несколько довольно крупных проектов WPF UX, которые изо всех сил пытались избежать какого-либо кода и оказывались излишне тупыми.Я пытаюсь использовать любой подход, который дает рабочий результат, и настолько прост, насколько я могу его получить.
Вот пример фрагмента, который просто создает MenuItem ..
<Menu x:Name="miMain" DockPanel.Dock="Top">
<MenuItem Command="{Binding Path=MyGreatCommand}" Header="DoSomething"/>
Этосоздает меню.Здесь MyGreatCommand
- это ICommand
, и это просто свойство модели представления.Я обычно помещаю это в DockPanel
, для обработки StatusBar
и т. Д.
Для назначения жеста клавиши.
<Window.InputBindings>
<KeyBinding Key="X" Modifiers="ALT" Command="{Binding Path=MyGreatCommand}"/>
Однако, поскольку вы упомянули, что выуже искал ответы и нашел только XAML - я полагаю, вы уже пробовали этот подход.Я использовал RoutedUICommand
s вместо пользовательских ICommand
s, чтобы получить этот красивый выровненный по правому краю жест в тексте заголовка, но я не нашел, как сделать то и другое.Если вы настаиваете на создании команд и жестов клавиш в коде, возможно, вам придется создать RoutedUICommand
s.
Почему вы хотите установить жесты клавиш, отличные от вашего XAML?
Если вы хотите, чтобы некоторые пункты меню появлялись только в том случае, если в вашей view-модели влияют определенные состояния, то вы можете привязать свойство Visibility
элемента меню (которое может содержать другие пункты меню) к Collapsed
или Visible
.