Определение ярлыков MenuItem

Мне нужен простой способ установить ярлык для пунктов меню.

Но это не работает с ярлыком, просто щелкая:

    Procurar     

Я использую WPF 4.0

    Вам нужно использовать KeyBindingsCommandBindings если вы (повторно) используете RoutedCommands такие как те, которые содержатся в classе ApplicationCommands ) для тех элементов управления, в которых должны работать ярлыки.

    например

           

    Для пользовательских RoutedCommands :

     static class CustomCommands { public static RoutedCommand DoStuff = new RoutedCommand(); } 

    Применение:

            ...  

    (Чаще всего удобнее реализовать интерфейс ICommand а не использовать RoutedCommands . У вас может быть конструктор, который позволяет делегатам Execute и CanExecute легко создавать команды, которые выполняют разные вещи, такие реализации часто называются DelegateCommand или RelayCommand . не требуется CommandBindings .)

    HB был прав … Я просто хотел добавить дополнительные замечания.

    Удалите событие Click в вашем MenuItem и MenuItem его вместо Command .

    1 – добавьте / создайте свои команды:

         

    Команды ссылаются на следующий код:

     private void OpenCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) { Open();//Implementation of open file } private void SaveAsCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) { SaveAs();//Implementation of saveAs } 

    2 – Свяжите команды с необходимыми ключами:

         

    3 – InputGestureText назначьте команды с помощью пункта меню ( InputGestureText – только текст для оформления):

           

    Таким образом, несколько входов могут быть связаны с одной и той же командой.

    По моему скромному мнению гораздо проще использовать _ в заголовке. Это автоматически создаст желаемый HotKey.

    Например:

         Procurar     

    Я чрезмерно склонен к Windows.Forms & gulp VB 6, поэтому я согласен с Джонатаном и Джейсом, что для более статического подключения обработчиков событий, которые не обязательно являются CommandBindings должен быть более простой / процедурный метод. И есть, я думаю.

    Я считаю, что хороший учебник по использованию обработчиков не CommandBinding подобных этому, но с акцентом на кнопках, можно найти в этом сообщении в блоге MSDN . Я перегоняю и MenuItem s …

    Создание ICommand

    Сначала создайте class, реализующий ICommand . Вы можете поместить это где угодно, конечно, даже в свой файл MainWindow.xaml.cs, если хотите, чтобы ваш демо-код был безумно прост. Вероятно, вы захотите сделать CanExecute более сложным, если вы захотите CanExecute элементы меню / позже, но на данный момент мы всегда будем иметь пункты меню.

     public class HelloWorldCommand : ICommand { public void Execute(object parameter) { MessageBox.Show(@"""Hello, world!"" from " + (parameter ?? "somewhere secret").ToString()); } public bool CanExecute(object parameter) { return true; } public event EventHandler CanExecuteChanged; } 

    Как говорится в учебнике, вы можете вызывать эту команду где угодно уже, с кодом вроде …

     var hwc = new HelloWorldCommand(); if (hwc.CanExecute(this)) hwc.Execute(this); 

    Объявление вашей команды в окне

    Поэтому давайте добавим свое «объявление» для HelloWorldCommand в наше Окно, чтобы мы могли использовать его позже. Внутри тегов Window зарегистрируйте команду как ресурс:

        

    Теперь у нас есть аккуратный ярлык для ссылки на эту команду "hwc" namespaced», "hwc" , хотя вы, очевидно, можете использовать любую "hwc" строку. Мы будем использовать это в нашем xaml.

    Проводка (и повторное использование!) Команды

    Давайте добавим наш MenuItem s к нашему xaml. Я заменил Grid с помощью DockPanel потому что это самый простой способ (для меня) иметь равноудаленные виджеты, которые заполняют Window , хотя я оставил весь остальной пользовательский интерфейс.

    Обратите внимание, что Command="{StaticResource hwc}" посыпается в каждое объявление MenuItem . Ключ здесь hwc – помните, что это наш ярлык для HelloWorldCommand который мы установили на уровне Window . И, конечно же, StaticResource просто ищет ресурсы Window . Мы ничего не обязываем; мы просто используем наш ярлык.

                    

    CommandParameters для выделения источников событий

    Обратите внимание, что мы используем одну и ту же команду для всего! Но как мы можем определить, какой виджет забросил событие? Для этого вам нужно использовать CommandParameter – запомнить нашу подпись метода Execute(object parameter) : Execute(object parameter) . Этот параметр CommandParameter – это то, что мы можем использовать, чтобы знать, как обрабатывать событие. Попробуйте запустить это и обратите внимание, что MessageBox будет использовать все, что находится в CommandParameter чтобы вы знали источник события. Мы делаем все это вручную, но это не так уж плохо.

    Также обратите внимание, что вы можете сделать эти объекты такими сложными, насколько хотите. Вы можете использовать свойство в теге MenuItem для определения параметра или использовать tags «real» , например, в пункте меню Open, чтобы определить что-то сложное. В этом случае мы передаем весь родительский объект Window , который был самым простым (хотя и не самым чистым) способом бросить наш контекст VB6-ish в код обработчика событий.

    Добавление сочетаний клавиш в MenuItem s (иначе, «Ответ на OP»)

    И теперь мы можем наконец ответить на исходный вопрос! Давайте, наконец, подключим комбинацию клавиш для элемента меню « Close . Вы заметите, что мы уже объявили InputGestureText . Сам по себе InputGestureText является только косметическим . Если бы мы были слишком parsingчивы, мы могли бы утверждать, что механизм создания сочетания клавиш не имеет никаких прямых, неотъемлемых отношений с MenuItem вообще!

    Нам нужно вместо этого (или дополнительно) зарегистрировать прослушиватель для Ctrl-G на уровне Window чтобы поймать нажатие клавиши. Итак, на верхнем уровне ваших тегов Window вставьте это (взятое в основном отсюда ):

        

    Обратите внимание, что вы можете поместить tags CommandParameter в свой KeyBinding , переместив его из самозакрывающейся части XML в «реальные» открытые и KeyBinding tags KeyBinding .

    И все готово. Запустите приложение и нажмите Ctrl-G. Whaddup.

    Довольно просто, как только у вас есть игроки прямо, и гораздо меньше магических привязок, чем большинство интро для команд и MenuItems , я думаю.


    Возможный совет:

    Вся вещь CommandBinding смутила меня. Я полагаю, это просто для определенных типов команд. То есть вы не можете просто подключить любую Command вам нравится. Вещи, как то, что хвастается здесь (в том, что, по общему признанию, достойное учебное пособие!) …

    Это может быть не совсем очевидно, но с помощью команд мы просто получили целую кучу вещей бесплатно: ярлыки клавиш, текст и InputGestureText для элементов, а WPF автоматически включает / отключает элементы в зависимости от активного элемента управления и его состояния. В этом случае Cut и Copy отключены, потому что не выбран текст, но вставка включена, потому что мой буфер не пуст!

    … является своего рода волшебством-y и не обязательно хорошим, и может быть запутанным, когда вы новичок в меню WPF.

    Вы также можете объявить RoutedUICommand в XAML:

        CTRL+SHIFT+B    

    Сделайте привязку

        

    И в MenuItem

      

    Здесь обсуждается другое решение.

    Давайте будем гением компьютера.