Главная » WPF » Элемент RichTextBox

0

Работу с элементом RichTextBox следует начать со свойства Document. Этот элемент позволяет редактировать один объект типа FlowDocument. Пользуясь объектной мо# делью текста, мы можем инициализировать RichTextBox форматированным текстом:

<Window … Title=’RichTextBox’>

<RichTextBox Name=’_rtb’>

<FlowDocument FontSize=’24’>

<Paragraph>Hello</Paragraph>

</FlowDocument>

</RichTextBox>

</Window>

Во время  выполнения программы  мы получаем  полнофункциональный ре#

дактор (рис. 3.28), который поддерживает все стандартные  команды.

Чтобы эффективно работать с элементом RichTextBox, нужно ясно понимать, что такое каре и выделенный фрагмент. Каре – это мигающая  вертикальная ли# ния, которая представляет текущую позицию вставки и в общем случае является началом  выделенного фрагмента. Для  отслеживания позиций  каре и выделен# ных фрагментов используются три объекта TextPointer: CaretPosition, Selection.Start и Selection.End.

Рис. 3.31. Некорректно реализованный поиск

При работе с элементом RichTextBox смещения  важны, потому что их нужно учитывать  при перемещении  каре или выделенного  фрагмента.  При первой  по# пытке  написать  простой  метод поиска  для  RichTextBox я упустил  это из виду (рис. 3.31):

<!— RichTextBoxWork.xaml —>

<Window x:Class=’EssentialWPF.RichTextBoxWork’ xmlns=’http://schemas.microsoft.com/winfx/2006/xaml/presentation’ xmlns:x=’http://schemas.microsoft.com/winfx/2006/xaml’ Title=’RichTextBox’

<DockPanel>

<WrapPanel DockPanel.Dock=’Top’ >

<TextBox Width=’100’ Name=’_toFind’ />

<Button Click=’Find’>Find</Button>

<TextBlock Name=’_offset’ />

</WrapPanel>

<RichTextBox Name=’_rtb’ />

</DockPanel>

</Window>

// richtextboxwork.xaml.cs

public partial class RichTextBoxWork : Window {

public RichTextBoxWork() { InitializeComponent();

}

// Это код неправилен!

//

void Find(object sender, RoutedEventArgs e) { FlowDocument doc = _rtb.Document;

string text = new TextRange(doc.ContentStart, doc.ContentEnd).Text;

int index = text.IndexOf(_toFind.Text); TextPointer start =

doc.ContentStart.GetPositionAtOffset(index); TextPointer end =

start.GetPositionAtOffset(_toFind.Text.Length);

_rtb.Selection.Select(start, end);

}

}

В  этом  примере   выделения  никогда   не  будет  из#за  начальных   лексем

элементов Section и Run. Чтобы исправить ошибку, нужно перемещать указатель текста по документу во время поиска:

void Find(object sender, RoutedEventArgs e) { FlowDocument doc = _rtb.Document; TextPointer cur = doc.ContentStart;

while (cur != null) {

TextPointer end = cur.GetPositionAtOffset(_toFind.Text.Length);

if (end != null) {

TextRange test = new TextRange(cur, end);

if (test.Text == _toFind.Text) {

_rtb.Selection.Select(test.Start, test.End);

break;

}

}

cur = cur.GetNextInsertionPosition(LogicalDirection.Forward);

}

}

И последнее,  о чем надо знать при работе с элементом  управления RichTextBox, – это понятие отмены операции. Отменить (и повторить) можно лю# бую операцию. Единицы  отмены также организованы иерархически, то есть мож# но создать  группу  операций,  которая  будут  считаться  одним  изменением.  Для этой цели предназначены методы BeginChange/EndChange или DeclareChangeBlock; но в общем  случае  DeclareChangeBlock предпочтительнее, так как он возвращает  объект IDisposable, который можно заключить в блок using.

Рассмотрим следующую  программу  для  добавления   в  обогащенный   текст двух абзацев. Если  запустить  ее, то для удаления  обоих абзацев, пользователю придется  дважды выполнить отмену:

_rtb.Document.Blocks.Add(new Paragraph(new Run(«One»)));

_rtb.Document.Blocks.Add(new Paragraph(new Run(«Two»)));

Вместо  этого  можно  заключить   все  программные   изменения документа  в блок, который будет считаться  одной единицей отмены:

using (_rtb.DeclareChangeBlock(«add two»)) {

_rtb.Document.Blocks.Add(new Paragraph(new Run(«One»)));

_rtb.Document.Blocks.Add(new Paragraph(new Run(«Two»)));

}

При внесении изменений в содержимое элемента RichTextBox лучше оберты# вать их в объект DeclareChangeBlock, чтобы пользователю было проще в случае чего выполнить отмену всех операций разом.

Элемент TextBox

Элемент TextBox  предлагает  упрощенную  реализацию большинства возмож# ностей RichTextBox. Так как TextBox  поддерживает только один формат, то вы# деленный фрагмент можно описать двумя целыми числами – смещениями от на# чала текста (начальная и конечная  лексемы не нужны), а сам текст – одним стро# ковым значением.  В довесок к этому упрощению,  TextBox  предлагает  и некото# рые дополнительные операции, например, возможность ограничить  длину текста или изменять  регистр букв.

Источник: К. Андерсон  Основы  Windows Presentation Foundation. Пер. с англ. А. Слинкина — М.: ДМК Пресс, 2008 — 432 с.: ил.

По теме:

  • Комментарии