Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WPF-практика 5 События и команды.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.21 Mб
Скачать

Добавление жестов в команду

Жесты представленны абстрактным классом System.Windows.Input. InputGesture. Этот класс наследует двум типам жестов: клавиатурных и мыши, которые представлены объектами KeyGesture и MouseGesture соответственно. Команды, в свою очередь, имеют коллекцию жестов InputGestures, которую заранее можно наполнить объектами нужных жестов клавиатуры и мыши. Комбинации клавиш и кнопок мыши проще всего добавлять в объект жеста через его конструктор при создании экземпляра по схеме ( Key, ModifierKeys ) и ( MouseAction, ModifierKeys ).

В следующем примере показано, как в команду можно добавить жесты, которые будут ее запускать

// Клавиатурный жест Control+F

InputGesture gesture = new KeyGesture(Key.F, ModifierKeys.Control, "Ctrl+F");

ApplicationCommands.Find.InputGestures.Add(gesture);

// Комбинированный жест Control+LeftClick

gesture = new MouseGesture(MouseAction.LeftClick, ModifierKeys.Control);

ApplicationCommands.Find.InputGestures.Add(gesture);

// Клавиатурный жест Control+Q

KeyGesture keyGesture = new KeyGesture(Key.Q, ModifierKeys.Control, "Ctrl+Q");

ApplicationCommands.Find.InputGestures.Add(keyGesture);

// Комбинированный жест Alt+LeftClick

MouseGesture mouseGesture = new MouseGesture();

mouseGesture.MouseAction = MouseAction.LeftClick;

mouseGesture.Modifiers = ModifierKeys.Alt;

ApplicationCommands.Find.InputGestures.Add(mouseGesture);

//gesture = new MouseGesture(MouseAction.LeftClick, ModifierKeys.Alt);

//ApplicationCommands.Find.InputGestures.Add(gesture);

Теперь команда Find будет запускаться щелчком на кнопке, щелчком левой кнопки мыши с нажатой клавишей Ctrl, комбинациями клавиш Ctrl+F или Ctrl+Q.

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

  • Добавьте в обработчик события Loaded класса окна Window1 следующий код, модифицирующий жесты библиотечных команд Open и Save

public partial class Window1 : Window

{

public Window1()

{

InitializeComponent();

// Регистрация обработчика

this.Loaded += new RoutedEventHandler(Window1_Loaded);

}

void Window1_Loaded(object sender, RoutedEventArgs e)

{

// Привязка команд в коде

CommandBinding binding = new CommandBinding();

binding.Command = ApplicationCommands.Open;

binding.Executed +=

new ExecutedRoutedEventHandler(OpenCommand_Executed);

this.CommandBindings.Add(binding);

binding = new CommandBinding();

binding.Command = ApplicationCommands.Save;

binding.Executed +=

new ExecutedRoutedEventHandler(SaveCommand_Executed);

this.CommandBindings.Add(binding);

// Очистка коллекций прежних жестов команд

ApplicationCommands.Open.InputGestures.Clear();

ApplicationCommands.Save.InputGestures.Clear();

// Добавление новых жестов клавиатуры Alt+O и Alt+S

InputGesture key = new KeyGesture(Key.O, ModifierKeys.Alt, "Alt+O");

ApplicationCommands.Open.InputGestures.Add(key);

//

KeyGesture keyGesture = new KeyGesture(Key.S, ModifierKeys.Alt, "Alt+S");

ApplicationCommands.Save.InputGestures.Add(keyGesture);

// Добавление новых жестов мыши Ctrl+LeftClick и Ctrl+RightClick

InputGesture mouse = new MouseGesture(MouseAction.LeftClick, ModifierKeys.Control);

ApplicationCommands.Open.InputGestures.Add(mouse);

//

MouseGesture mouseGesture = new MouseGesture();

mouseGesture.MouseAction = MouseAction.RightClick;

mouseGesture.Modifiers = ModifierKeys.Control;

ApplicationCommands.Save.InputGestures.Add(mouseGesture);

}

void OpenCommand_Executed(object sender, ExecutedRoutedEventArgs e)

{

MessageBox.Show("Выполнена команда Open");

}

void SaveCommand_Executed(object sender, ExecutedRoutedEventArgs e)

{

MessageBox.Show("Выполнена команда Save");

}

}

Вначале мы очистили коллекции команд от прежних жестов, затем добавили свои жесты, в том числе с участием мыши. Коллекции можно было и не очищать, тогда работали бы прежние жесты наряду с вновь добавленными.

  • Запустите приложение и убедитесь, что теперь прежние клавиатурные комбинации Ctrl+O и Ctrl+S не работают, вместо них программа реагирует на жесты клавиатуры Alt+O и Alt+S, а также выполняются комбинированные жесты с участием мыши Ctrl+LeftClick и Ctrl+RightClick

В нашей программе после добавления жестов появился существенный недостаток - сами жесты мы поменяли, но в меню все-таки остались старые маркеры команд Ctrl+O и Ctrl+S. Хоть мы и пытались в конструкторе KeyGesture() определить в последнем параметре displayString новые маркеры для жестов в меню, но все осталось по прежнему. Дело здесь в том, что объект меню создается и инициализируется в конструкторе класса по объекту уже присоединенной к источнику команды. И это происходит раньше, чем мы в коде начинаем модифицировать саму команду.

Чтобы это исправить, можно воспользоваться несколькими способами: