2010-04-02 39 views
8

我有我打字一些文本,然後解析整個文本做處理在WPF的RichTextBox。在這個解析過程中,我有每個單詞開始和結束的絕對字符位置。WPF的FlowDocument - 絕對字符位置

我想使用這些字符位置將格式應用於某些單詞。但是,我發現FlowDocument使用TextPointer實例來標記文檔中的位置。

我發現,我可以通過開始和結束指針構建它創建一個TextRange。一旦我有了TextRange,我就可以輕鬆地將格式應用於其中的文本。我一直在使用GetPositionAtOffset爲我的字符偏移量獲取TextPointer,但懷疑它的偏移量與我的偏移量不同,因爲所選文本與我所期望的位置略有不同。

我的問題是,我怎麼能準確地轉換,是絕對字符位置的TextPointer?

+1

+1,我有這個確切的問題 - 做自定義分析和亮點都:-) – Cameron 2014-08-07 14:00:58

回答

5

我沒有找到將絕對字符位置轉換爲TextPosition實例的可靠方法。

我的另一種解決方案是修改原來的解析對個別運行的工作,而不是捕捉RichTextBox中的全部文本。使用與特定Run實例相關的字符位置對我來說已證明是可靠的。我認爲讓我的思維模式更多地轉向WPF思維方式已經有所幫助。

我把在FlowDocument的導航運行下面的方法(通過http://blogs.msdn.com/prajakta/archive/2006/10/12/customize-richtextbox-to-allow-only-plain-text-input.aspx啓發):

// Get starting pointer 
TextPointer navigator = flowDocument.ContentStart; 

// While we are not at end of document 
while (navigator.CompareTo(flowDocument.ContentEnd) < 0) 
{ 
    // Get text pointer context 
    TextPointerContext context = navigator.GetPointerContext(LogicalDirection.Backward); 

    // Get parent as run 
    Run run = navigator.Parent as Run; 

    // If start of text element within run 
    if (context == TextPointerContext.ElementStart && run != null) 
    { 
     // Get text of run 
     string runText = run.Text; 

     // ToDo: Parse run text 
    } 

    // Get next text pointer 
    navigator = navigator.GetNextContextPosition(LogicalDirection.Forward); 
} 
1

我有確切的類似的問題,我發現有在RichTextBox中的一個錯誤,因爲它不指望「新行字符 - \ r \ n」,從而爲您的生產線數量的增加,你會發現,你的偏移定位錯誤的行號計數,我通過偏移行號來解決我的問題。

+0

嗨阿卡什, 感謝您的回覆偏移錯誤。我的經驗是,它是計算我的新行字符,但已經注意到,完全空白行「<運行XML:LANG =」 EN-GB「XML:空間=‘保存’/>」正在導致FlowDocument的是2個字符提前補償(每次換行後累計)。 Alan – 2010-04-02 09:55:46

3

我也有這個問題,已經結束了以下RichTextBox的擴展方法。在我的語境中,它完美無缺地工作!

/// <summary> 
/// Gets the text pointer at the given character offset. 
/// Each line break will count as 2 chars. 
/// </summary> 
/// <param name="richTextBox">The rich text box.</param> 
/// <param name="offset">The offset.</param> 
/// <returns>The TextPointer at the given character offset</returns> 
public static TextPointer GetTextPointerAtOffset(this RichTextBox richTextBox, int offset) 
{ 
    var navigator = richTextBox.Document.ContentStart; 
    int cnt = 0; 

    while (navigator.CompareTo(richTextBox.Document.ContentEnd) < 0) 
    { 
     switch (navigator.GetPointerContext(LogicalDirection.Forward)) 
     { 
      case TextPointerContext.ElementStart: 
       break; 
      case TextPointerContext.ElementEnd: 
       if (navigator.GetAdjacentElement(LogicalDirection.Forward) is Paragraph) 
        cnt += 2; 
       break; 
      case TextPointerContext.EmbeddedElement: 
       // TODO: Find out what to do here? 
       cnt++; 
       break; 
      case TextPointerContext.Text: 
       int runLength = navigator.GetTextRunLength(LogicalDirection.Forward); 

       if (runLength > 0 && runLength + cnt < offset) 
       { 
        cnt += runLength; 
        navigator = navigator.GetPositionAtOffset(runLength); 
        if (cnt > offset) 
         break; 
        continue; 
       } 
       cnt++; 
       break; 
     } 

     if (cnt > offset) 
      break; 

     navigator = navigator.GetPositionAtOffset(1, LogicalDirection.Forward); 

    } // End while. 

    return navigator; 
}