简体   繁体   English

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

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

I have a RichTextBox in my WPF application and inside of it there is a regular Text.There are parts of that text that I want to change the color of. 我的WPF应用程序中有一个RichTextBox,里面有一个常规Text.There部分文本我想改变它的颜色。 Example: 例:

The file looks like that: 该文件看起来像这样:

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

And I want to change the color of this: <heading>Reminder</heading> 我想改变这个颜色: <heading>Reminder</heading>

Is there a way for that to happen? 有没有办法实现这一目标?

XAML of the window: 窗口的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>


It was not a long time ago I saw a code that was using Regular expressions that used to map the whole phrase and change its color in the text but I can not see it happening here.The text is static and there is no formatting at all. 不久前,我看到一个代码使用正则表达式,用于映射整个短语并在文本中更改其颜色,但我看不到它发生在这里。文本是静态的,根本没有格式化。

Do you think that I could transform it somehow so I can format it and then show it in the RichTextBox formatted with the colord, fonts etc.? 你认为我可以以某种方式改变它,所以我可以格式化它,然后在使用colord,字体等格式化的RichTextBox中显示它吗?

Did you see this link Answer here Check it: 你看到这个链接在这里回答检查:

Change color and font for some part of text in WPF C# 在WPF C#中更改文本某些部分的颜色和字体

In RichTextBox you can modify the font for particular text region using TextRange. 在RichTextBox中,您可以使用TextRange修改特定文本区域的字体。 TextRang need start and end pointer. TextRang需要开始和结束指针。 You can't get these pointer in the existing RichTextBox content by using index if already formatting is applied for some region of text since RichTextBox is consider the text content as symbols not characters. 如果已经为某些文本区域应用了格式,则无法通过使用索引在现有RichTextBox内容中获取这些指针,因为RichTextBox将文本内容视为符号而非字符。 So, I suggest you to create a custom RichTextBox for your problem. 所以,我建议你为你的问题创建一个自定义的RichTextBox。 Here I have created CustomRichTextBox which is derived from RichTextBox. 在这里,我创建了从RichTextBox派生的CustomRichTextBox。 Method ApplyPropertyValue is used to format the specified region of text. 方法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();
        }
    }
}

In the custom control you have to maintain all the applied formatting. 在自定义控件中,您必须维护所有应用的格式。 For that I created the below class which holds the formatting information. 为此,我创建了下面的类,其中包含格式信息。

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

You can apply formatting for the text like below. 您可以为文本应用格式,如下所示。

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