我正在尝试使用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控件中给出以下文本....
如果光标位于5&在第一行6,然后上面的函数正确返回5.但是当光标进一步进入文本时,位置变得更不准确。即5和5之间第二行的6返回16,第三行返回27.
当我在这些位置插入内联元素时,它也变得更加困难,然后将其视为“符号”并进一步导致计数出错。
此图显示当我在5&之间“插入”内联ui时发生的情况。每行6个。
为了完整起见,这里是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以找到光标位置,但这似乎是一个真正的黑客。
任何帮助都将不胜感激。
由于
答案 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);