Изменить цвет и шрифт для некоторой части текста в WPF C # - PullRequest
27 голосов
/ 26 марта 2011

Есть ли способ изменить цвет и шрифт для некоторой части текста, которую я хочу поместить в TextBox или RichTextBox.Я использую C # WPF.

Например

 richTextBox.AppendText("Text1 " + word + " Text2 ");

Переменное слово, например, для другого цвета и шрифта из Text1 и Text2.Возможно ли это и как это сделать?

Ответы [ 4 ]

44 голосов
/ 26 марта 2011

Если вы просто хотите немного покрасить, то, возможно, самое простое решение - использовать конец RTB-содержимого в качестве диапазона и применить к нему форматирование, например.

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

Если вы ищете более продвинутое решение, я предлагаю прочитать страницу MSDN о FlowDocument , поскольку это дает вам большую гибкость при форматировании текста.

15 голосов
/ 26 марта 2011

Вы можете попробовать это.

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;

Так что используйте свойство Document RichTextBox

1 голос
/ 26 марта 2011

Вам необходимо использовать свойство Document RichTextBox и добавить к нему Run .

Свойство документа: http://msdn.microsoft.com/en-us/library/system.windows.controls.richtextbox.document.aspx
Прогон: http://msdn.microsoft.com/en-us/library/system.windows.documents.run.aspx

0 голосов
/ 19 апреля 2018

Я сделал свой собственный class для манипуляции Text с 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);
        }
    }
}

Использование

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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...