- •Лабораторная работа: События и команды в 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. Разработка простого блокнота с использованием механизма команд
- •Создание нового проекта из копии существующего
- •Краткий анализ задачи
- •Создание и привязка команд
- •Реализация логики доступности источников команд
- •Отображение позиции курсора в строке состояния
Применение вложенных ресурсов
Для тренировки воспользуемся способом хранения и извлечения некоторых сообщений в ресурсах сборки.
В панели Solution Explorer вызовите контекстное меню для узла проекта и добавьте командой Add/New Item текстовый файл с любым именем (оставьте по умолчанию)
>
В панели Solution Explorer вызовите контекстное меню на созданном текстовом файле и командой Rename присвойте ему новое имя StringTable.ru-ru.resText
Первая часть имени может быть произвольной, а два остальных расширения нужно строго соблюсти. Одно означает культуру, а второе служебное для менеджера ресурсов.
В панели Solution Explorer выделите файл StringTable.ru-ru.resText и в панели Properties установите для него следующие директивы:
Заполните файл StringTable.ru-ru.resText следующими парами ключ=значение
GotoErrorDialogTitle=Go To Line Error
GotoErrorMsgFormat=Текстовое поле должно\nсодержать целое число
GotoErrorMsgEmpty=Введите число в текстовое поле
GotoErrorMsgRange=Выход за границы диапазона
Заполните файл GoToDialog.xaml.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.Shapes;
// Дополнительные подключения пространств имен
using System.Resources;
using System.Reflection;
namespace Notepad1
{
public partial class GoToDialog : Window
{
public GoToDialog()
{
InitializeComponent();
// Сохраняем первое значение Label
_rangeOrigin = _rangeNumber.Content.ToString();
}
// Объявляем событие для прослушивания в основном окне
public event EventHandler GotoActivate;
// Закрытые поля класса
int _lineNumber = 0;
int _maxLineNumber;
ResourceManager res =
new ResourceManager("Notepad1.StringTable",
Assembly.GetExecutingAssembly());
String _rangeOrigin;
// Свойства доступа
public int LineNumber
{
get { return _lineNumber; }
set
{
_lineNumber = value;
_lineNumberTextBox.Text = _lineNumber.ToString();
}
}
public int MaxLineNumber
{
get { return _maxLineNumber; }
set { _maxLineNumber = value; }
}
private void OnActivated(object sender, EventArgs e)
{
// Если существуют обработчики, инициируем событие
if (GotoActivate != null)
GotoActivate(this, EventArgs.Empty);
_rangeNumber.Content = _rangeOrigin +
String.Format(" (1 - {0}):", _maxLineNumber);
_lineNumberTextBox.Focus();
_lineNumberTextBox.SelectAll();// Выделяем содержимое
}
private void OkClicked(object sender, RoutedEventArgs e)
{
// Не закрывать диалог, пока есть ошибки
if (string.IsNullOrEmpty(_lineNumberTextBox.Text))
{
MessageBox.Show(res.GetString("GotoErrorMsgEmpty"),
res.GetString("GotoErrorDialogTitle"));
return;
}
if (!int.TryParse(_lineNumberTextBox.Text, out _lineNumber))
{
MessageBox.Show(res.GetString("GotoErrorMsgFormat"),
res.GetString("GotoErrorDialogTitle"));
return;
}
if (LineNumber > _maxLineNumber || LineNumber <= 0)
{
MessageBox.Show(res.GetString("GotoErrorMsgRange"),
res.GetString("GotoErrorDialogTitle"));
return;
}
this.DialogResult = true;
this.Close();
}
private void CancelClicked(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
this.Close();
}
}
}
Обратите внимание на то, как мы в коде извлекаем ресурсы, вложенные (Embedded) ранее в текстовый файл StringTable.ru-ru.resText.
