Я совершенно не знаком с FlowDocuments и не могу найти нигде.Как использовать TextRange для замены букв пробега?
Я создал TextBlock, где каждая строка Inline представляет собой пробег, содержащий ровно одно слово. (Inlines создаются в коде). Затем я использую TextRange для замены некоторых букв в Run. Но вместо замены символов Run, TextRange, кажется, пуст Run и добавляет буквы к предыдущему Run.
(Важно, чтобы сохранить первоначальную структуру TextBlock с исходными объектами Run как я событие привязано к ним.)
Что я делаю неправильно? И что на самом деле делает TextRange.Text = text?
Любая помощь приветствуется.
Пример
---Before textrange--
<Run>
6||perrla
</Run>
<Run>
1|| **NOTE THIS IS A SPACE IN THE RUN
</Run>
<Run>
5||nc/at
</Run>
--After textrange ---
<Run> **NOTE THE EMPTY RUN
</Run>
<Run>
5|| test **NOTE HOW TEST IS APPENDED TO THE SPACE OF THE PREVIOUS RUN
</Run>
<Run>
5||nc/at
</Run>
Код, который производят вышеуказанные результаты:
string text = nw.Replace("\0", string.Empty);
TextPointer s = StartInlineElement.GetInsertionPosition(LogicalDirection.Forward);
TextPointer start = s.GetPositionAtOffset(StartIndex);
TextPointer end = start.GetPositionAtOffset(Text.Length);
var y = start.GetAdjacentElement(LogicalDirection.Backward);
if (y != null)
{
do
{
GetXaml((TextElement)y);
y = (y as Run).PreviousInline;
} while (y != null);
}
THIS IS WRONG -- IT EMPTIES THE RUN AND APPENDS TO THE RUN
BEFORE IT.
TextRange tr = new TextRange(start, end);
tr.Text = text;
y = start.GetAdjacentElement(LogicalDirection.Forward);
if (y != null)
{
do
{
GetXaml((TextElement)y);
y = (y as Run).PreviousInline;
} while (y != null);
}
}
GetXaml от Microsoft (https://msdn.microsoft.com/en-us/library/system.windows.documents.textpointercontext(v=vs.110).aspx), который я slighltly изменен, чтобы:
void GetXaml(TextElement element)
{
// Position a "navigator" pointer before the opening tag of the element.
TextPointer navigator = element.ElementStart;
while (navigator.CompareTo(element.ElementEnd) < 0)
{
switch (navigator.GetPointerContext(LogicalDirection.Forward))
{
case TextPointerContext.ElementStart:
// Output opening tag of a TextElement
Console.WriteLine(String.Format("<{0}>", navigator.GetAdjacentElement(LogicalDirection.Forward).GetType().Name));
break;
case TextPointerContext.ElementEnd:
// Output closing tag of a TextElement
Console.WriteLine(String.Format("</{0}>", navigator.GetAdjacentElement(LogicalDirection.Forward).GetType().Name));
break;
case TextPointerContext.EmbeddedElement:
// Output simple tag for embedded element
Console.WriteLine(String.Format("<{0}>", navigator.GetAdjacentElement(LogicalDirection.Forward).GetType().Name));
break;
case TextPointerContext.Text:
// Output the text content of this text run
Console.WriteLine(String.Format("{0}||{1}", navigator.GetTextRunLength(LogicalDirection.Forward),
navigator.GetTextInRun(LogicalDirection.Forward)));
break;
}
// Advance the naviagtor to the next context position.
navigator = navigator.GetNextContextPosition(LogicalDirection.Forward);
}
}