如何获取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();
}
}
我在 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();
}
}