2012-04-24 67 views
1

我試圖創建使用的Silverlight 5 RichTextBox中的用戶控制。我需要能夠插入「內聯ui」,並不能解決如何獲取當前光標位置。Silverlight中的RichTextBox獲得的光標位置

我觸發我這樣的代碼:

this.GetAbsolutePos(this.richText.Selection.Start); 

這種方法的膽量是在這裏:

private int GetAbsolutePos(TextPointer textPointer) 
{ 
    int index = 0; 
    TextPointer pos = this.richText.ContentStart; 
    while (pos.CompareTo(textPointer) != 0) 
    { 
     if (pos.IsAtInsertionPosition) 
     { 
      index++; 
     } 

     pos = pos.GetNextInsertionPosition(LogicalDirection.Forward); 
    } 
    return index; 
} 

鑑於RichTextBox控件下面的文字....

Empty Control

如果光標5之間6在第一行,然後上述函數正確返回5.但隨着光標進一步到文本中的位置變得更加不準確。即在第二行5 & 6返回16和第三行返回27.

它也變得更加困難,因爲我在這些位置插入內聯元素,然後計算爲「符號」,並進一步導致指望出錯。

此圖片顯示,當我在每一行「插入」 5 & 6之間的在線用戶界面發生了什麼。 With 3 Inlines

只是爲了完整性這裏是XAML中從richtext.Xaml(我已經刪除該科/段落元素的所有額外的屬性,以使其更清晰),基於這一言論

<Section> 
    <Paragraph> 
     <Run>1234567890</Run> 
     <LineBreak /> 
     <Run>1234567890</Run> 
     <LineBreak /> 
     <Run>1234567890</Run> 
    </Paragraph> 
</Section> 

MSDN Silverlight TextPointer Class

符號 - 對於TextPointer操作,任何被認爲是下面的是一個符號:

  • 用於TextElement的元件的開啓或關閉標記。

  • 包含在InlineUIContainer內的的UIElement元素。請注意,UIElement始終只計爲一個符號。任何額外的 內容或由UIElement包含的元素不被視爲 符號。

  • 文本Run元素內部的每個16位Unicode字符。

我想我需要「知道」什麼樣的「符號」的,我目前卻無法弄清楚如何。

好像應該很容易,但TextPointers工作看起來很直觀。 我有一個想法來解析Xaml來找到光標位置,但這似乎是一個真正的黑客。

任何幫助,將不勝感激。

感謝

+0

你有沒有找到一個很好的解決方案呢? – 2013-04-04 04:39:42

+0

爲你添加了一個答案。 – 2013-04-05 08:42:42

回答

0

最後,我們纔剛剛手動SubstituteEdits的是文本點之前的數量(我們的UIElement的表示)調整指數。它仍然片狀,我們還有其他的問題,我們的控制,但它不夠好時刻。

乾杯

private int GetAbsolutePos(SubstituteEdit newSub) 
    { 
     int index = 0; 
     TextPointer textPointer = this.richText.Selection.Start; 
     TextPointer caretWhere = this.richText.ContentStart; 

     while (true) 
     { 
      caretWhere = caretWhere.GetNextInsertionPosition(LogicalDirection.Forward); 
      if (caretWhere == null || caretWhere.CompareTo(textPointer) == 0) 
      { 
       break; 
      } 

      index++; 
     } 

     foreach (SubstituteEdit sub in this.Substitutes) 
     { 
      if (sub.Position < index && sub != newSub) 
      { 
       index--; 
      } 
     } 

     return index; 
    } 
0

我不知道這是否會幫助,但我最終讓用戶插入其中的選擇,而不是插入位置,它似乎運作良好。這裏是我的一些代碼:

InlineUIContainer MyUI = new InlineUIContainer(); 
TextBlock tblx = new TextBlock() { Text = addedItem.Title, FontWeight = FontWeights.Bold }; 
MyUI.Child = tblx; 
Paragraph myParagraph = new Paragraph(); 
myParagraph.Inlines.Add(MyUI); 
rtb.Selection.Insert(myParagraph);