- •Лабораторная работа: События и команды в 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. Разработка простого блокнота с использованием механизма команд
- •Создание нового проекта из копии существующего
- •Краткий анализ задачи
- •Создание и привязка команд
- •Реализация логики доступности источников команд
- •Отображение позиции курсора в строке состояния
Реализация обработчиков раздела меню File
Выделите корень проекта Notepad1 и командой Project/Add Reference подключите сборки System.Windows.Forms.dll и System.Drawing.dll
Модифицируйте код файла File.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;
// Для сборок: System.Windows.Forms.dll, System.Drawing.dll
using sdp = System.Drawing.Printing;// Псевдоним пространства имен
using swf = System.Windows.Forms; // Псевдоним пространства имен
using PageSetupDialog = System.Windows.Forms.PageSetupDialog;// Псевдоним класса
namespace Notepad1
{
partial class Window1
{
//------------------------------------------------------
//
// Обработчики источников задач File
//
//------------------------------------------------------
private void NewOnExecute(object sender, RoutedEventArgs e)
{
// Пользователь передумал или была ошибка записи изменений
if (!CheckModifiedAndSaveIt())
return;
// Изменений нет или они успешно сохранены
//txtBox1.Text = String.Empty; // Вариант I
//txtBox1.Text = ""; // Вариант II
txtBox1.Clear(); // Вариант III
strLoadedFile = null;
IsModified = false;
UpdateTitle();
txtBox1.Focus();
}
private void OpenOnExecute(object sender, RoutedEventArgs e)
{
if(DisplayOpenDialog())
txtBox1.CaretIndex = txtBox1.Text.Length;// Курсор в конец
txtBox1.Focus();// Передача фокуса
}
private void SaveOnExecute(object sender, RoutedEventArgs e)
{
if (String.IsNullOrEmpty(strLoadedFile))
DisplaySaveDialog(String.Empty);
else
SaveFile(strLoadedFile);
txtBox1.Focus();
}
private void SaveAsOnExecute(object sender, RoutedEventArgs e)
{
DisplaySaveDialog(strLoadedFile);
txtBox1.Focus();
}
private void PageSetupOnExecute(object sender, RoutedEventArgs e)
{
// Ограничемся только показом окна Windows Forms
PageSetupDialog dlg = new PageSetupDialog();
// Без настроек не работает. Зададим хотя бы по умолчанию
dlg.PageSettings = new sdp.PageSettings();
dlg.PrinterSettings = new sdp.PrinterSettings();
dlg.ShowDialog();
txtBox1.Focus();
}
private void PrintPreviewOnExecute(object sender, RoutedEventArgs e)
{
sdp.PrintDocument document = new sdp.PrintDocument();
document.DocumentName = strLoadedFile;
swf.PrintPreviewDialog dlg = new swf.PrintPreviewDialog();
dlg.Document = document;
dlg.UseAntiAlias = true;// Включить сглаживание
dlg.ShowDialog();
txtBox1.Focus();
}
private void PrintOnExecute(object sender, RoutedEventArgs e)
{
sdp.PrintDocument document = new sdp.PrintDocument();
document.DocumentName = strLoadedFile;
swf.PrintDialog dlg = new swf.PrintDialog();
dlg.Document = document;
dlg.ShowDialog();
txtBox1.Focus();
}
private void ExitOnExecute(object sender, RoutedEventArgs e)
{
if (!CheckModifiedAndSaveIt())
return; // Пользователь передумал выходить
Close();
}
}
}
Обратите внимание на использование псевдонимов пространств имен добавленных к проекту библиотечных сборок. Еще раз вспомним, что при совместном применении пользовательских интерфейсов WPF и Windows Forms имена типов одной из технологий следует прописывать полностью или использовать псевдонимы. Иначе в коде могут возникнуть конфликты имен, а если компилятор их не обнаружит, то и серьезные ошибки времени выполнения.
Запустите приложение, испытайте правильность функционирования обработчиков, изучите их код
