Making specific Text Boldefaced in a TextBox

a 夏天 提交于 2019-11-26 19:03:50

use a RichTextBox, below a method that i have wrote for this problem - hope it helps ;-)

/// <summary>
/// This method highlights the assigned text with the specified color.
/// </summary>
/// <param name="textToMark">The text to be marked.</param>
/// <param name="color">The new Backgroundcolor.</param>
/// <param name="richTextBox">The RichTextBox.</param>
/// <param name="startIndex">The zero-based starting caracter position.</param>
public static void ChangeTextcolor(string textToMark, Color color, RichTextBox richTextBox, int startIndex)
{
    if (startIndex < 0 || startIndex > textToMark.Length-1) startIndex = 0;

    System.Drawing.Font newFont = new Font("Verdana", 10f, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 178, false);
    try
    {               
        foreach (string line in richTextBox.Lines)
        { 
            if (line.Contains(textToMark))
            {
                richTextBox.Select(startIndex, line.Length);
                richTextBox.SelectionBackColor = color;
            }
            startIndex += line.Length +1;
        }
    }
    catch
    { }
}

You can use TextBlock with other TextBlocks or Runs inside:

<TextBlock>
    normal text
    <TextBlock FontWeight="Bold">bold text</TextBlock>
    more normal text
    <Run FontWeight="Bold">more bold text</Run>
</TextBlock>
Kent Boogaart

You will need to use a RichTextBox to achieve this:

<RichTextBox Name="richTB">
  <FlowDocument>
    <Paragraph>
      <Run FontWeight="Bold">Your Name:</Run>
      <Run Text="{Binding NameProperty}"/>
    </Paragraph>
  </FlowDocument>
</RichTextBox>

But why would you want "Your Name" to be editable? Surely you would want it as a separate, readonly, label?

<StackPanel Orientation="Horizontal">
    <Label FontWeight="Bold">Your Name:</Label>
    <TextBox Text="{Binding NameProperty}"/>
</StackPanel>

A regular TextBox only supports the all or nothing setting of such stylistic properties. You might want to look into RichTextBox, though, you can't just specify a set of values for a Text property in the way you have tried - you will need to work with a FlowDocument to construct your text body through the Document property.

For an overview of working with a FlowDocument, and some examples, give this a read.

Have a look at the RichTextBox Control it basically works the same as the TextBox but allows for more customization and takes, of course, Rich Text which allows for partial formatting..

Taking jwillmer's excellent example, I made some adjustments because it was coloring the entire error line for me:

    public static void ChangeTextcolor(string textToMark, Color color, RichTextBox richTextBox)
    {
        int startIndex = 0;

        string text = richTextBox.Text;
        startIndex = text.IndexOf(textToMark);

        System.Drawing.Font newFont = new Font("Verdana", 10f, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, 178, false);

        try
        {
            foreach (string line in richTextBox.Lines)
            {
                if (line.Contains(textToMark))
                {
                    richTextBox.Select(startIndex, textToMark.Length);
                    richTextBox.SelectionColor = color;
                    richTextBox.SelectionFont = newFont;
                }
            }
        }
        catch{ }
    }

Also, I added unique tags before and after the text to color to get the text, then removed them.

Kieron

jwillmer's answer had a few errors for me. These were solved by adding:

using System.Drawing;

and then changing the inputs to:

public static void ChangeTextcolor(string textToMark, System.Drawing.Color color, System.Windows.Forms.RichTextBox richTextBox, int startIndex)

This was because my code was looking for System.Windows.Controls.RichTextbox not Windows.Forums.RichTextBox. And System.Windows.Media.Color not System.Drawing.Color

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!