2

ユーザーが 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 のシーケンスを最初に入力したときに正しく実行されますが、2 番目のシーケンスを入力すると、例外が発生してハイパーリンクの作成が失敗します。デバッグ中に変数を見ると、2 つの TextPointer が最初のシーケンスを指し続けているように見えます。

4

1 に答える 1

0

あなたの問題は、 GetPositionAtOffset() メソッドが何をするかについてのよくある誤解が原因であると思います。

GetPositionAtOffset は、可視テキスト文字オフセットではなく、FlowDocument マークアップ内のオフセットを返します。

最初のハイパーリンクを挿入すると、FlowDocument には開始タグと終了タグが含まれます。

<Hyperlink>the_regex_match</Hyperlink>

これは、FlowDocument オフセットが、RegEx 一致によって返されるプレーン テキストの文字インデックスと一致しなくなったことを意味します。

于 2011-02-19T00:31:18.437 に答える