WPF RichTexBox中选定的文本格式

WPF RichTexBox中选定的文本格式,wpf,formatting,richtextbox,Wpf,Formatting,Richtextbox,我试图在WPF RichTextBox中实现编程选择(使用正则表达式)文本格式。用例只是一个WPF RichTextBox,用户在其中键入文本。然而,为了提高或加速可读性,我想在输入文本时加入一些自动格式 下面的代码正是我要做的。但是,据我所知,这段代码是针对WinForms RichTextBox的: public void ColourRrbText(RichTextBox rtb) { Regex regExp = new Regex(@"\b(For|Next|If|Then)\

我试图在WPF RichTextBox中实现编程选择(使用正则表达式)文本格式。用例只是一个WPF RichTextBox,用户在其中键入文本。然而,为了提高或加速可读性,我想在输入文本时加入一些自动格式

下面的代码正是我要做的。但是,据我所知,这段代码是针对WinForms RichTextBox的:

public void ColourRrbText(RichTextBox rtb)
{
    Regex regExp = new Regex(@"\b(For|Next|If|Then)\b");

    foreach (Match match in regExp.Matches(rtb.Text))
    {
        rtb.Select(match.Index, match.Length);
        rtb.SelectionColor = Color.Blue;
    }
}
我尝试将其转换为以下内容:

public static void ColorSpecificText(RichTextBox rtb)
{
    TextRange textRange = new TextRange(rtb.Document.ContentEnd, rtb.Document.ContentEnd);

    Regex regex = new Regex(@"\b(For|Next|If|Then)\b");

    foreach (Match match in regex.Matches(textRange.Text))
    { 
        textRange.Select(match.Index, match.Length); // <--- DOESN'T WORK
        textRange.SelectionColor = Color.Blue; // <--- DOESN'T WORK
    }
}
公共静态void ColorSpecificText(RichTextBox rtb)
{
TextRange TextRange=新的TextRange(rtb.Document.ContentEnd,rtb.Document.ContentEnd);
Regex Regex=new Regex(@“\b(表示“下一个”如果“那么”);
foreach(regex.Matches中的匹配(textRange.Text))
{ 
textRange.Select(match.Index,match.Length);//这是语法:

TextRange textRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
textRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Black);
Regex regex = new Regex(@"\b(For|Next|If|Then)\b");

int i = 0;
foreach (Match match in regex.Matches(textRange.Text))
{
    var wordStartOffset = textRange.Start.GetPositionAtOffset(i + match.Index);
    var wordEndOffset = textRange.Start.GetPositionAtOffset(i + match.Index + match.Length);
    var wordRange = new TextRange(wordStartOffset, wordEndOffset);
    wordRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.LightBlue);
    i += 4; // could be something else
}

尽管由于您的策略,它可能无法正确突出显示。恐怕字符串索引不足以创建正确的文本指针。+4用于跳过格式化开销,这就是为什么如果存在其他格式,它可能不起作用。

若要使用单词边界,请使用verbatim string literal,或将反斜杠加倍,
@“\b(对于| Next | If | Then)\b“
谢谢@Wiktor。你是对的,需要@。但这并不能解决match.index、match length的问题,它会产生错误代码“无法从int转换为'System.Windows.Documents.TextPointer'”。这已经不是正则表达式问题。请修改该问题。
textRange.Select
expect需要什么类型的值?
SelectionColor
似乎需要
System.Drawing.Color
。但这可能会影响整个组件文本,而不仅仅是其中的一部分。我同意-这不是正则表达式问题。textRange。选择两个TextPointers.我的问题是,使用文本指针指定match.index和match.length的语法是什么。@scorpiotomse如果有答案解决了您的问题,请单击勾号让其他人知道这个问题已经解决。您好@Bizhan:非常有帮助。非常有用。非常感谢。我们将深入了解您的代码,以便更好地理解。您怎么办您的意思是“不足以创建正确的文本指针?”什么是正确的语法?@scorpiotomse,不客气。正确的方法主要取决于你的设计。好吧,RTB使用一个FlowDocument作为它的内容,各种疯狂的东西都可以进入其中,所以很难说在不同的场景中你需要多少补偿。我对RTB不太了解,但对我来说,这是最简单的方法要处理它,就是连续查找并应用每个单词,而不是查找全部然后应用全部。@scorpiotoms要澄清,如果删除这一行:
ApplyPropertyValue(…黑色)
那么它是如何工作的就不得而知了。例如,如果你已经有了一些颜色或其他格式,你需要在某个地方记住这些偏移量并加以考虑。但是,除此之外,上面的代码就是这样工作的。你可以调试它并查看元素是如何创建的,以便每次应用一个格式时偏移量都会移动4倍再次感谢。事实上,我同意每次都初始化格式化,所以ApplyPropertyValue(…黑色)是完全可以的。