Я просмотрел много вопросов и ответов на англоязычном Stack Overflow, но так и не нашел ответа на вопрос: как вызывать какой-либо метод с помощью сочетания клавиш в WPF-приложениях? В Windows Forms Application это делалось довольно просто, но похоже в более развитом WPF это гораздо сложнее.
Ниже представлен классический пример. Нигде, где я смотел, толком не объяснено, что именно мы привязываем. Но это явно не метод. Что это вообще за ApplicationCommands?
В другом вопросе было сказано: "XAML - это язык разметки, а потому мы не можем так просто вызвать метод оттуда". Хорошо, почему мы тогда с лёгкостью можем привязать метод к кнопке?
И, собственно, пример для вопроса. Всё, что нужно сделать - это вызвыать метод OnClickBtn1 комбинацией клавиш (ну, например, Ctrl+H) наиболее простым способом. То есть, при нажатии этой комбинации клавиш будет тот же эффект, что и при клике кнопки Btn1. Приведённого ниже кода недостаточно для того, чтобы сочетание клавиш работало. Чего именно не хватает?
XAML:
C#:
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
private void OnClickBtn1(object sender, RoutedEventArgs e) {
System.Diagnostics.Debug.WriteLine("Была нажата кнопка Btn1 либо сочетание клавиш Ctrl+H");
}
}
Ответ
Ответ на твой вопрос:
UserCommands.cs
using System.Windows.Input;
namespace Wpf_CommandsWithBindings
{
public static class UserCommands
{
static UserCommands()
{
// Можно прописать горячие клавиши по умолчанию
InputGestureCollection inputs = new InputGestureCollection();
inputs.Add(new KeyGesture(Key.S, ModifierKeys.Control, "Ctrl+S"));
SomeCommand = new RoutedUICommand("Some", "SomeCommand", typeof(UserCommands), inputs);
}
public static RoutedCommand SomeCommand { get; private set; }
}
}
MainWindow.xaml
MainWindow.xaml.cs
using System.Windows;
namespace Wpf_CommandsWithBindings
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void ShowMessage_Executed(object sender, RoutedEventArgs e)
{
MessageBox.Show(this, "Test");
}
}
}
Что это вообще за ApplicationCommands?
В WPF есть набор заготовленных комманд, которые не содержат никакого конкретного кода (что-то делающего полезное). Эти команды представляют общую задачу приложения, например, открыть папку, печать документа, открытие документа и т.д. То есть просто "задача" без конкретной реализации. Для выполнения конкретных действий командой, нужно использовать привязку, которая будет в коде вызывать конкретное действие. Может возникнуть вопрос, зачем нужны вообще эти заготовленные команды? Например, если сторонний разработчик создаст элемент управления DirectoryView, то такой элемент управления может внутри своей логики использовать команду ApplicationCommands.Open для вызова кода, открывающего корневую папку. По идее, если у тебя уже есть привязка для этой команды, то при использовании элемента управления уже не нужно ничего дописывать.
Пример, из которого видно, что достаточно прописать команду в элементе управления и в зависимости от места использования этого элемента будут выполняться разные действия (в данном примере демонстрация, что это вообще работает):
UserControlTest.xaml
MainWindow.xaml
MainWindow.xaml.cs
using System.Windows;
using System.Windows.Input;
namespace Wpf_CommandsWithBindings
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void ShowMessage_Executed(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show(this, "Test");
}
}
}
Хорошо, почему мы тогда с лёгкостью можем привязать метод к кнопке?
Потому что в XAML окна прописано пространство имён
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
и класс, относящийся к этому XAML
x:Class="Wpf_CommandsWithBindings.MainWindow"
Комментариев нет:
Отправить комментарий