【发布时间】:2014-03-05 19:04:48
【问题描述】:
我有一个文本框,里面有一些文本。使用 3 个复选框我想更改文本的样式,这样如果我选择下划线和粗体,文本会同时变为未划线和粗体,但我不知道如何在不更改以前样式的情况下向字体添加样式属性.关于我该怎么做的任何想法? 谢谢。
【问题讨论】:
-
分享一些你正在使用的代码。
我有一个文本框,里面有一些文本。使用 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的字体样式与字体样式的inverse,这可能需要一些解释。
这个:
~FontStyle.Bold
取值,包含设置为 1 的 1 位,分配给粗体样式的位,并对整个值取反/取反,将所有位设置为相反的值。
这意味着这个的所有位都将被设置,除了分配给粗体样式的那个。
然后,当我们将其与现有的字体样式值 AND 时,我们有效地删除了该位,而所有其他位保持不变。
【讨论】:
您可以编写 css 样式并将该类应用于文本框属性 cssClass
【讨论】:
试试这个:
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);
}
}
【讨论】: