Правильно изменить стиль шрифта одновременно
Как правильно изменить стиль шрифта текста, не используя много условий if / else if при проверке нескольких флажков?
PS. Я знаю, что использовать при наличии нескольких стилей в одном тексте, но я не хотел бы долго, если / иначе условия для его достижения.
Вот что у меня есть:
public void updateFont()
{
//Individual
if (checkBox_Bold.Checked)
fontStyle = fontFamily.Style | FontStyle.Bold;
if (checkBox_Italic.Checked)
fontStyle = fontFamily.Style | FontStyle.Italic;
if (checkBox_Underlined.Checked)
fontStyle = fontFamily.Style | FontStyle.Underline;
if (checkBox_StrikeOut.Checked)
fontStyle = fontFamily.Style | FontStyle.Strikeout;
if (!checkBox_Bold.Checked && !checkBox_Italic.Checked && !checkBox_Underlined.Checked && !checkBox_StrikeOut.Checked)
fontStyle = FontStyle.Regular;
fontFamily = new Font(cbox_FontFamily.SelectedItem.ToString(), Convert.ToInt32(fontSize), fontStyle);
pictureBox_Canvass.Invalidate();
}
2 ответа
Назначьте связанный
FontStyle
для каждогоCheckBox.Tag
собственность (вForm
конструктор, илиLoad
событие).Назначить один обработчик событий всем
CheckBoxes
CheckedChange
событие (здесь установлено в дизайнере; но, конечно, вы можете добавить его и в конструктор).FontStyle
это флаг. Ты можешь использовать|
добавить его и&~
удалить это.
При необходимости вы можете добавить условие для взаимного исключения стилей Подчеркнутый и Зачеркнутый.
FontStyle fontStyle = FontStyle.Regular;
public form1()
{
InitializeComponent();
this.chkBold.Tag = FontStyle.Bold;
this.chkItalic.Tag = FontStyle.Italic;
this.chkUnderline.Tag = FontStyle.Underline;
this.chkStrikeout.Tag = FontStyle.Strikeout;
}
private void chkFontStyle_CheckedChanged(object sender, EventArgs e)
{
CheckBox checkBox = sender as CheckBox;
FontStyle CurrentFontStyle = (FontStyle)checkBox.Tag;
fontStyle = checkBox.Checked ? fontStyle | CurrentFontStyle : fontStyle &~CurrentFontStyle;
lblTestFont.Font = new Font("Segoe UI", 10, fontStyle, GraphicsUnit.Point);
}
Как уже упоминалось Джими, но здесь вы также можете достичь своей цели с помощью LINQ.
private void UpdateTextBoxFontStyle()
{
var fs = System.Drawing.FontStyle.Regular;
var checkedStyles = Controls.OfType<CheckBox>()
.Where(x => x.Checked)
.Where(x => x.Tag is System.Drawing.FontStyle)
.Select(x => (System.Drawing.FontStyle) x.Tag).ToList();
foreach (var style in checkedStyles) fs |= style;
lblTestFont.Font = new System.Drawing.Font("Segoe UI", 9f, fs, System.Drawing.GraphicsUnit.Point);
}
И назначить CheckedChanged
обработчик событий для каждого флажка.
foreach (Control control in Controls)
if (control is CheckBox checkBox)
checkBox.CheckedChanged += (s, e) => UpdateTextBoxFontStyle();