确定 WPF RichTextBox 中选定的 InlineUIContainer [英] Determining the selected InlineUIContainer in a WPF RichTextBox

查看:41
本文介绍了确定 WPF RichTextBox 中选定的 InlineUIContainer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想确定 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆