簡體   English   中英

在文本框中設置文本樣式

[英]Set text style in a textbox

我有一個文本框,其中有一些文本。 我想使用3個復選框來更改文本的樣式,以便如果選擇下划線和粗體,則文本將同時變為不帶輪廓的粗體,但是我不知道如何在不更改先前樣式的情況下向字體添加樣式屬性。 關於我該怎么做的任何想法? 謝謝。

要啟用一種字體樣式:

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替換為適當的樣式值。

這是一個演示LINQPad的小程序:

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

為什么這兩個技巧起作用?

這兩個技巧起作用的原因是, FontStyle枚舉用Flags標記,並且表示該枚舉是專門為允許這樣做而構造的。 請注意,編寫上面的代碼不需要Flags屬性,但是它的存在告訴我它可以工作。

原因是枚舉已按位值設置,每個字體樣式都有自己的單個位,用於指示該字體是否存在。

這意味着:

tb.Font = new Font(tb.Font, tb.Font.Style | FontStyle.Bold);

OR在新的一位中,將其設置為1,其他所有位保持不變。

和這個:

tb.Font = new Font(tb.Font, tb.Font.Style & ~FontStyle.Bold);

AND是與字體樣式相反的字體樣式,這可能需要一些解釋。

這個:

~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樣式並將該類應用於文本框屬性cssClass

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM