Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WPF中的RichTextBox在执行过程中更改位置_C#_Wpf_Richtextbox - Fatal编程技术网

C#WPF中的RichTextBox在执行过程中更改位置

C#WPF中的RichTextBox在执行过程中更改位置,c#,wpf,richtextbox,C#,Wpf,Richtextbox,我正在尝试在WPF C#中创建语法着色器。为了获得这个结果,我需要获得每个单词的位置,并根据匹配模式对其进行着色RichTextBox有一个非常复杂的文本选择系统,所以我猜想检查给定单词在纯字符串中的位置并将其连接到文本中的位置会更容易。嗯,没有。根据我已经更改了多少文本颜色,它的行为会有所不同,有时甚至会匹配错误的字母数 例如: 使用System.Windows; 使用System.Windows.Documents; 使用System.Windows.Media; 名称空间示例 { ///

我正在尝试在WPF C#中创建语法着色器。为了获得这个结果,我需要获得每个单词的位置,并根据匹配模式对其进行着色
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>