如何修复RichTextBox复选框切换时已设置字体样式丢失问题?
解决RichTextBox字体样式切换时丢失之前设置的问题
嘿,这个问题我之前也踩过坑!你现在的写法是每次直接把字体样式替换成单一的Bold或者Italic,所以切换复选框的时候,之前设置的样式就被直接覆盖掉了。咱们得改成基于当前已有的字体样式,根据复选框的勾选状态来叠加或移除对应的样式,这样就能保留之前的设置啦。
问题根源
你原来的代码里,每次创建新Font对象时,只传入了单一的FontStyle参数,这会直接替换掉原来的所有样式,而不是在原有基础上修改。比如你先勾选加粗,再勾选斜体,斜体的代码会把字体样式改成纯斜体,之前的加粗就没了。
修复后的代码
我们可以通过按位运算来处理样式的叠加和移除:
- 用
|(按位或)来添加样式 - 用
& ~(按位取反后再按位与)来移除样式
下面是修改后的完整代码:
private void checkBox1_CheckedChanged(object sender, EventArgs e) { // 获取当前RichTextBox的字体样式 FontStyle currentStyle = richTextBox1.Font.Style; if (checkBox1.Checked) { // 勾选时,在现有样式基础上叠加加粗 richTextBox1.Font = new Font(richTextBox1.Font, currentStyle | FontStyle.Bold); } else { // 取消勾选时,从现有样式中移除加粗 richTextBox1.Font = new Font(richTextBox1.Font, currentStyle & ~FontStyle.Bold); } } private void checkBox2_CheckedChanged(object sender, EventArgs e) { FontStyle currentStyle = richTextBox1.Font.Style; if (checkBox2.Checked) { richTextBox1.Font = new Font(richTextBox1.Font, currentStyle | FontStyle.Italic); } else { richTextBox1.Font = new Font(richTextBox1.Font, currentStyle & ~FontStyle.Italic); } } private void checkBox3_CheckedChanged(object sender, EventArgs e) { FontStyle currentStyle = richTextBox1.Font.Style; if (checkBox3.Checked) { richTextBox1.Font = new Font(richTextBox1.Font, currentStyle | FontStyle.Underline); } else { richTextBox1.Font = new Font(richTextBox1.Font, currentStyle & ~FontStyle.Underline); } }
原理说明
currentStyle | FontStyle.Bold:把Bold对应的二进制位设为1,相当于在现有样式里加上加粗currentStyle & ~FontStyle.Bold:把Bold对应的二进制位设为0,相当于从现有样式里去掉加粗
这样不管你怎么切换复选框,每种样式都是独立添加或移除的,不会互相覆盖啦!
内容的提问来源于stack exchange,提问作者Ema_wat
相关产品推荐
相关产品推荐

