Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WPF-практика 5 События и команды.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.21 Mб
Скачать

Отображение позиции курсора в строке состояния

Чтобы более-менее завершить наше блокнотоподобное приложение, немного подукрасим его. Добавим в строку состояния, которая у нас имеет имя statusBar, вывод информации о положении курсора. Опять же, постараемся минимально вмешиваться в уже созданный код. Для этого все решение разместим в отдельном файле.

  • Выделите узел текущего проекта и добавьте командой Project/Add New Item новый файл Code File с именем CaretPosition.cs

увеличить изображение

  • Заполните файл CaretPosition.cs следующим кодом

using System;

using System.Windows;

using System.Windows.Controls.Primitives;

using System.Windows.Controls;

namespace Notepad2

{

// Часть класса главного окна

partial class Window1

{

// Создаем экземпляр и регистрируем обработчики

CaretPosition caretPosition;

private void CreateCaretPosition()

{

// Отображение в StatusBar номера строки и столбца

caretPosition = new CaretPosition();// Создаем объект

caretPosition.TxtBox = txtBox1; // Присоединяем TextBox

// Дополняем StatusBar

this.statusBar.Items.Add(

new System.Windows.Controls.Separator());

this.statusBar.Items.Add(caretPosition.StrLineCol);

// Увековечиваем себя!

this.statusBar.Items.Insert(0, new System.Windows.Controls.Separator());

this.statusBar.Items.Insert(0, "Снетков В.М.");

// Регистрируем обработчик события перемещения каретки

txtBox1.SelectionChanged +=

new RoutedEventHandler(txtBox1_SelectionChanged);

}

// Обработчик инициирует вычисление и отрисовку нового положения

void txtBox1_SelectionChanged(object sender, RoutedEventArgs e)

{

caretPosition.CaretChanged();

}

}

class CaretPosition

{

// Закрытые поля

StatusBarItem strLineCol = new StatusBarItem();

TextBox txtBox = new TextBox();

// Открытые свойства

// Для добавления в строку состояния клиента

public StatusBarItem StrLineCol // Папа '-->'

{

// Только для чтения

get { return strLineCol; }

}

// Для присоединения к TextBox клиента

public TextBox TxtBox // Мама '>--'

{

// Только для записи

set { txtBox = value; }

}

// Вычисляет номер строки

int GetLine()

{

int count = 0;

int pos = 0;

int caretPos = txtBox.SelectionStart + 1; //txtBox1.CaretIndex

while (pos < caretPos)

{

count++; // Счетчик строк

pos = txtBox.Text.IndexOf("\r\n", pos);// \n - перевод строки

if (pos != -1) // Нашли очередную пару

pos += 2; // Сдвигаемся правее найденных

else

break;// Больше нет

}

return count;

}

public void CaretChanged()

{

if (!txtBox.IsFocused)

return;

int posChar = txtBox.CaretIndex;

int line = GetLine();

int column = posChar - txtBox.GetCharacterIndexFromLineIndex(line - 1) + 1;

// Обновляем в строке состояния

strLineCol.Content = String.Format(" Ln {0} \t Col {1}", line, column);

}

}

}

  • В файле Window1.xaml.cs добавьте в конструктор класса Window1 код вызова функции CreateCaretPosition()

public Window1()

{

InitializeComponent();

// Создание жестов

this.CreateGestures();

// Дополнительные обработчики в файле EnabledControls.cs

AdditionalHandlers();

// Отображение в StatusBar номера строки и столбца

// Функция находится в файле CaretPosition.cs

CreateCaretPosition();

}

  • Запустите приложение - номера строк и столбцов отображаются. Поэкспериментируйте с функциональностью, разберитесь с кодом

Обратите внимание, как мы из вновь созданного класса CaretPosition подключились (мама) через свойство TxtBox к существующему объект txtBox1 окна и извлекаем нужную информацию уже в новом классе. И как созданный в новом классе элемент строки состояния подключили (папа) обратно к окну. Получился как бы канал связи, по которому информация из объекта txtBox1 окна поступает в экземпляр нового класса, а затем в обработанном виде возвращается обратно в окно для отображения в объекте statusBar.

Снимок блокнота на данный момент будет таким

увеличить изображение

Видно, что строки и столбцы теперь отображаются в строке состояния, как и ФИО. Имейте ввиду, что мы изначально приняли тезис, что завернутые строки Word Wrap считаем продолжением одной и той же строки и позицию каретки отображаем как в длинной незавернутой строке.