Определение выбранного InlineUIContainer в WPF RichTextBox

Я хотел бы определить, есть ли InlineUIContainer (или BlockUIContainer) в текущей позиции каретки в WPF RichTextBox.

В настоящее время у меня есть 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)

... который возвращает ноль.

Я могу сделать это с помощью обработчика событий MouseDoubleClicked следующим образом;

Point pos = e.GetPosition(rtf);
TextPointer pointer = rtf.GetPositionFromPoint(pos, false);
Console.WriteLine(pointer.GetAdjacentElement(pointer.LogicalDirection));

Но мне бы очень хотелось, чтобы это работало, когда позиция каретки RichTextBox меняется.

Есть ли способ, которым я могу достичь этого?

заранее спасибо

Matt

2 ответа

Если вашему InlineUIContainer присвоен атрибут a 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");
                        }
                    }
                }
            }
        }

Вы можете использовать CaretPosition.Parent и использовать оператор "is".

Другие вопросы по тегам