- •Лабораторная работа: События и команды в 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. Разработка простого блокнота с использованием механизма команд
- •Создание нового проекта из копии существующего
- •Краткий анализ задачи
- •Создание и привязка команд
- •Реализация логики доступности источников команд
- •Отображение позиции курсора в строке состояния
Размещение вариантов заголовков окна в ресурсах приложения
В коде вспомогательных функций используется словарь ресурсов приложения, которые мы сейчас определим.
Откройте файл разметки App.xaml и дополните его определением ресурсов для хранения неизменяемой части заголовка окна. Областью видимости этих ресурсов будет все приложение
<Application x:Class="Notepad1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml">
<Application.Resources>
<String xmlns="clr-namespace:System;assembly=Mscorlib" x:Key="ApplicationTitle1">
Title="Window1: Управление состоянием источников команд"
</String>
<String xmlns="clr-namespace:System;assembly=Mscorlib" x:Key="ApplicationTitle2">
Title="Window2: Управление состоянием источников команд"
</String>
</Application.Resources>
</Application>
Создание заготовок обработчиков
Будем мы использовать механизм команд WPF или нет, но без событий и их обработчиков никак не обойтись. Начнем с того факта, что для решения наших задач можно создать обработчики с одинаковой сигнатурой, определяемой делегатом пространства имен System.Windows:
public delegate void RoutedEventHandler(object sender, RoutedEventArgs e)
Имена обработчикам будем присваивать в соответствии с решаемой ими задачей. Обработчики создадим вручную и их необязательно сразу присоединять к событиям источников, поскольку неприсоединенные обработчики будут считаться обычными методами класса. Наиболее полно все задачи представлены в главном меню приложения, поэтому для каждой из них нужно создать свою группу обработчиков. Выполним все это по порядку, размещая группы обработчиков в соответствующих частях класса Window1.
Добавьте в часть класса Window1, расположенную в файле File.cs, следующие пустые обработчики по количеству задач меню в разделе File
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Notepad1
{
partial class Window1
{
//------------------------------------------------------
//
// Обработчики источников задач File
//
//------------------------------------------------------
private void NewOnExecute(object sender, RoutedEventArgs e)
{
}
private void OpenOnExecute(object sender, RoutedEventArgs e)
{
}
private void SaveOnExecute(object sender, RoutedEventArgs e)
{
}
private void SaveAsOnExecute(object sender, RoutedEventArgs e)
{
}
private void PageSetupOnExecute(object sender, RoutedEventArgs e)
{
}
private void PrintPreviewOnExecute(object sender, RoutedEventArgs e)
{
}
private void PrintOnExecute(object sender, RoutedEventArgs e)
{
}
private void ExitOnExecute(object sender, RoutedEventArgs e)
{
}
}
}
Добавьте в часть класса Window1, расположенную в файле Edit.cs, следующие пустые обработчики по количеству задач меню в разделе Edit
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Notepad1
{
partial class Window1
{
//------------------------------------------------------
//
// Обработчики источников задач Edit
//
//------------------------------------------------------
private void UndoOnExecute(object sender, RoutedEventArgs e)
{
}
private void RedoOnExecute(object sender, RoutedEventArgs e)
{
}
private void CutOnExecute(object sender, RoutedEventArgs e)
{
}
private void CopyOnExecute(object sender, RoutedEventArgs e)
{
}
private void PasteOnExecute(object sender, RoutedEventArgs e)
{
}
private void DeleteOnExecute(object sender, RoutedEventArgs e)
{
}
private void FindOnExecute(object sender, RoutedEventArgs e)
{
}
private void FindNextOnExecute(object sender, RoutedEventArgs e)
{
}
private void ReplaceOnExecute(object sender, RoutedEventArgs e)
{
}
private void GoToOnExecute(object sender, RoutedEventArgs e)
{
}
private void SelectAllOnExecute(object sender, RoutedEventArgs e)
{
}
}
}
Добавьте в часть класса Window1, расположенную в файле Other.cs, следующие пустые обработчики по количеству задач меню в оставшихся разделах
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Notepad1
{
partial class Window1
{
//------------------------------------------------------
//
// Прочие обработчики
//
//------------------------------------------------------
private void FontOnExecute(object sender, RoutedEventArgs e)
{
}
private void WordWrapOnExecute(object sender, RoutedEventArgs e)
{
}
private void AboutOnExecute(object sender, RoutedEventArgs e)
{
}
}
}
Запустите приложение и убедитесь, что ошибок компиляции нет, но функциональности от выполненной нами работы в нем пока не прибавилось
