首页 > 解决方案 > 如何获取 RichTextBox 中选定文本的父标签?

问题描述

我得到FlowDocumentRichTextBox控制:

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

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

标签: c#wpfrichtextbox

解决方案


尝试使用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();
    }
}

推荐阅读