繁体   English   中英

如何更改RichTextBox的Text内容中特定单词(或短语)的颜色

[英]How can I change the color of a specific word(or phrase) in the Text content of a RichTextBox

我的WPF应用程序中有一个RichTextBox,里面有一个常规Text.There部分文本我想改变它的颜色。 例:

该文件看起来像这样:

<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>


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

你认为我可以以某种方式改变它,所以我可以格式化它,然后在使用colord,字体等格式化的RichTextBox中显示它吗?

你看到这个链接在这里回答检查:

在WPF C#中更改文本某些部分的颜色和字体

在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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM