- •Лабораторная работа: События и команды в wpf
- •Обзор библиотечных событий
- •Упражнение 1. Обработка событий клавиатуры
- •События мыши
- •Упражнение 2. Прослушивание событий мыши
- •Упражнение 3. Создание и прослушивание пользовательского события
- •Обработчики уровня класса
- •Добавление информации в объект аргумента события
- •Задание для Упражнения 3
- •Модель команд
- •Объекты команд
- •Библиотечные классы команд
- •Присоединение команды к источнику
- •Привязка команды к прослушивающему элементу
- •Упражнение 4. Привязка команд в разметке
- •Перекрытие функций диспетчеризации событий
- •Прямой вызов команд
- •Упражнение 5. Привязка команд в процедурном коде
- •Жесты как источники команд
- •Добавление жестов в команду
- •Способ 1
- •Способ 2
- •Способ 3
- •Добавление жестов в прослушивающий элемент
- •Упражнение 6. Разработка простого блокнота без механизма команд
- •Создание главного меню
- •Добавление иконок
- •Создание логических ресурсов
- •Создание панели инструментов, строки состояния и рабочей области
- •Замена встроенного контекстного меню
- •Назначение ресурсов неразделяемыми
- •Замена иконок на прозрачные
- •Отключение встроенных команд
- •Подключение иконки приложения
- •Распределение класса по нескольким файлам и создание вспомогательных функций
- •Размещение вариантов заголовков окна в ресурсах приложения
- •Создание заготовок обработчиков
- •Регистрация обработчиков в разметке
- •Реализация обработчиков раздела меню File
- •Обработка системной кнопки
- •Реализация части обработчиков раздела меню Edit
- •Разработка и кодирование диалогового окна Find and Replace
- •Кодирование функциональности Find and Replace в основном окне
- •Подключение функциональности Find and Replace к источникам задач
- •Разработка диалогового окна Go To
- •Применение вложенных ресурсов
- •Подключение функциональности Go To к основному окну
- •Прочие задачи
- •Принудительная перерисовка окна
- •Добавление жестов
- •Логика отключения источников задач
- •Реализация логики отключения источников задачи Save
- •Упражнение 7. Разработка простого блокнота с использованием механизма команд
- •Создание нового проекта из копии существующего
- •Краткий анализ задачи
- •Создание и привязка команд
- •Реализация логики доступности источников команд
- •Отображение позиции курсора в строке состояния
Перекрытие функций диспетчеризации событий
Для тренировки, перекройте в классе Window1 функцию диспетчеризации OnKeyDown() клавиатурного события KeyDown. Код начните вводить с ключевого слова override, чтобы воспользоваться услугами подсказчика кода IntelliSense
Заполните созданную оболочкой заготовку кодом, обеспечивающим закрытие окна приложения по нажатию клавиши Esc
// Выход по клавише Esc с предупреждением
protected override void OnKeyDown(KeyEventArgs e)
{
switch (e.Key)
{
case Key.Escape:
MessageBoxResult result =
MessageBox.Show("Закрыть приложение ?", "",
MessageBoxButton.OKCancel,
MessageBoxImage.Question);
if (result == MessageBoxResult.OK)
this.Close();
break;
}
}
Запустите приложение, раскройте мышью меню File и нажимайте на клавишу Esc
Мы видим, что клавиша Esc действует только на те элементы, которым на момент нажатия передан фокус ввода. Но если бы мы перекрыли функцию OnPreviewKeyDown(), то окно приложения закрывалось бы сразу. Для проверки этого можно в коде просто поменять имя перекрытой функции с OnKeyDown на OnPreviewKeyDown, так как обе функции имеют одинаковую сигнатуру.
Для сравнения можно привести код использования равнозначного по функциональности класса диалогового окна из библиотеки System.Windows.Forms.dll
protected override void OnKeyDown(KeyEventArgs e)
{
switch (e.Key)
{
case Key.Escape:
System.Windows.Forms.DialogResult result =
System.Windows.Forms.MessageBox.Show("Закрыть приложение ?", "",
System.Windows.Forms.MessageBoxButtons.OKCancel,
System.Windows.Forms.MessageBoxIcon.Question);
if (result == System.Windows.Forms.DialogResult.OK)
this.Close();
break;
}
}
Коды немного различаются, причем последний работает похуже - после его закрытия окно WPF теряет фокус ввода. Но мы немного отвлеклись от темы команд WPF, продолжим...
Названия кнопок в разметке мы жестко подписали, но существует другой способ, когда подпись можно извлечь из самой команды (если она есть). Если объект команды произведен от класса RoutedCommand, то там нет свойства Text, которое можно было бы использовать. Но если команда имеет тип RoutedUICommand, то этот класс добавляет такое свойство и оно может иметь значение.
Перепишите элементы кнопок в разметке файла Window1.xaml следующим образом
<Button Margin="5" Padding="5" Focusable="False"
Command="ApplicationCommands.Open"
Content="{x:Static ApplicationCommands.Open}"
/>
<Button Margin="5" Padding="5" Focusable="False"
Command="ApplicationCommands.Save"
Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"
/>
Запустите приложение - сейчас надписи на кнопках должны выглядеть так
