Правильно изменить стиль шрифта одновременно - PullRequest
0 голосов
/ 30 октября 2018

enter image description here

Как правильно изменить стиль шрифта текста, не используя много условий if / else if при установке нескольких флажков?

PS. Я знаю, что использовать при наличии нескольких стилей в одном тексте, но я не хочу, чтобы его выполняли длинные условия if / else.

Вот что у меня есть:

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 ]

0 голосов
/ 30 октября 2018

Как уже упоминал Джими, но здесь вы также можете достичь своей цели с помощью 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();
0 голосов
/ 30 октября 2018
  • Назначьте соответствующее 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);
 }


Set Font Style

...