在文本框中使特定文本加粗

17

嗨,目前我有一个文本框,在用户按下不同的按钮时向用户打印信息。我想知道是否有一种方法只将一些文本加粗,而其他文本则不加粗。

我尝试过以下方法:

textBox1.FontWeight = FontWeights.UltraBold;
textBox1.Text. = ("Your Name: " );
TextBox1.FontWeight = FontWeights.Regular;
textBox1.Text += (nameVar);

唯一的问题是,使用这种方式会使所有内容都加粗或全部不加粗。是否有一种方法可以做到这一点?我正在使用C#中的WPF项目。

欢迎任何评论或建议。 谢谢!

编辑:所以现在我正在尝试使用你们都建议的RichText框,但我似乎无法让任何东西显示出来:

// Create a simple FlowDocument to serve as the content input for the construtor.
FlowDocument flowDoc = new FlowDocument(new Paragraph(new Run("Simple FlowDocument")));
// After this constructor is called, the new RichTextBox rtb will contain flowDoc.
RichTextBox rtb = new RichTextBox(flowDoc);

rtb是我在WPF中创建的RichTextBox的名称。

谢谢


1
嗯,我不知道这是否能帮到你,但在S.W.F(System.Windows.Forms)命名空间中有一个RichTextBox类,它具有SelectionFont属性。虽然我不知道它是否适用于WPF。 - user744186
7个回答

13

使用RichTextBox,下面是我为这个问题编写的一个方法 - 希望它能帮到你 ;-)

/// <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
    { }
}

12
你可以在其他 TextBlockRun 中使用 TextBlock
<TextBlock>
    normal text
    <TextBlock FontWeight="Bold">bold text</TextBlock>
    more normal text
    <Run FontWeight="Bold">more bold text</Run>
</TextBlock>

1
如何以编程方式实现这个? - digz6666
2
通过将它们添加到"Inlines"集合中。 - svick

11
你需要使用一个 RichTextBox 来实现这个功能:
<RichTextBox Name="richTB">
  <FlowDocument>
    <Paragraph>
      <Run FontWeight="Bold">Your Name:</Run>
      <Run Text="{Binding NameProperty}"/>
    </Paragraph>
  </FlowDocument>
</RichTextBox>

但是你为什么想要“你的名字”可编辑呢?你肯定希望它作为单独的只读标签,对吧?

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

4
一个常规的 TextBox 只支持这些样式属性中的全有或全无设置。你可能需要看一下RichTextBox,但是你不能像之前所尝试的那样简单地为一个 Text 属性指定一组值 - 你需要通过 Document 属性使用 FlowDocument 来构建你的文本体。
如果想要了解使用 FlowDocument 的概述和示例,请阅读此文

我正在尝试在一个富文本框中使用基本的FlowDocument,但似乎没有任何反应——我正在使用来自MSDNA的示例:http://msdn.microsoft.com/en-us/library/ms597536.aspx。 - Johnston

1

看一下RichTextBox控件,它基本上与TextBox相同,但允许更多的自定义,并且当然可以使用富文本进行部分格式化。


0
jwillmer的答案对我来说有一些错误。这些问题通过添加以下内容得到解决:
using System.Drawing;

然后将输入更改为:

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

这是因为我的代码正在寻找 System.Windows.Controls.RichTextbox, 而不是 Windows.Forums.RichTextBox。以及 System.Windows.Media.Color 而不是 System.Drawing.Color

0

参考 jwillmer 的出色示例,我进行了一些调整,因为它对整个错误行进行了着色:

    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{ }
    }

此外,我在文本前后添加了唯一的标签来着色文本,然后将它们删除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接