- •Лабораторная работа: События и команды в 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. Разработка простого блокнота с использованием механизма команд
- •Создание нового проекта из копии существующего
- •Краткий анализ задачи
- •Создание и привязка команд
- •Реализация логики доступности источников команд
- •Отображение позиции курсора в строке состояния
Упражнение 7. Разработка простого блокнота с использованием механизма команд
Мы уже столько потрудились над этим блокнотом, который так наивно назвали простым, что неразумно будет начинать все заново. Проще скопировать полученный проект в новый и там проводить все необходимые изменения. Но трудились мы не для сего блокнота, а ради будущих наших профессиональных успехов (Se La Vi - такова жизнь).
Создание нового проекта из копии существующего
Зайдите в проводнике Windows Explorer в каталог решения EventsAndCommands и скопируйте папку Notepad1
Переименуйте копию проекта в Notepad2
Зайдите внутрь папки Notepad2 и переименуйте файл проекта тоже в Notepad2. Здесь же удалите каталоги obj и bin, которые оболочка вновь создаст при запуске приложения
Запустите оболочку, выделите узел решения EventsAndCommands и командой File/Add/Existing Project зарегистрируйте в решении оболочки проект Notepad2
Не запуская проект, откройте на редактирование любой файл проекта Notepad2, вызовите жестом Ctrl+H окно замены с указанными на рисунке настройками и сделайте замену по всему проекту
Должно получиться 20 замен.
В панели Solution Explorer вызовите контекстное меню для узла проекта Notepad2 и командой Set as StartUp Project назначьте его стартовым
Запустите приложение Notepad2 и убедитесь, что все работает как в проекте Notepad1
Краткий анализ задачи
Теперь будем модифицировать этот проект, подгоняя его под использование механизма команд. Но прежде проведем ревизию библиотечных команд, возможно не все из них закрывают наши источники и часть команд придется создавать самим. За основу возьмем источники меню, поскольку там наиболее полно представлены задачи нашего приложения. Интересующие нас библиотечные команды находятся в классе ApplicationCommands пространства имен System.Windows.Input
Сопоставление задач приложения и библиотечных команд |
|||||
Раздел меню |
Задача |
Библиотечная команда |
Встроенные жесты |
Наши жесты |
Регулировать доступность ? |
File |
New |
ApplicationCommands.New |
Ctrl+N |
Ctrl+N |
|
Open |
ApplicationCommands.Open |
Ctrl+O |
Ctrl+O |
|
|
Save |
ApplicationCommands.Save |
Ctrl+S |
Ctrl+S |
Да |
|
Save As |
ApplicationCommands.SaveAs |
|
|
|
|
Page Setup |
|
|
|
|
|
Print Preview |
ApplicationCommands.PrintPreview |
Ctrl+F2 |
Ctrl+F2 |
|
|
ApplicationCommands.Print |
Ctrl+P |
Ctrl+P |
|
||
Exit |
|
|
|
|
|
Edit |
Undo |
ApplicationCommands.Undo |
Ctrl+Z |
Ctrl+Z |
Да |
Redo |
ApplicationCommands.Redo |
Ctrl+Y |
Ctrl+Y |
Да |
|
Cut |
ApplicationCommands.Cut |
Ctrl+X |
Ctrl+X |
Да |
|
Copy |
ApplicationCommands.Copy |
Ctrl+C |
Ctrl+C |
Да |
|
Paste |
ApplicationCommands.Paste |
Ctrl+V |
Ctrl+V |
Да |
|
Delete |
ApplicationCommands.Delete |
Del |
Del |
Да |
|
Find |
ApplicationCommands.Find |
Ctrl+F |
Ctrl+F |
|
|
Find Next |
|
|
F3 |
|
|
Replace |
ApplicationCommands.Replace |
Ctrl+H |
Ctrl+H |
Да |
|
Go To |
|
|
Ctrl+G |
|
|
Select All |
ApplicationCommands.SelectAll |
Ctrl+A |
Ctrl+A |
Да |
|
Format |
Font |
|
|
|
|
Word Wrap |
|
|
Ctrl+W |
|
|
Help |
About |
|
|
|
|
Глядя на таблицу, можно сделать следующие выводы для нашего приложения:
Не все задачи имеют библиотечные команды и часть команд придется создать вручную (такие команды называются пользовательскими или настраиваемыми).
Не для всех задач нужно регулировать доступность источников, поэтому эти задачи можно оставить как есть, ничего не меняя, поскольку они у нас работают нормально.
Задачи, которые не имеют библиотечных команд, не требуют регулирования доступности, поэтому их можно оставить как есть и не создавать для них команды. Но мы все-таки их создадим, для тренировки.
Встроенные жесты библиотечных команд и наши жесты совпадают, мы их так подгадали, поэтому, для тренировки, в задачах, к которым мы применим команды, наши жесты можно удалить (а они заменятся на встроенные)
Недостающие команды нужно создавать в процедурном коде. А вот подключать все команды к источникам и связывать с коллекцией CommandBindings окна, пять же для тренировки, будем и в разметке, и в процедурном коде.
Еще раз выпишем те задачи, которые мы будем реализовывать с помощью команд
План задач, которые предстоит реализовать командами |
||||||
Где присоединить к источнику? |
Где привязать к окну? |
Задача |
Библиотечная команда |
Alias (псевдоним) |
Жесты |
Рег? |
Разметка |
Разметка |
Save |
Save |
SaveCommand |
Ctrl+S |
Да |
Разметка |
Разметка |
Page Setup |
|
PageSetupCommand |
|
Нет |
Разметка |
Разметка |
Undo |
Undo |
UndoCommand |
Ctrl+Z |
Да |
Разметка |
Код |
Redo |
Redo |
RedoCommand |
Ctrl+Y |
Да |
Разметка |
Код |
Cut |
Cut |
CutCommand |
Ctrl+X |
Да |
Разметка |
Код |
Copy |
Copy |
CopyCommand |
Ctrl+C |
Да |
Код |
Разметка |
Paste |
Paste |
PasteCommand |
Ctrl+V |
Да |
Код |
Разметка |
Delete |
Delete |
DeleteCommand |
Del |
Да |
Код |
Разметка |
Find Next |
|
FindNextCommand |
F3 |
Да |
Код |
Код |
Replace |
Replace |
ReplaceCommand |
Ctrl+H |
Да |
Код |
Код |
Go To |
|
GoToCommand |
Ctrl+G |
Нет |
Код |
Код |
Select All |
SelectAll |
SelectAllCommand |
Ctrl+A |
Да |
Мы выбрали 12 задач, которые хотим реализовать с помощью команд. Эта табличка будет нашим планом для дальнейшей работы.
