WPF RichTextBox 中选定的文本格式
Selected Text Formatting in WPF RichTexBox
我正在尝试在 WPF RichTextBox 中实现以编程方式选择(使用正则表达式)的文本格式。用例只是一个 WPF RichTextBox,用户可以在其中键入文本。但是,为了提高或加快可读性,我想在键入文本时加入一些自动格式设置。
来自 How to select text from the RichTextBox and then color it? 的以下代码正是我想要做的。但是,据我所知,这段代码是针对 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
}
}
但是,我一直在研究如何将 "match.Index, match.Length" 和 "SelectionColor" 语法转换为 WPF RichTextBox 知道如何处理的内容。我搜索了其他帖子,但大多数似乎也是针对 WinForms RichTextBox,而不是 WPF。任何指导将不胜感激。
这是语法:
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
}
尽管由于您的策略,它可能无法正确突出显示。恐怕字符串索引不足以创建正确的 TextPointer。 +4 用于跳过格式化开销,这就是如果存在其他格式它可能不起作用的原因。
我正在尝试在 WPF RichTextBox 中实现以编程方式选择(使用正则表达式)的文本格式。用例只是一个 WPF RichTextBox,用户可以在其中键入文本。但是,为了提高或加快可读性,我想在键入文本时加入一些自动格式设置。
来自 How to select text from the RichTextBox and then color it? 的以下代码正是我想要做的。但是,据我所知,这段代码是针对 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
}
}
但是,我一直在研究如何将 "match.Index, match.Length" 和 "SelectionColor" 语法转换为 WPF RichTextBox 知道如何处理的内容。我搜索了其他帖子,但大多数似乎也是针对 WinForms RichTextBox,而不是 WPF。任何指导将不胜感激。
这是语法:
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
}
尽管由于您的策略,它可能无法正确突出显示。恐怕字符串索引不足以创建正确的 TextPointer。 +4 用于跳过格式化开销,这就是如果存在其他格式它可能不起作用的原因。