Change color and font for some part of text in WPF C#

后端 未结 4 1098
孤城傲影
孤城傲影 2020-11-27 18:25

Is there a way to change color and font for some part of text which I want to put on TextBox or RichTextBox. I am using C# WPF.

For example

 richText         


        
相关标签:
4条回答
  • 2020-11-27 18:52

    You need to use the Document property of RichTextBox and add a Run to it.

    Document property: http://msdn.microsoft.com/en-us/library/system.windows.controls.richtextbox.document.aspx
    Run: http://msdn.microsoft.com/en-us/library/system.windows.documents.run.aspx

    0 讨论(0)
  • 2020-11-27 18:58

    I have made my own class to manipulate Texts of TextBlock, TextBox...

    /// <summary>
    /// Class for text manipulation operations
    /// </summary>
    public class TextManipulation
    {
        /// <summary>
        /// Is manipulating a specific string inside of a TextPointer Range (TextBlock, TextBox...)
        /// </summary>
        /// <param name="startPointer">Starting point where to look</param>
        /// <param name="endPointer">Endpoint where to look</param>
        /// <param name="keyword">This is the string you want to manipulate</param>
        /// <param name="fontStyle">The new FontStyle</param>
        /// <param name="fontWeight">The new FontWeight</param>
        /// <param name="foreground">The new foreground</param>
        /// <param name="background">The new background</param>
        /// <param name="fontSize">The new FontSize</param>
        public static void FromTextPointer(TextPointer startPointer, TextPointer endPointer, string keyword, FontStyle fontStyle, FontWeight fontWeight, Brush foreground, Brush background, double fontSize)
        {
            FromTextPointer(startPointer, endPointer, keyword, fontStyle, fontWeight, foreground, background, fontSize, null);
        }
    
        /// <summary>
        /// Is manipulating a specific string inside of a TextPointer Range (TextBlock, TextBox...)
        /// </summary>
        /// <param name="startPointer">Starting point where to look</param>
        /// <param name="endPointer">Endpoint where to look</param>
        /// <param name="keyword">This is the string you want to manipulate</param>
        /// <param name="fontStyle">The new FontStyle</param>
        /// <param name="fontWeight">The new FontWeight</param>
        /// <param name="foreground">The new foreground</param>
        /// <param name="background">The new background</param>
        /// <param name="fontSize">The new FontSize</param>
        /// <param name="newString">The New String (if you want to replace, can be null)</param>
        public static void FromTextPointer(TextPointer startPointer, TextPointer endPointer, string keyword, FontStyle fontStyle, FontWeight fontWeight, Brush foreground, Brush background, double fontSize, string newString)
        {
            if(startPointer == null)throw new ArgumentNullException(nameof(startPointer));
            if(endPointer == null)throw new ArgumentNullException(nameof(endPointer));
            if(string.IsNullOrEmpty(keyword))throw new ArgumentNullException(keyword);
    
            TextRange text = new TextRange(startPointer, endPointer);
            TextPointer current = text.Start.GetInsertionPosition(LogicalDirection.Forward);
            while (current != null)
            {
                string textInRun = current.GetTextInRun(LogicalDirection.Forward);
                if (!string.IsNullOrWhiteSpace(textInRun))
                {
                    int index = textInRun.IndexOf(keyword);
                    if (index != -1)
                    {
                        TextPointer selectionStart = current.GetPositionAtOffset(index,LogicalDirection.Forward);
                        TextPointer selectionEnd = selectionStart.GetPositionAtOffset(keyword.Length,LogicalDirection.Forward);
                        TextRange selection = new TextRange(selectionStart, selectionEnd);
    
                        if(!string.IsNullOrEmpty(newString))
                            selection.Text = newString;
    
                        selection.ApplyPropertyValue(TextElement.FontSizeProperty, fontSize);
                        selection.ApplyPropertyValue(TextElement.FontStyleProperty, fontStyle);
                        selection.ApplyPropertyValue(TextElement.FontWeightProperty, fontWeight);
                        selection.ApplyPropertyValue(TextElement.ForegroundProperty, foreground);
                        selection.ApplyPropertyValue(TextElement.BackgroundProperty, background);
                    }
                }
                current = current.GetNextContextPosition(LogicalDirection.Forward);
            }
        }
    }
    

    Usage

    TextManipulation.FromTextPointer(_TextBlock.ContentStart, _TextBlock.ContentEnd, "IWantToBeManipulated", NewFontStyle, NewFontWeight, NewForeground, NewBackground, NewFontSize);
    TextManipulation.FromTextPointer(_TextBlock.ContentStart, _TextBlock.ContentEnd, "IWantToBeManipulated", NewFontStyle, NewFontWeight, NewForeground, NewBackground, NewFontSize, "NewStringIfYouWant");
    
    0 讨论(0)
  • 2020-11-27 18:59

    You can try out this.

    public TestWindow()
    {
        InitializeComponent();
    
        this.paragraph = new Paragraph();
        rich1.Document = new FlowDocument(paragraph);
    
        var from = "user1";
        var text = "chat message goes here";
        paragraph.Inlines.Add(new Bold(new Run(from + ": "))
        {
            Foreground = Brushes.Red
        });
        paragraph.Inlines.Add(text);
        paragraph.Inlines.Add(new LineBreak());
        this.DataContext = this;
    }
    private Paragraph paragraph;
    

    So use the Document property of the RichTextBox

    0 讨论(0)
  • 2020-11-27 19:00

    If you just want to do some quick coloring , using the end of the RTB content as a Range and apply formatting to it is maybe the simplest solution, e.g.

      TextRange rangeOfText1 = new TextRange(richTextBox.Document.ContentEnd, richTextBox.Document.ContentEnd);
      rangeOfText1.Text = "Text1 ";
      rangeOfText1.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Blue);
      rangeOfText1.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold);
    
      TextRange rangeOfWord = new TextRange(richTextBox.Document.ContentEnd, richTextBox.Document.ContentEnd);
      rangeOfWord.Text = "word ";
      rangeOfWord.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Red);
      rangeOfWord.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Regular);
    
      TextRange rangeOfText2 = new TextRange(richTextBox.Document.ContentEnd, richTextBox.Document.ContentEnd);
      rangeOfText2.Text = "Text2 ";
      rangeOfText2.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Blue);
      rangeOfText2.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold);
    

    If you are looking for a more advanced solution, I suggest reading the MSDN page about the FlowDocument, as this gives you a great flexibility in formatting your text.

    0 讨论(0)
提交回复
热议问题