C# 在文本框中设置文本样式

C# 在文本框中设置文本样式,c#,winforms,textbox,C#,Winforms,Textbox,我有一个文本框,里面有一些文本。使用3个复选框,我想更改文本的样式,这样如果我选择下划线和加粗,文本将同时变为不加粗和加粗,但我不知道如何在不更改以前样式的情况下向字体添加样式属性。你知道我该怎么做吗? 谢谢。要启用其中一种字体样式: tb.Font = new Font(tb.Font, tb.Font.Style | FontStyle.Bold); tb.Font = new Font(tb.Font, tb.Font.Style & ~FontStyle.Bold); 要禁用

我有一个文本框,里面有一些文本。使用3个复选框,我想更改文本的样式,这样如果我选择下划线和加粗,文本将同时变为不加粗和加粗,但我不知道如何在不更改以前样式的情况下向字体添加样式属性。你知道我该怎么做吗?
谢谢。

要启用其中一种字体样式:

tb.Font = new Font(tb.Font, tb.Font.Style | FontStyle.Bold);
tb.Font = new Font(tb.Font, tb.Font.Style & ~FontStyle.Bold);
要禁用其中一种字体样式,请执行以下操作:

tb.Font = new Font(tb.Font, tb.Font.Style | FontStyle.Bold);
tb.Font = new Font(tb.Font, tb.Font.Style & ~FontStyle.Bold);
这两个都将保留其他标志。请参阅此答案的底部,了解其工作原理

要根据复选框设置或清除标志,可以使用以下代码样式:

var style = tb.Font.Style & ~FontStyle.Bold; // first remove it
if (checkbox.Checked)
    style |= FontStyle.Bold;                 // add it if needed
在以上所有三个示例中,用适当的样式值替换
.Bold

下面是一个演示以下内容的小程序:

void Main()
{
    var c = new UserControl();
    var chkBold = new CheckBox();
    var chkItalic = new CheckBox();
    var chkUnderline = new CheckBox();
    var tb = new TextBox();
    c.Controls.AddRange(new Control[] { chkBold, chkItalic, chkUnderline, tb });

    chkBold.Location = new Point(8, 8);
    chkBold.Text = "Bold";
    chkBold.CheckedChanged += (sender, e) =>
    {
        var style = tb.Font.Style & ~FontStyle.Bold;
        if (chkBold.Checked)
            style |= FontStyle.Bold;
        tb.Font = new Font(tb.Font, style);
    };

    chkItalic.Location = new Point(8, 32);
    chkItalic.Text = "Italic";
    chkItalic.CheckedChanged += (sender, e) =>
    {
        var style = tb.Font.Style & ~FontStyle.Italic;
        if (chkItalic.Checked)
            style |= FontStyle.Italic;
        tb.Font = new Font(tb.Font, style);
    };

    chkUnderline.Location = new Point(8, 56);
    chkUnderline.Text = "Underline";
    chkUnderline.CheckedChanged += (sender, e) =>
    {
        var style = tb.Font.Style & ~FontStyle.Underline;
        if (chkUnderline.Checked)
            style |= FontStyle.Underline;
        tb.Font = new Font(tb.Font, style);
    };

    tb.Location = new Point(8, 80);
    tb.Text = "Try it";

    c.Dump();
}

这两个技巧为什么有效? 这两个技巧起作用的原因是枚举被标记为
标志
,并且表示枚举是专门构造的,以允许这样做。请注意,编写上述代码不需要
Flags
属性,但它的存在告诉我它可以工作

原因是枚举已设置为逐位值,其中每个字体样式都有自己的单个位,用于指示样式是否存在

这意味着:

tb.Font = new Font(tb.Font, tb.Font.Style | FontStyle.Bold);
或者在一个新的位中,将其设置为1,保留所有其他位不变

这是:

tb.Font = new Font(tb.Font, tb.Font.Style & ~FontStyle.Bold);
这是与字体样式相反的字体样式,这可能需要一些解释

这:

获取值,其中包含1位设置为1,即指定给粗体样式的位,并对整个值进行求反/求反,将所有位设置为其相反的值

这意味着除指定给粗体样式的位外,所有位都将被设置

然后,当我们使用现有的字体样式值和它进行比较时,我们会有效地删除该位,并保留所有其他位不变。

尝试以下方法:

 private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        //bold checkbox is changed
        if (checkBox1.Checked && checkBox2.Checked)
        {
            textBox1.Font = new Font(textBox1.Font.FontFamily,textBox1.Font.Size, ((FontStyle)((FontStyle.Bold | FontStyle.Underline))));
        }
        else if (checkBox1.Checked)
        {
            textBox1.Font = new Font(textBox1.Font.FontFamily,textBox1.Font.Size, FontStyle.Bold);
        }
    }

    private void checkBox2_CheckedChanged(object sender, EventArgs e)
    {
        //unerline checkbox is changed
        if (checkBox1.Checked && checkBox2.Checked)
        {
           textBox1.Font = new Font(textBox1.Font.FontFamily,textBox1.Font.Size, ((FontStyle)((FontStyle.Bold | FontStyle.Underline))));
        }
        else if (checkBox2.Checked)
        {
            textBox1.Font = new Font(textBox1.Font.FontFamily,textBox1.Font.Size, FontStyle.Bold);
        }
    }

您可以编写css样式并将该类应用于textbox属性
cssClass

共享您正在使用的一些代码。非常感谢,它非常完美!这个问题是针对Winforms的。不清楚是不是,但显然是的。