Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.