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

Чтобы более-менее завершить наше блокнотоподобное приложение, немного подукрасим его. Добавим в строку состояния, которая у нас имеет имя 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 считаем продолжением одной и той же строки и позицию каретки отображаем как в длинной незавернутой строке.

 








Дата добавления: 2015-04-15; просмотров: 1165;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.004 сек.