我想确定在WPF RichTextBox中当前的Caret位置是否有InlineUIContainer(或BlockUIContainer)。
目前我有一个RichTextBox如下;
<RichTextBox SelectionChanged="RichTextBox_SelectionChanged">
<FlowDocument>
<Paragraph>
<Run>Some text before</Run>
<InlineUIContainer>
<Label>I am a label</Label>
</InlineUIContainer>
<Run>Some text after</Run>
</Paragraph>
</FlowDocument>
</RichTextBox>
在SelectionChanged事件中,我尝试过使用;
rtf.CaretPosition.GetAdjacentElement(rtf.CaretPosition.LogicalDirection)
...返回null。
我可以使用MouseDoubleClicked事件处理程序,如下所示;
Point pos = e.GetPosition(rtf);
TextPointer pointer = rtf.GetPositionFromPoint(pos, false);
Console.WriteLine(pointer.GetAdjacentElement(pointer.LogicalDirection));
但是当RichTextBox插入位置发生变化时,我真的很想让它工作。
有什么方法可以实现这个目标吗?
提前致谢
马特
答案 0 :(得分:8)
如果您的InlineUIContainer被赋予了x:Name属性,您可以使用以下代码专门查找:
if (rtf.Selection.Contains(myInlineUIContainer.ContentStart))
{...}
对于更动态的发现,你需要一个这样的循环:
foreach (Block block in rtf.Document.Blocks)
{
Paragraph p = block as Paragraph;
if (p != null)
{
foreach (Inline inline in p.Inlines)
{
InlineUIContainer iuic = inline as InlineUIContainer;
if (iuic != null)
{
if (rtf.Selection.Contains(iuic.ContentStart))
{
Console.WriteLine("YES");
}
}
}
}
}
答案 1 :(得分:0)
您可以使用CaretPosition.Parent并使用“is”运算符。