Определение выбранного 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".