Как изменить FontStyle обратно в RichTextBox? - PullRequest
0 голосов
/ 31 марта 2020

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

private void btnBold_Click(object sender, EventArgs e)
        {
            if (rtbMakale.SelectionLength > 0)
            {
                if (isItBold())
                {
                    rtbMakale.SelectionFont = new Font(rtbMakale.SelectionFont,
                        FontStyle.Regular | rtbMakale.SelectionFont.Style);
                    rtbMakale.SelectionLength = 0;
                }
                else
                {
                    rtbMakale.SelectionFont = new Font(rtbMakale.SelectionFont,
                        FontStyle.Bold | rtbMakale.SelectionFont.Style);
                    rtbMakale.SelectionLength = 0;
                }

            }

            bool isItBold()
            {
                if (rtbMakale.SelectionFont.Bold)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Проблема здесь:

rtbMakale.SelectionFont = new Font(rtbMakale.SelectionFont,
                FontStyle.Regular | rtbMakale.SelectionFont.Style);

В этом случае SelectionFont.Style содержит флаг FontStyle.Bold. При использовании оператора OR в старом стиле все существующие стили, включая полужирный, сохраняются.

Вместо этого используйте логические операторы для удаления флага полужирного шрифта из стиля:

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

Прочитайте эту часть rtbMakale.SelectionFont.Style & ~FontStyle.Bold как побитовую операцию «Текущий стиль, а НЕ жирный»


Еще более простой подход - использовать оператор XOR в старом стиле с новым флагом, который вы хотите переключать. Таким образом, вам не нужно сначала проверять стиль.

private void btnBold_Click(object sender, EventArgs e)
{
    if (rtbMakale.SelectionLength > 0)
    {
        rtbMakale.SelectionFont = new Font(rtbMakale.SelectionFont,
            rtbMakale.SelectionFont.Style ^ FontStyle.Bold);
    }
}
1 голос
/ 31 марта 2020

Я отредактировал код, и он полностью функционален. Используя это, вы также можете легко выполнить много других операций форматирования. Ниже я также добавил ссылку, откуда я это получил.

private void button1_Click(object sender, EventArgs e)
    {

        if (_richTextBox1.SelectionLength > 0)
        {
            if (_richTextBox1.SelectionFont.Bold == false)
            {
                ChangeOrSetFont(_richTextBox1.SelectionFont.ToString(), _richTextBox1.SelectionFont.Size, FontStyle.Bold, true);
            }
            else
            {
                ChangeOrSetFont(_richTextBox1.SelectionFont.ToString(), _richTextBox1.SelectionFont.Size, FontStyle.Regular, true);
            }
        }
    }

    bool _maskChanges;

    private void ChangeFontStyleForSelectedText(string familyName, float? emSize, FontStyle? fontStyle, bool? enableFontStyle)
    {
        _maskChanges = true;
        try
        {
            int txtStartPosition = _richTextBox1.SelectionStart;
            int selectionLength = _richTextBox1.SelectionLength;
            if (selectionLength > 0)
                using (RichTextBox txtTemp = new RichTextBox())
                {
                    txtTemp.Rtf = _richTextBox1.SelectedRtf;
                    for (int i = 0; i < selectionLength; ++i)
                    {
                        txtTemp.Select(i, 1);
                        txtTemp.SelectionFont = RenderFont(txtTemp.SelectionFont, familyName, emSize, fontStyle, enableFontStyle);
                    }

                    txtTemp.Select(0, selectionLength);
                    _richTextBox1.SelectedRtf = txtTemp.SelectedRtf;
                    _richTextBox1.Select(txtStartPosition, selectionLength);
                }
        }
        finally
        {
            _maskChanges = false;
        }
    }

    private Font RenderFont(Font originalFont, string familyName, float? emSize, FontStyle? fontStyle, bool? enableFontStyle)
    {
        if (fontStyle.HasValue && fontStyle != FontStyle.Regular && fontStyle != FontStyle.Bold && fontStyle != FontStyle.Italic && fontStyle != FontStyle.Underline)
            throw new System.InvalidProgramException("Invalid style parameter to ChangeFontStyleForSelectedText");

        Font newFont;
        FontStyle? newStyle = null;
        if (fontStyle.HasValue)
        {
            if (fontStyle.HasValue && fontStyle == FontStyle.Regular)
                newStyle = fontStyle.Value;
            else if (originalFont != null && enableFontStyle.HasValue && enableFontStyle.Value)
                newStyle = originalFont.Style | fontStyle.Value;
            else
                newStyle = originalFont.Style & ~fontStyle.Value;
        }

        newFont = new Font(!string.IsNullOrEmpty(familyName) ? familyName : originalFont.FontFamily.Name,
                            emSize.HasValue ? emSize.Value : originalFont.Size,
                            newStyle.HasValue ? newStyle.Value : originalFont.Style);
        return newFont;
    }

    private void ChangeOrSetFont(string familyName, float? emSize, FontStyle? fontStyle, bool? enableFontStyle)
    {
        if (_richTextBox1.SelectionType == RichTextBoxSelectionTypes.Empty)
        {
            SetSelectionFont(familyName, emSize, fontStyle, enableFontStyle);
        }
        else
        {
            ChangeFontStyleForSelectedText(familyName, emSize, fontStyle, enableFontStyle);
        }
    }

    private void SetSelectionFont(string familyName, float? emSize, FontStyle? fontStyle, bool? enableFontStyle)
    {
        Font renderedFont = RenderFont(_richTextBox1.SelectionFont, familyName, emSize, fontStyle, enableFontStyle);
        _richTextBox1.SelectionFont = renderedFont;
    }

Вот ссылка:

http://how-to-code-net.blogspot.com/2014/01/how-to-make-custom-richtextbox-control.html

...