這使我瘋狂。我正在寫一個文本熒光筆,最終調用代碼:WPF RichTextBox似乎添加在隱藏的填充
TextPointer caret = textBox.CaretPosition;
TextPointer contentStart = textBox.Document.ContentStart;
TextPointer highlightStart = contentStart.GetPositionAtOffset(startPosition + 1, LogicalDirection.Forward);
TextPointer highlightEnd = contentStart.GetPositionAtOffset(endPosition + 2, LogicalDirection.Forward);
textBox.Selection.Select(highlightStart, highlightEnd);
textBox.Selection.ApplyPropertyValue(textElementProperty, value);
textBox.Selection.Select(caret, caret);
textBox.CaretPosition = caret;
實際的代碼本身工作正常....一次。問題是,一旦突出顯示,它就像RichTextBox
正在我的突出顯示中添加隱藏填充,這樣當我在文本上運行我的Regex
時,Regex
會返回正確的偏移量,但它不會正確映射到正確的字母在RichTextBox
。例如,如果我要突出顯示「狐狸」一詞,如:
快速棕色狐狸跳過懶惰的狗。
這個詞「狐狸」會被正確地強調了,但這時如果我要改變「狗」狐狸會出現這樣的:
敏捷的棕色狐狸躍過LAZ ÿFO牛。
除去第一「狐狸」但是將糾正後的版本,以便它讀取:
敏捷的棕色狗跳過了懶惰狐狸。
這幾乎就像RichTextBox
正在添加一些填充,我不能在進行文本掃描時進行說明。
更新
我發現了一個哈克解決問題的辦法。但是,似乎只是進一步證實了我的懷疑。如果我在反向應用着色這似乎解決它,如:
protected override void TextChanged(TextChangedEventArgs args) {
var matches = regex.Matches(base.Text)
.Cast<Match>()
.Select(match => new {
Start = match.Index,
End = match.Index + match.Length
}).Reverse();
foreach (var match in matches) {
Colorize(match.Start, match.End, TextElement.ForegroundProperty, Brushes.Blue);
}
}
這似乎是我不應該這樣做。認真看起來像是添加填充或其他東西。
這很有用。你知道如何閱讀這些標籤嗎? – sircodesalot
我想了一會兒,看起來最好的辦法是一次獲取位置標記,然後一次應用突出顯示,以避開所有填充/移位。謝謝你的幫助。 – sircodesalot
您可能想查看TextRange內容[鏈接](http://msdn.microsoft.com/zh-cn/library/system.windows.documents.textrange.aspx)。從內存中,如果設置了一個myTextRange = TextRange(textPointer1,textPointer2),它將在編輯時保持其相對位置。你可以使用myTextRange.ApplyPropertyValue(...) – quarkonium