Как выбрать пункты меню «Файл» с помощью клавиатуры в WPF и C #?
-
05-07-2019 - |
Вопрос
Я разрабатываю приложение с интерфейсом WPF.
У меня есть меню в верхней части экрана, в котором есть пункты меню Файл, Справка.
В файле - > Внутренние функции (сочетание клавиш ctrl + B), пункты подменю Exit (Ctrl + x).
при щелчке по любому элементу подменю открывается соответствующее окно.
Итак, как с помощью мыши, нажав ctrl + B или Ctrl + x, как открыть окно?
Кроме того, как я могу отобразить маленькую строку под " F " в файле, чтобы, когда пользователь нажимал Alt + F, меню «Файл» было видно.
Я работаю над WPF с использованием C #.
Решение
Вы хотите исследовать ICommand, RoutedUICommand, InputGestureCollection и CommandManager. Это немного более сложная инфраструктурная работа, но шаблон WPF Command позволяет вам совместно использовать команду в главном меню, контекстном меню, нажатиях кнопок и т. Д. С вашими действиями, записанными в виде команд, все места в вашем приложении, которые используют команду, активируют / последовательно отключить и добавить еще один слой косвенности, чтобы уменьшить повторение кода. Р>
Следующий пример находится в VB.Net (извините, но, надеюсь, его легко перевести).
Реализуйте каждое из ваших необходимых действий как класс, который реализует ICommand:
Public Class OpenWindowCommand
Implements ICommand
Public Function CanExecute(parameter as Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute
'enter code that determines whether this command should be enabled or not
'if you are listening to some backend logic that changes this state, you can
'raise a CanExecuteChanged event
End Function
Public Sub Execute(parameter as Object) Implements System.Windows.Input.ICommand.Execute
'code that you want to run for the action
End Sub
End Class
Создайте класс, в котором хранятся общие экземпляры каждой из ваших команд.
Public Class MyCommands
Private Shared ReadyOnly openWindowCmd As ICommand = New OpenWindowCommand()
Private Shared _openWindow as RoutedUICommand
Shared Sub New()
'static constructor
Dim shortcut = New KeyGesture(Key.W, ModifierKeys.Control)
RegisterCommand(_openWindow, "OpenWindow", "Open...", shortcut, AddressOf ExecuteOpenWindow, AddressOf CanExecuteOpenWindow)
'add more commands as needed
End Sub
Private Shared Sub RegisterCommand(ByRef command as RoutedUICommand, ByVal name as String, ByVal text as String, ByVal gesture as KeyGesture, ByVal executeHandler as ExecutedRoutedEventHandler, ByVal canExecuteHandler as CanExecuteRoutedEventHandler)
Dim inputs = New InputGestureCollection()
If gesture IsNot Nothing Then inputs.Add(gesture)
command = New RoutedUICommand(text, name, GetType(MyCommands), inputs)
Dim binding = New CommandBinding(command, executeHandler, canExecuteHandler)
Application.Current.MainWindow.CommandBindings.Add(binding)
CommandManager.RegisterClassCommandBinding(GetType(Window),binding)
End Sub
Public Shared ReadOnly Property OpenWindow() as RoutedUICommand
Get
Return _openWindow
End Get
End Property
Public Shared Sub ExecuteOpenWindow(sender as Object, e as ExecutedRoutedEventArgs)
openCmd.Execute(e.Parameter)
End Sub
Public Shared Sub CanExecuteSave(sender as Object, e as CanExecuteRoutedEventArgs)
e.CanExecute = openCmd.CanExecute(e.Parameter)
e.Handled = True
End Sub
End Class
Теперь в вашем XAML для вашего меню вы можете привязать эту команду:
<Window.Resources>
<local:MyCommands x:Key="commands"/>
</Window.Resources>
...
<MenuItem Name="mnuOpenWindow" Command="{Binding Path=OpenWindow}"/>
Это немного больше, чем минимальное требование для использования команд, но в достаточно большом приложении я нашел эту дополнительную инфраструктуру довольно полезной. После того, как команды написаны и зарегистрированы, привязка к ним в любом документе XAML становится тривиальной, и, предоставляя общие свойства для каждого действия через класс MyCommands, вы можете получить доступ к командам исключительно в коде, если это необходимо.
Другие советы
Чтобы добавить небольшую строку, представляющую ускоритель элемента меню, используйте подчеркивание в XAML:
<MenuItem Header="_File">
<MenuItem Header="_Backend Features" />
<MenuItem Header="E_xit" />
</MenuItem>
Что касается сочетаний клавиш, во-первых, я бы порекомендовал не использовать Ctrl + X для выхода, так как это обычно используется для вырезания. Обычно выход не имеет сочетания клавиш, но нажатие Alt + F4 для закрытия главного окна будет иметь тот же эффект.
Что касается вашего фактического вопроса, у вас есть несколько вариантов, но для обоих вам необходимо использовать команды для реализации обработки ваших элементов MenuIms, а не события Click
.
Первый вариант - установить InputBinding
для каждой сочетания клавиш. Это будет сделано примерно так в вашем главном окне:
Р>
Для атрибута Command
вам нужно указать выражение, представляющее команду для этого ярлыка (вы должны использовать ту же Command
при определении MenuItem
тоже). Если у вас есть класс Commands
, вы можете сделать что-то вроде следующего:
static class Commands
{
public static ICommand BackendFeaturesCommand = ...;
}
А потом в XAML:
<KeyBinding Key="B" Modifiers="Control"
Command="{x:Static Commands.BackendFeaturesCommand}" />
Другой вариант - определить вашу команду как RoutedUICommand
и укажите для него InputGesture
. Это позаботится о подключении сочетания клавиш для вас.
Вы можете взглянуть на образец ShortCutKey WPF Application Framework (WAF) а>. Это довольно просто понять.