需求:模仿 Word,用戶選中文本時套用格式到選區;未選中文本(光標閃爍)時,後續輸入的文本自動套用當前選中的字體樣式。
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();
}
}
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 屬性代表「插入點格式」。