如何在WPF RichTextBox FlowDocument中将文本转换为超链接?

时间:2010-07-06 11:23:04

标签: c# wpf richtextbox hyperlink flowdocument

我正在尝试在用户输入WPF RichTextBox时将某些文本转换为超链接。

我的第一次尝试涉及在每个KeyUp上运行此代码:

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);
}

当用户第一次输入3个大写字母ABC序列时,这会正确运行,但是当输入第二个序列时,超链接创建失败并出现异常。在调试时查看变量,看起来两个TextPointers一直指向第一个序列。

1 个答案:

答案 0 :(得分:0)

我认为您的问题可能是由于对GetPositionAtOffset()方法的常见误解造成的。

GetPositionAtOffset返回FlowDocument标记中的偏移,而不是可见文本字符偏移

插入第一个超链接后,FlowDocument包含开始和结束标记:

<Hyperlink>the_regex_match</Hyperlink>

这意味着FlowDocument偏移不再与RegEx匹配返回的纯文本字符索引对齐。