Silverlight Richtextbox获取光标位置

时间:2012-04-24 14:51:01

标签: silverlight position richtextbox

我正在尝试使用silverlight 5 richtextbox创建用户控件。我需要能够插入“内联ui”,并且无法确定如何获取当前光标位置。

我触发了我的代码:

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和5之间第二行的6返回16,第三行返回27.

当我在这些位置插入内联元素时,它也变得更加困难,然后将其视为“符号”并进一步导致计数出错。

此图显示当我在5&之间“插入”内联ui时发生的情况。每行6个。 With 3 Inlines

为了完整起见,这里是richtext.Xaml中的Xaml(我删除了Section / Paragraph元素中的所有额外属性以使其更清晰)

<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以找到光标位置,但这似乎是一个真正的黑客。

任何帮助都将不胜感激。

由于

2 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分: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);