- •Лабораторная работа: События и команды в 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. Разработка простого блокнота с использованием механизма команд
- •Создание нового проекта из копии существующего
- •Краткий анализ задачи
- •Создание и привязка команд
- •Реализация логики доступности источников команд
- •Отображение позиции курсора в строке состояния
Подключение функциональности Find and Replace к источникам задач
Теперь нам осталась самая малость - подключить готовый код функциональности Find and Replace к обработчикам интерфейсных элементов в основном окне и испытать его работу. Заготовки обработчиков мы создавали ранее и они находятся в файле Edit.cs.
Добавьте в соответствующие обработчики файла Edit.cs следующий код
private void FindOnExecute(object sender, RoutedEventArgs e)
{
CreateDialog();
}
private void FindNextOnExecute(object sender, RoutedEventArgs e)
{
if (_dlg == null)
CreateDialog();
else
FindNextExec();
}
private void ReplaceOnExecute(object sender, RoutedEventArgs e)
{
if (_dlg == null)
{
CreateDialog();
_dlg.ShowReplace = true;
}
else if (_dlg.ShowReplace == false)
_dlg.ShowReplace = true;
else
ReplaceExec();
}
private void GoToOnExecute(object sender, RoutedEventArgs e)
{
}
Запустите проект Notepad1 и испытайте функциональность Find and Replace. Разберитесь с кодом
Начальный интерфейс диалогового окна для задачи Replace будет таким
Когда диалоговое окно Find and Replace создано, оно размещается поверх своего родителя. Кнопки диалогового окна возбуждают события, которые обрабатываются кодом основного окна, содержащего текст. Тот же самый код может вызываться и в обработчиках основного окна, если пользователь управляет через интерфейсные элементы основного окна. Этот подход чем-то напоминает автомобиль с дублирующими педалями.
На панели инструментов осталось незадействованным текстовое поле поиска, обозначенное в разметке как
<ToolBar Header="Find:">
<TextBox Width="100" />
<Button Name="btnFind" Click="FindOnExecute" Width="23" Content="{StaticResource iconFind}" />
</ToolBar>
Я оставил его в покое (надоело), попробуйте сами, если хотите, использовать его в коде, но для этого прежде всего ему нужно присвоить имя, например, txtFind. Ну а лучше - пусть болтается для солидности.
Следующим шагом реализуем последнюю задачу раздела Edit в меню нашего приложения - Go To... Как видно из запланированного (опрометчиво) нами многоточия после названия задачи, это будет опять связано с разработкой диалогового окна. Причем, это окно должно быть модальным, потому что выполняет одноразовую задачу.
Разработка диалогового окна Go To
В панели Solution Explorer выделите узел проекта Notepad1 и добавьте командой Project/Add Window новое окно WPF с именем GoToDialog.xaml
увеличить изображение
>
Заполните файл GoToDialog.xaml следующей разметкой
<Window x:Class="Notepad1.GoToDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
SizeToContent="WidthAndHeight"
WindowStartupLocation="CenterOwner"
ShowInTaskbar="false"
Title="Go To Line"
ResizeMode="NoResize"
Activated="OnActivated"
>
<StackPanel
Background="{StaticResource DialogBackgroundBrush}"
>
<StackPanel
Orientation="Vertical"
Margin="5"
>
<Label
Name="_rangeNumber"
Margin="0 0 8 3"
VerticalAlignment="Bottom"
Content="_Line number" />
<TextBox
Name="_lineNumberTextBox"
TabIndex="0"
MinWidth="220"
Margin="5,0" />
</StackPanel>
<StackPanel
Orientation="Horizontal"
Margin="5,0,5,5" HorizontalAlignment="Right">
<Button
Click="OkClicked"
IsDefault="true"
MinWidth="75"
MinHeight="23"
Content="OK" />
<Button
Click="CancelClicked"
IsCancel="true"
Margin="15 0 5 0"
MinWidth="75"
MinHeight="23"
Content="Cancel" />
</StackPanel>
</StackPanel>
</Window>
Представление окна в графическом конструкторе по данной разметке будет таким
Обратите внимание, что для кнопки OK свойство IsDefault="true", чтобы пользователь мог закрыть окно клавишей Enter, а для второй кнопки IsCancel=true - чтобы выйти по клавише Esc.
Пройдитесь по разметке и командой Navigate to Event Handler контекстного меню для записей событий создайте заготовки обработчиков в файле процедурного кода GoToDialog.xaml.cs
