C#WPF中的RichTextBox在执行过程中更改位置
我正在尝试在WPF C#中创建语法着色器。为了获得这个结果,我需要获得每个单词的位置,并根据匹配模式对其进行着色C#WPF中的RichTextBox在执行过程中更改位置,c#,wpf,richtextbox,C#,Wpf,Richtextbox,我正在尝试在WPF C#中创建语法着色器。为了获得这个结果,我需要获得每个单词的位置,并根据匹配模式对其进行着色RichTextBox有一个非常复杂的文本选择系统,所以我猜想检查给定单词在纯字符串中的位置并将其连接到文本中的位置会更容易。嗯,没有。根据我已经更改了多少文本颜色,它的行为会有所不同,有时甚至会匹配错误的字母数 例如: 使用System.Windows; 使用System.Windows.Documents; 使用System.Windows.Media; 名称空间示例 { ///
RichTextBox
有一个非常复杂的文本选择系统,所以我猜想检查给定单词在纯字符串中的位置并将其连接到文本中的位置会更容易。嗯,没有。根据我已经更改了多少文本颜色,它的行为会有所不同,有时甚至会匹配错误的字母数
例如:
使用System.Windows;
使用System.Windows.Documents;
使用System.Windows.Media;
名称空间示例
{
///
///MainWindow.xaml的交互逻辑
///
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
var message=“你好,世界和这里的每个人!”;
richTextBox.Document.Blocks.Clear();
添加(新段落(新运行(消息));
var position=richTextBox.Document.ContentStart;
var text=position.gett运行(LogicalDirection.Forward);
ShowPos(位置,2,5);//显示消息“Hello”
ShowPos(位置,8,5);//如果上行未显示,则显示消息“Wor”
//注释-否则,显示“世界”
}
私有void ShowPos(文本指针位置、int-from、int-length)
{
var posA=position.GetPositionAtOffset(从);
var posB=posA.GetPositionAtOffset(长度);
var范围=新文本范围(posA、posB);
var textA=range.Text;
//如果移除,一切正常
range.ApplyPropertyValue(ForegroundProperty、Brush.DarkRed);
MessageBox.Show(textA);
}
}
}
这很令人沮丧。我应该怎么做来匹配和着色每个单词?这是一篇非常古老的文章,但也许有人会发现这个解决方案很有用 不幸的是,在
RichTextBox
中搜索文本并确定其位置是一个有点复杂的过程。由于文本可以包含不同的格式元素,如背景/前景颜色、不同字体、图像等,因此必须使用上下文来确定所需文本的位置
可能的解决方案之一如下所示
MainWindow.xaml
RichBoxText
文档:var textRange=new textRange(rtb.Document.ContentStart,rtb.Document.ContentEnd);
TextRange
列表://构建单词/文本范围对的列表
var list=CalculateTextRange(textRange,pairs.Select(d=>d.Key).ToList());
<Window ...
Title="MainWindow" Height="250" Width="400"
KeyDown="Window_KeyDown">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<RichTextBox Grid.Row="0" x:Name="rtb" AllowDrop="True"
VerticalScrollBarVisibility="Auto" Padding="2" FontSize="18"
HorizontalAlignment="Left" >
<FlowDocument>
<Paragraph>
<Run FontSize="10" Text="In this example, you will learn to print Hello World." />
<Run Text="In this example, you will learn to print Hello World." />
<Run FontSize="20" Text="In this example, you will learn to print Hello World." />
</Paragraph>
</FlowDocument>
</RichTextBox>
<Button Grid.Row="1" Click="Button_Click">Color Words</Button>
</Grid>
</Window>