2013-07-03 26 views
0

這使我瘋狂。我正在寫一個文本熒光筆,最終調用代碼: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); 
    } 

} 

這似乎是我不應該這樣做。認真看起來像是添加填充或其他東西。

回答

1

的TextPointer API計數不只是文字,但符號可以包括開始和結束標記等看到這裏的註釋部分MSDN上對什麼是 http://msdn.microsoft.com/en-us/library/ms598662.aspx

所以算作一個符號,當你加入一些格式化它會拋出你稍後在文本中保存的符號偏移量。您將不得不再次從那裏應用格式搜索等。或者反向操作也可以。

+0

這很有用。你知道如何閱讀這些標籤嗎? – sircodesalot

+0

我想了一會兒,看起來最好的辦法是一次獲取位置標記,然後一次應用突出顯示,以避開所有填充/移位。謝謝你的幫助。 – sircodesalot

+0

您可能想查看TextRange內容[鏈接](http://msdn.microsoft.com/zh-cn/library/system.windows.documents.textrange.aspx)。從內存中,如果設置了一個myTextRange = TextRange(textPointer1,textPointer2),它將在編輯時保持其相對位置。你可以使用myTextRange.ApplyPropertyValue(...) – quarkonium