确定 WPF RichTextBox 中选定的 InlineUIContainer [英] Determining the selected InlineUIContainer in a WPF RichTextBox
问题描述
我想确定 WPF RichTextBox 中当前 Caret 位置是否有 InlineUIContainer(或 BlockUIContainer).
I'd like to determine if there is an InlineUIContainer (or BlockUIContainer) at the current Caret position in a WPF RichTextBox.
目前我有一个 RichTextBox,如下所示;
Currently I have a RichTextBox as follows;
<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 事件中;
In the SelectionChanged event I have tried using;
rtf.CaretPosition.GetAdjacentElement(rtf.CaretPosition.LogicalDirection)
... 返回空值.
我可以使用 MouseDoubleClicked 事件处理程序,如下所示;
I can do it using the MouseDoubleClicked event handler as follows;
Point pos = e.GetPosition(rtf);
TextPointer pointer = rtf.GetPositionFromPoint(pos, false);
Console.WriteLine(pointer.GetAdjacentElement(pointer.LogicalDirection));
但我真的很想让它在 RichTextBox 插入符号位置改变时工作.
But I'd really like to get it working when the RichTextBox caret position changes.
有什么办法可以做到这一点吗?
Is there any way I can achieve this?
提前致谢
马特
推荐答案
如果您的 InlineUIContainer 被赋予了 x:Name 属性,您可以使用以下代码专门查找它:
If your InlineUIContainer is given a x:Name attribute, you can look for it specifically using this code:
if (rtf.Selection.Contains(myInlineUIContainer.ContentStart))
{...}
要获得更多动态发现,您需要一个类似这样的循环:
For more dynamic discovery you would need a loop something like this:
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");
}
}
}
}
}
这篇关于确定 WPF RichTextBox 中选定的 InlineUIContainer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!