确定WPF RichTextBox中选定的InlineUIContainer

use*_*159 4 wpf richtextbox selection

我想确定在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>
Run Code Online (Sandbox Code Playgroud)

在SelectionChanged事件中,我尝试过使用;

rtf.CaretPosition.GetAdjacentElement(rtf.CaretPosition.LogicalDirection)
Run Code Online (Sandbox Code Playgroud)

...返回null.

我可以使用MouseDoubleClicked事件处理程序,如下所示;

Point pos = e.GetPosition(rtf);
TextPointer pointer = rtf.GetPositionFromPoint(pos, false);
Console.WriteLine(pointer.GetAdjacentElement(pointer.LogicalDirection));
Run Code Online (Sandbox Code Playgroud)

但是当RichTextBox插入位置发生变化时,我真的很想让它工作.

有什么办法可以实现吗?

提前致谢

马特

wit*_*ers 8

如果您的InlineUIContainer被赋予ax:Name属性,您可以使用以下代码专门查找:

if (rtf.Selection.Contains(myInlineUIContainer.ContentStart))
{...}
Run Code Online (Sandbox Code Playgroud)

要获得更多动态发现,您需要一个这样的循环:

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");
                        }
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)