【发布时间】:2012-05-05 05:43:51
【问题描述】:
我正在尝试使用 silverlight 5 Richtextbox 创建用户控件。我需要能够插入“inline 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;
}
给定富文本框控件中的以下文本....
如果光标在第一行的 5 和 6 之间,则上述函数正确返回 5。但随着光标进一步进入文本,位置变得更加不准确。即第二行的 5 和 6 之间返回 16,第三行返回 27。
当我在这些位置插入内联元素时,这也变得更加困难,然后将其视为“符号”并进一步导致计数出错。
这张图片显示了当我在每行的 5 和 6 之间“插入”内联 ui 时发生的情况。
为了完整起见,这里是来自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 以找到光标位置,但这似乎是一个真正的 hack。
任何帮助将不胜感激。
谢谢
【问题讨论】:
-
你找到了一个好的解决方案吗?
-
为你添加了答案。
标签: silverlight position richtextbox