Как преобразовать текст в гиперссылку в WPF RichTextBox FlowDocument? - PullRequest
1 голос
/ 06 июля 2010

Я пытаюсь превратить какой-то текст в гиперссылку, когда пользователь печатает в WPF RichTextBox.

Моя первая попытка заключается в запуске этого кода при каждом вводе ключа:

Regex r = new Regex("[A-Z]{3}");
FlowDocument doc = this.inputBox.Document;            
String text = new TextRange(doc.ContentStart, doc.ContentEnd).Text;

foreach (Match m in r.Matches(text))
{
    TextPointer start = doc.ContentStart.GetPositionAtOffset(m.Index + 2);                
    TextPointer end = doc.ContentStart.GetPositionAtOffset(m.Index + m.Length + 2);
    Hyperlink sp = new Hyperlink(start, end);
}

Это работает правильно, когда пользователь вводит последовательность из трех заглавных букв, ABC, но создание гиперссылки завершается ошибкой, за исключением того, что вводится вторая последовательность.Глядя на переменную во время отладки, кажется, что два TextPointer продолжают указывать на первую последовательность.

1 Ответ

0 голосов
/ 19 февраля 2011

Я думаю, что ваша проблема может быть связана с распространенным неправильным пониманием того, что делает метод GetPositionAtOffset ().

GetPositionAtOffset возвращает смещение в разметке FlowDocument , а не смещение видимого текстового символа .

После вставки вашей первой гиперссылки FlowDocument содержитоткрывающие и закрывающие теги:

<Hyperlink>the_regex_match</Hyperlink>

Это означает, что смещения FlowDocument больше не совпадают с индексами символов в виде простого текста, возвращенными совпадением RegEx.

...