如何获取RichTextBox中选中文本的父标签?

How to get the parent tag of selected text in RichTextBox?

我在 RichTextBox 控件中得到了 FlowDocument

<RichTextBox>
    <FlowDocument>
        <Paragraph>
            <Span>First Line</Span>
        </Paragraph>
        <Paragraph>
            <Span>Second Line</Span>
        </Paragraph>
        <Paragraph>
            <Span>Third Line</Span>
        </Paragraph>
    </FlowDocument>
</RichTextBox>

我想引用所选文本的父 Paragraph 标记,因为我需要更改段落的 TextAlignment 属性。

尝试使用下面声明的GetParentParagraph()方法:

public static class TextRangeExt
{
    public static Paragraph GetParentParagraph(this TextPointer position)
    {
        var direction = LogicalDirection.Backward;
        for (; position != null; position = position.GetNextContextPosition(direction))
        {
            if (position.GetAdjacentElement(direction) is Paragraph para) { return para; }     
        }
        return null;
    }
}

以下代码用于测试目的。

MainWindow.xaml:

<Window ...>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <RichTextBox Name="rtb" BorderBrush="{x:Null}" Padding="5" Margin="10" 
                     VerticalScrollBarVisibility="Auto">
            <FlowDocument>
                <Paragraph>
                    <Span>First Line</Span>
                </Paragraph>
                <Paragraph>
                    <Span>Second Line</Span>
                </Paragraph>
                <Paragraph>
                    <Span>Third Line</Span>
                </Paragraph>
            </FlowDocument>    
        </RichTextBox>
        <Button Grid.Row="1" Click="Button_SearchParagraph" Margin="2" Padding="3">Search Parent Paragraph</Button>
    </Grid>
</Window>

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    
    private void Button_SearchParagraph(object sender, RoutedEventArgs e)
    {
        var range = rtb.Selection;
        if (!range.IsEmpty)
        {
            if (range.Start.GetParentParagraph() is Paragraph para)
                rtb.CaretPosition = para.ContentStart;
        }
        rtb.Focus();
    }
}