- •Лабораторная работа: События и команды в 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. Разработка простого блокнота с использованием механизма команд
- •Создание нового проекта из копии существующего
- •Краткий анализ задачи
- •Создание и привязка команд
- •Реализация логики доступности источников команд
- •Отображение позиции курсора в строке состояния
Обзор библиотечных событий
Если не считать исключений, которые возбуждаются средой исполнения, то библиотечные события WPF делятся на 4 группы:
События времени жизни - возникают при загрузке, инициализации и выгрузке элемента, окна или приложения
События ввода:
События клавиатуры - возникают в результате воздействия на клавиатуру
События мыши - возбуждаются манипулированием мыши
События стило (стилуса, пера) - использование устройства ввода на планшетных компьютерах, которое заменяет мышь
События времени жизни всех элементов управления наследуются от класса FrameworkElement и указаны в таблице
События времени жизни элементов |
|
Событие |
Описание |
Initialized |
Данное событие является обычным, а не перенаправленным, и возникает после создания элемента и определения всех его полей и свойств. Такое состояние характеризуется булевым свойством IsInitialized=true. На этом этапе еще не применены стили и привязка данных. Соседние элементы окна могут быть еще не полностью созданными |
Loaded |
Возникает после события Initialized, когда все окно закончило инициализацию и дополнительно были применены стили и привязка данных к элементу. Это последний этап, за которым следует визуализация элемента. В этот момент он принимает состояние IsLoaded=true |
Unloaded |
Возбуждается сразу после удаления элемента из контейнера или его закрытия |
Класс FrameworkElement наследует и реализует интерфейс ISupportInitialize, объявляющий методы BeginInit() и EndInit(). Эти методы автоматически вызываются анализатором разметки, но если создавать элементы в процедурном коде, то их следует вызывать вручную. После вызова метода EndInit() инициализация элемента считается завершенной и возбуждается сигнализирующее событие Initialized.
Любой составной объект, имеющий ссылки на другие объекты, оформленные в нем как свойства типов адресуемых объектов, начинает свое создание с переферийных объектов. Эту нужно для того, чтобы при создании самого родителя его свойствам можно было присвоить уже готовые адреса вспомогательных объектов. Дерево элементов WPF тоже начинает строиться с листьев, то есть глубоко вложенные элементы инициализируются до того, как будут инициализированы их родительские контейнеры.
Есть еще события времени жизни окна:
События жизни окна |
|
Событие |
Описание |
Activated |
Возбуждается при получении окном фокуса ввода системы. По функциональности эквивалентно событию GotFocus элемента управления |
Closed |
Возбуждается после закрытия окна, когда еще объекты дерева являются доступными и их событие Unloaded еще не возникло |
Closing |
Возникает при получении команды на закрытие окна, которую еще ее можно отменить присвоением в обработчике свойству Cancel=true через аргумент CancelEventArgs. Если пользователь не закрывал окно, а просто вышел из системы, то нужно обрабатывать событие уровня приложения System.Windows.Application.SessionEnding |
ContentRendered |
Возникает сразу после первой визуализации окна |
Deactivated |
Возбуждается каждый раз, когда окно теряет фокус ввода при свертывании или переключении на другое окно |
LocationChanged |
Происходит, когда местоположение окна изменяется |
SourceInitialized |
Предусмотрено для поддержки взаимодействия с Win32 |
StateChanged |
Происходит при изменении окном свойства WindowState |
События ввода через объекты-аргументы своих обработчиков передают информацию о состоянии устройств ввода при манипулировании с ними пользователей. Анализ этой информации позволяет принять решение об адекватной реакции приложения. События ввода являются маршрутизируемыми.
