首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# RichTextBox 實現 Word 風格「光標處輸入套用格式」功能

     編輯:程式設計綜合問答

需求:模仿 Word,用戶選中文本時套用格式到選區;未選中文本(光標閃爍)時,後續輸入的文本自動套用當前選中的字體樣式。

核心原理:SelectionLength = 0 也是選區

RichTextBox 的 SelectionStart、SelectionLength 定義了「當前選區」。當用戶未選中文本時,SelectionLength == 0,但 SelectionStart 指向光標位置。此時設置 SelectionFont/SelectionColor 等屬性,會影響緊隨其後輸入的字符。

實現代碼

public partial class EditorForm : Form {
    // 工具欄字體下拉框選中事件
    private void fontComboBox_SelectedIndexChanged(object sender, EventArgs e) {
        ApplyFontToSelectionOrCaret();
    }
    
    // 顏色按鈕點擊事件
    private void colorButton_Click(object sender, EventArgs e) {
        ApplyColorToSelectionOrCaret();
    }
    
    // 統一應用邏輯
    private void ApplyFontToSelectionOrCaret() {
        if (richTextBox1.SelectionLength > 0) {
            // 有選中文本:套用到選區
            richTextBox1.SelectionFont = new Font(
                fontComboBox.SelectedItem.ToString(),
                richTextBox1.SelectionFont?.Size ?? 12f,
                richTextBox1.SelectionFont?.Style ?? FontStyle.Regular
            );
        } else {
            // 無選中文本:設置「輸入格式」(光標位置)
            richTextBox1.SelectionFont = new Font(
                fontComboBox.SelectedItem.ToString(),
                (float)fontSizeNumeric.Value,
                FontStyle.Regular
            );
        }
        richTextBox1.Focus(); // 保持焦點,否則輸入格式會丟失
    }
    
    private void ApplyColorToSelectionOrCaret() {
        Color color = colorDialog.Color;
        if (richTextBox1.SelectionLength > 0) {
            richTextBox1.SelectionColor = color;
        } else {
            richTextBox1.SelectionColor = color; // 同樣屬性,光標處生效
        }
        richTextBox1.Focus();
    }
}

關鍵細節

  • Focus 保持:設置完 SelectionFont 後必須 Focus(),否則用戶點擊別處再輸入時格式會重置為默認
  • 字體大小繼承:有選區時保持原大小(SelectionFont?.Size),無選區時用工具欄設置的大小
  • 組合格式:粗體/斜體/下劃線同理,操作 SelectionFont.Style(位運算)
  • 防止閃爍:批量設置時用 richTextBox1.SuspendLayout() / ResumeLayout()

進階:工具欄狀態同步(光標移動時更新按鈕狀態)

private void richTextBox1_SelectionChanged(object sender, EventArgs e) {
    if (richTextBox1.SelectionFont != null) {
        fontComboBox.SelectedItem = richTextBox1.SelectionFont.FontFamily.Name;
        fontSizeNumeric.Value = (decimal)richTextBox1.SelectionFont.Size;
        boldButton.Checked = richTextBox1.SelectionFont.Bold;
        italicButton.Checked = richTextBox1.SelectionFont.Italic;
        underlineButton.Checked = richTextBox1.SelectionFont.Underline;
    }
    if (richTextBox1.SelectionColor != Color.Empty) {
        colorButton.BackColor = richTextBox1.SelectionColor;
    }
}

這就是 Word 「所見即所得」編輯器的核心機制:選區長度為 0 時,Selection 屬性代表「插入點格式」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved