在 WinForms 中,點擊 Button 向 TextBox 插入特殊符號後,呼叫 `textBox1.Focus()` 讓焦點回到輸入框。但若 TextBox 已有文字,Focus() 會導致所有文字被預設選中,使用者需額外點擊才能取消選中,體驗極差。
WinForms 的 `TextBox.Focus()` 內部會呼叫 `SelectAll()` 當控制項首次獲得焦點或內容非空時,這是預設行為。
textBox1.Text += insertedChar; // 插入字元
textBox1.Focus();
// 關鍵兩行:將游標移至末尾並捲動到可見區域
textBox1.SelectionStart = textBox1.Text.Length;
textBox1.ScrollToCaret();
public static class TextBoxExtensions {
public static void AppendTextAndFocus(this TextBox tb, string text) {
tb.AppendText(text); // 比 += 更高效,不重置 Undo 堆疊
tb.Focus();
tb.SelectionStart = tb.TextLength;
tb.ScrollToCaret();
}
}
// 使用
textBox1.AppendTextAndFocus("§");
// 僅作為理解原理,實際專案請用上述屬性設定
SendKeys.SendWait("^{END}"); // Ctrl+End 移至末尾
textBox1.Focus();
textBox1.CaretIndex = textBox1.Text.Length;
textBox1.ScrollToEnd();
核心在於 `SelectionStart = Text.Length` + `ScrollToCaret()` 這組組合拳,徹底解決焦點恢復時的全選干擾,提升輸入流暢度。