Silverlight Richtextbox获取光标位置

Silverlight Richtextbox获取光标位置,silverlight,position,richtextbox,Silverlight,Position,Richtextbox,我正在尝试使用silverlight 5 richtextbox创建用户控件。我需要能够插入内联用户界面,但无法确定如何获取当前光标位置 我像这样触发我的代码: this.GetAbsolutePos(this.richText.Selection.Start); 这种方法的精髓在于: private int GetAbsolutePos(TextPointer textPointer) { int index = 0; TextPointer pos = this.richTex

我正在尝试使用silverlight 5 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控件中给定以下文本

如果光标位于第一行的5和6之间,则上述函数将正确返回5。但随着光标深入文本,位置变得更加不准确。即第二行的5和6之间返回16,第三行返回27

当我在这些位置插入内联元素时,它也变得更加困难,这些元素随后会作为符号计数,并进一步导致计数出错

此图显示了当我在每行的5和6之间插入内联ui时发生的情况。

为了完整起见,这里是richtext.Xaml中的Xaml。为了让它更清晰,我删除了节/段落元素中的所有额外属性

<Section>
   <Paragraph>
       <Run>1234567890</Run>
       <LineBreak />
       <Run>1234567890</Run>
       <LineBreak />
       <Run>1234567890</Run>
   </Paragraph>
</Section> 
根据本页的备注

符号-对于文本指针操作,以下任何一项都被视为符号:

TextElement的开始或结束标记

包含在InlineUIContainer中的UIElement元素。注意 UIElement始终被视为一个符号。任何额外的 不考虑UIElement包含的一个或多个内容 符号

文本运行元素中的每个16位Unicode字符

我想我需要知道我现在使用的是哪种符号,但我不知道如何使用

看起来应该很容易,但使用文本指针似乎很不直观。 我有一个想法来解析Xaml以找到光标的位置,但这似乎是一个真正的难题

任何帮助都将不胜感激


谢谢

最后,我们只需手动调整索引,调整文本点之前UIElement的替换数即可。它仍然不稳定,我们的控制还有其他问题,但现在已经足够好了

干杯

提姆


我不确定这是否有帮助,但我最终让用户插入选择的位置,而不是插入符号的位置,而且似乎效果很好。以下是我的一些代码:

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);

你找到解决这个问题的好方法了吗?为你添加了一个答案。
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);