Свойства шрифта C # richtextbox - PullRequest
1 голос
/ 25 марта 2012

Я сделал простой текстовый редактор. В нем доступно поле со списком для изменения семейства шрифтов, стиля и цвета. Я успешно изменил свойства шрифта выделенного текста. Мой код

private void fontFamilySelectedIndexChanged(object sender, EventArgs e)
        {
            if (notesCon[currentNotes].SelectedText != "")
            {
                notesCon[currentNotes].SelectionFont = new Font(fontFamily.SelectedItem.ToString(), notesCon[currentNotes].SelectionFont.Size, notesCon[currentNotes].SelectionFont.Style);                
            }
        }

        private void fontStyleSelectedIndexChanged(object sender, EventArgs e) 
        {
            if (notesCon[currentNotes].SelectedText != "")
            {
                switch (fontStyle.SelectedItem.ToString())
                {
                    case "Bold": notesCon[currentNotes].SelectionFont = new Font(notesCon[currentNotes].SelectionFont.FontFamily, notesCon[currentNotes].SelectionFont.Size, FontStyle.Bold);
                        break;
                    case "Italic": notesCon[currentNotes].SelectionFont = new Font(notesCon[currentNotes].SelectionFont.FontFamily, notesCon[currentNotes].SelectionFont.Size, FontStyle.Italic);
                        break;
                    case "Regular": notesCon[currentNotes].SelectionFont = new Font(notesCon[currentNotes].SelectionFont.FontFamily, notesCon[currentNotes].SelectionFont.Size, FontStyle.Regular);
                        break;
                    case "Strikeout": notesCon[currentNotes].SelectionFont = new Font(notesCon[currentNotes].SelectionFont.FontFamily, notesCon[currentNotes].SelectionFont.Size, FontStyle.Strikeout);
                        break;
                    case "Underline": notesCon[currentNotes].SelectionFont = new Font(notesCon[currentNotes].SelectionFont.FontFamily, notesCon[currentNotes].SelectionFont.Size, FontStyle.Underline);
                        break;

                }
            }            
        }

        private void fontColorSelectedValueChanged(object sender, EventArgs e)
        {
            if (notesCon[currentNotes].SelectedText != "")
            {
                notesCon[currentNotes].SelectionFont = new Font(fontFamily.SelectedItem.ToString(), notesCon[currentNotes].SelectionFont.Size, notesCon[currentNotes].SelectionFont.Style);
                notesCon[currentNotes].SelectionColor = fontColor.SelectedItem.Color;
            }
        }

моя дилемма:

Всякий раз, когда я пытаюсь установить текущие свойства шрифта расширенного текстового поля на новое, оно успешно изменяет его, но не сохраняет свойства шрифта предыдущего текста. Как я должен изменить свойства шрифта, не изменяя предыдущие свойства шрифта текста в поле расширенного текста? Помогите пожалуйста, заранее спасибо!

1 Ответ

0 голосов
/ 22 января 2014

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

private void ChangeFontStyleForSelectedText(string familyName, float? emSize, FontStyle? fontStyle, bool? enableFontStyle)
    {
        _maskChanges = true;
        try
        {
            int txtStartPosition = txtFunctionality.SelectionStart;
            int selectionLength = txtFunctionality.SelectionLength;
            if (selectionLength > 0)
                using (RichTextBox txtTemp = new RichTextBox())
                {
                    txtTemp.Rtf = txtFunctionality.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);
                    txtFunctionality.SelectedRtf = txtTemp.SelectedRtf;
                    txtFunctionality.Select(txtStartPosition, selectionLength);
                }
        }
        finally
        {
            _maskChanges = false;
        }
    }

и отрисовать шрифт:

/// <summary>
    /// Changes a font from originalFont appending other properties
    /// </summary>
    /// <param name="originalFont">Original font of text
    /// <param name="familyName">Target family name
    /// <param name="emSize">Target text Size
    /// <param name="fontStyle">Target font style
    /// <param name="enableFontStyle">true when enable false when disable
    /// <returns>A new font with all provided properties added/removed to original font</returns>
    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;
    }

Для получения дополнительной информации и действий вы можете прочитать эту статью:http://how -to-code-net.blogspot.ro / 2014/01 / как сделать пользовательский richtextbox-control.html

...