- •Лабораторная работа: События и команды в 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 можно вызывать и напрямую, а необязательно присоединять к источникам. Правда, это будет уже извращение и сам механизм команд будет использоваться только частично. При таком подходе придется реагировать на состояния источников и на возможность выполнения команды самостоятельным кодом. Но знать о существовании такой возможности программисту следует. Покажем это...
Добавьте к интерфейсу окна еще четыре кнопки так
<Window x:Class="BindingCommandsXAML.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1: Декларативная привязка" Height="300" Width="300"
Background="#FFD4D0C8"
WindowStartupLocation="CenterScreen"
>
<Window.CommandBindings>
<CommandBinding
Command="ApplicationCommands.Open"
Executed="OpenCommand_Executed">
</CommandBinding>
<CommandBinding
Command="ApplicationCommands.Save"
Executed="SaveCommand_Executed">
</CommandBinding>
</Window.CommandBindings>
<StackPanel Margin="5">
<Menu>
<MenuItem Header="_File">
<MenuItem Command="ApplicationCommands.Open" />
<MenuItem Command="ApplicationCommands.Save" />
</MenuItem>
</Menu>
<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}"
/>
<Button Margin="5" Padding="5" Focusable="False"
Content="DirectCommandsOpen"
Click="directCommandsOpen_Click"
/>
<Button Margin="5" Padding="5" Focusable="False"
Content="DirectCommandsSave"
Click="directCommandsSave_Click"
/>
<Button Margin="5" Padding="5" Focusable="False"
Content="DirectBindingsOpen"
Click="directBindingsOpen_Click"
/>
<Button Margin="5" Padding="5" Focusable="False"
Content="DirectBindingsSave"
Click="directBindingsSave_Click"
/>
</StackPanel>
</Window>
Вызовите контекстное меню для записей события Click и командой Navigate to Event Handler создайте четыре обработчика в файле процедурного кода
Заполните обработчики следующим кодом прямого вызова команд
private void directCommandsOpen_Click(object sender, RoutedEventArgs e)
{
ApplicationCommands.Open.Execute(null, this);
}
private void directCommandsSave_Click(object sender, RoutedEventArgs e)
{
ApplicationCommands.Save.Execute(null, this);
}
private void directBindingsOpen_Click(object sender, RoutedEventArgs e)
{
this.CommandBindings[0].Command.Execute(null);
}
private void directBindingsSave_Click(object sender, RoutedEventArgs e)
{
this.CommandBindings[1].Command.Execute(null);
}
В прямых вызовах двух первых обработчиков начальный параметр метода Execute() ожидает объект с дополнительной информацией, который будет передан на обработчик команды. Второй параметр принимает целевой элемент привязки команды с возможностями интерфейса IInputElement, который будет прослушивать команду и вызывать обработчик. В нашем случае это объект окна. Два следующих обработчика используют вызовы команд из коллекции прослушивающего элемента (окна), привязанные к нему в разметке.
Запустите приложение и убедитесь, что добавленные кнопки инициируют прямой вызов команд
