- •Лабораторная работа: События и команды в 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. Разработка простого блокнота с использованием механизма команд
- •Создание нового проекта из копии существующего
- •Краткий анализ задачи
- •Создание и привязка команд
- •Реализация логики доступности источников команд
- •Отображение позиции курсора в строке состояния
Подключение функциональности Go To к основному окну
Подключите диалоговое окно Go To к обработчику главного окна в файле Edit.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
{
//------------------------------------------------------
//
// Обработчики источников задач Edit
//
//------------------------------------------------------
private void UndoOnExecute(object sender, RoutedEventArgs e)
{
txtBox1.Undo();
}
private void RedoOnExecute(object sender, RoutedEventArgs e)
{
txtBox1.Redo();
}
private void CutOnExecute(object sender, RoutedEventArgs e)
{
txtBox1.Cut();
// Вариант
//Clipboard.SetText(txtBox1.SelectedText);
//txtBox1.SelectedText = "";
}
private void CopyOnExecute(object sender, RoutedEventArgs e)
{
txtBox1.Copy();
// Вариант
//Clipboard.SetText(txtBox1.SelectedText);
}
private void PasteOnExecute(object sender, RoutedEventArgs e)
{
// Если в буфере содержатся данные текстового формата
if (Clipboard.ContainsText())
txtBox1.Paste();
}
private void DeleteOnExecute(object sender, RoutedEventArgs e)
{
txtBox1.SelectedText = String.Empty;
}
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();
}
#region Задача Go To
private void GoToOnExecute(object sender, RoutedEventArgs e)
{
GoToDialog dlg = new GoToDialog();
dlg.Owner = this;
dlg.LineNumber = CaretLineNumber;
/***** Врет для завернутых строк Word Wrap! ******************
dlg.MaxLineNumber = txtBox1.LineCount;
/*************************************************************/
dlg.MaxLineNumber = GetMaxNumber();
// Параметры анонимного обработчика "от фонаря",
// все равно не используем
dlg.GotoActivate += delegate(object sender2, EventArgs e2)
{
// Заполняем текстовое поле диалога текущей строкой
dlg.LineNumber = CaretLineNumber;
};
// Запускаем в модальном режиме. Ждет и закрывается
if (dlg.ShowDialog() == true)
{
// Устанавливаем каретку (курсор) в начало строки
CaretLineNumber = dlg.LineNumber;
}
txtBox1.Focus();
}
int GetMaxNumber()
{
int count = 0;
int pos = 0;
int caretPos = txtBox1.Text.Length + 1;
while (pos < caretPos)
{
count++; // Счетчик строк
pos = txtBox1.Text.IndexOf("\r\n", pos);
if (pos != -1) // Нашли очередную пару
pos += 2; // Сдвигаемся правее найденных
else
break;// Больше нет
}
return count;
}
int CaretLineNumber
{
get
{
/***** Врет для завернутых строк Word Wrap! ******************
int caretPos = txtBox1.SelectionStart;
return (txtBox1.GetLineIndexFromCharacterIndex(caretPos) + 1);
/*************************************************************/
int count = 0;
int pos = 0;
int caretPos = txtBox1.SelectionStart + 1; //txtBox1.CaretIndex
while (pos < caretPos)
{
count++; // Счетчик строк
pos = txtBox1.Text.IndexOf("\r\n", pos);// \n - перевод строки
if (pos != -1) // Нашли очередную пару
pos += 2; // Сдвигаемся правее найденных
else
break;// Больше нет
}
return count;
}
set
{
value = value - 1;
int count = 0;
int pos = 0;
while (count < value) // Пока не превышает заданную
{
pos = txtBox1.Text.IndexOf("\r\n", pos);// \r - возврат каретки
if (pos != -1) // Нашли очередную пару
{
count++; // Счетчик строк
pos += 2; // Сдвигаемся правее найденных
}
else
{
pos = txtBox1.Text.Length;
break;
}
}
// Позиционируем курсор
txtBox1.SelectionStart = pos;
txtBox1.SelectionLength = 0;
}
}
#endregion Задача Go To
private void SelectAllOnExecute(object sender, RoutedEventArgs e)
{
txtBox1.SelectAll();
}
}
}
Запустите проект и испытайте введенную функциональность Go To. Разберитесь с кодом
