gpt4 book ai didi

c# - 如何更改 RichTextBox 文本内容中特定单词(或短语)的颜色

转载 作者:行者123 更新时间:2023-11-30 18:33:47 25 4
gpt4 key购买 nike

我的 WPF 应用程序中有一个 RichTextBox,其中有一个常规文本。我想更改该文本的某些部分的颜色。示例:

文件看起来像这样:

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

我想改变它的颜色:<heading>Reminder</heading>

有什么办法可以实现吗?

窗口的XAML:

<Window x:Class="WpfConfigHelper.Framework.AdditionalWinows.XmlAfterUpdateComparator"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="XmlAfterUpdateComparator" Height="602" Width="1033">
<Grid>
<RichTextBox Height="426" HorizontalAlignment="Left" Margin="9,42,0,0" Name="BeforeXmlUpdated_TextBox" VerticalAlignment="Top" Width="495" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"/>
<RichTextBox Height="426" HorizontalAlignment="Left" Margin="510,42,0,0" Name="AfterXmlUpdated_TextBox" VerticalAlignment="Top" Width="490" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"/>
<Label Content="Before Update:" Height="29" HorizontalAlignment="Left" Margin="205,12,0,0" Name="BeforeXmlUpdated_Label" VerticalAlignment="Top" Width="115" />
<Label Content="After Update:" Height="31" HorizontalAlignment="Left" Margin="697,12,0,0" Name="AfterXmlUpdated_Label" VerticalAlignment="Top" Width="87" />
<Label Content="Do you agree to perform the changes from the right text box?" Height="33" HorizontalAlignment="Left" Margin="338,485,0,0" Name="DoYouAgreeWithChanges_Label" VerticalAlignment="Top" Width="497" />
<Button Content="Yes" Height="27" HorizontalAlignment="Left" Margin="308,524,0,0" Name="AgreedWithChanges_Button" VerticalAlignment="Top" Width="196" Click="AgreedWithChanges_Button_Click" />
<Button Content="No" Height="29" HorizontalAlignment="Left" Margin="516,524,0,0" Name="DisagreedWithChanges_Button" VerticalAlignment="Top" Width="221" Click="DisagreedWithChanges_Button_Click" />
<Label Content="Text removed" Height="39" HorizontalAlignment="Left" Margin="12,474,0,0" Name="label1" VerticalAlignment="Top" Width="177" Foreground="Red" FontSize="13"/>
<Label Content="Text inserted" Height="41" HorizontalAlignment="Left" Margin="906,477,0,0" Name="label2" VerticalAlignment="Top" Width="93" Foreground="Green" FontSize="13"/>
</Grid>


不久前,我看到一段使用正则表达式的代码,用于映射整个短语并更改其在文本中的颜色,但我看不到它发生在这里。文本是静态的,没有完全格式化。

您认为我可以以某种方式对其进行转换,以便我可以对其进行格式化,然后在使用颜色、字体等格式化的 RichTextBox 中显示它吗?

最佳答案

在 RichTextBox 中,您可以使用 TextRange 修改特定文本区域的字体。 TextRang 需要开始和结束指针。如果已经对某些文本区域应用了格式设置,则无法使用索引在现有 RichTextBox 内容中获取这些指针,因为 RichTextBox 将文本内容视为符号而不是字符。因此,我建议您为您的问题创建一个自定义 RichTextBox。在这里,我创建了派生自 RichTextBox 的 CustomRichTextBox。方法 ApplyPropertyValue 用于格式化指定的文本区域。

public class CustomRichTextBox : RichTextBox
{
private readonly List<FormattingTag> formattingTags = new List<FormattingTag>();

public IEnumerable<FormattingTag> FormattingTags
{
get { return this.formattingTags; }
}

public void ApplyPropertyValue(int startIndex, int length, DependencyProperty formattingProperty, object value)
{
TextRange documentRange = new TextRange(this.Document.ContentStart, this.Document.ContentEnd);
documentRange.ClearAllProperties();
string documentText = documentRange.Text;
if (startIndex < 0 || (startIndex + length) > documentText.Length)
{
return;
}

this.CaretPosition = this.Document.ContentStart;
this.formattingTags.Add(FormattingTag.GetTag(this.Document.ContentStart, startIndex, length, formattingProperty, value));

foreach (var formattingTag in formattingTags)
{
formattingTag.ApplyFormatting();
}
}
}

在自定义控件中,您必须维护所有应用的格式。为此,我创建了下面的类来保存格式信息。

public class FormattingTag
{
private int start;
private int length;

private FormattingTag(int start, int length)
{
this.start = start;
this.length = length;
}

public int Start
{
get{ return this.start; }
}

public int Length
{
get { return this.length; }
}

public TextPointer StartPosition { get; private set; }

public TextPointer EndPosition { get; private set; }

public DependencyProperty FormattingProperty { get; private set; }

public object Value { get; private set; }

public static FormattingTag GetTag(TextPointer start, int startIndex, int length, DependencyProperty formattingProperty, object value)
{
while (start.GetPointerContext(LogicalDirection.Forward) != TextPointerContext.Text)
{
start = start.GetNextContextPosition(LogicalDirection.Forward);
}

TextPointer contentStart = start.GetPositionAtOffset(startIndex);
TextPointer contentEnd = contentStart.GetPositionAtOffset(length);
FormattingTag tag = new FormattingTag(startIndex, length);
tag.StartPosition = contentStart;
tag.EndPosition = contentEnd;
tag.FormattingProperty = formattingProperty;
tag.Value = value;
return tag;
}

public void ApplyFormatting()
{
TextRange range = new TextRange(this.StartPosition, this.EndPosition);
range.ApplyPropertyValue(this.FormattingProperty, this.Value);
}
}

您可以像下面这样为文本应用格式。

this.richTextBox.ApplyPropertyValue(2, 5, TextElement.ForegroundProperty, Brushes.Red);
this.richTextBox.ApplyPropertyValue(8, 11, TextElement.ForegroundProperty, Brushes.Blue);

关于c# - 如何更改 RichTextBox 文本内容中特定单词(或短语)的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16962016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com