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

时间:2011-03-26 11:40:29

标签: c# wpf fonts textbox

有没有办法改变我希望放在TextBox或RichTextBox上的文本部分的颜色和字体。我正在使用C#WPF。

例如

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

可变字例如是Text1和Text2中的其他颜色和字体。是否有可能以及如何做到这一点?

4 个答案:

答案 0 :(得分:43)

如果你只想做一些快速着色,使用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);

如果您正在寻找更高级的解决方案,建议您阅读有关FlowDocument的MSDN页面,因为这样可以非常灵活地格式化文本。

答案 1 :(得分:15)

你可以尝试一下。

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;

因此,请使用RichTextBox的Document属性

答案 2 :(得分:1)

答案 3 :(得分:0)

我已经让自己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");

用法

==