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

C# TextBox Focus() 導致全選文字的解決方案

     編輯:程式設計綜合問答

問題場景

在 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(不推薦)

// 僅作為理解原理,實際專案請用上述屬性設定
SendKeys.SendWait("^{END}"); // Ctrl+End 移至末尾

WPF 專屬寫法

textBox1.Focus();
textBox1.CaretIndex = textBox1.Text.Length;
textBox1.ScrollToEnd();

總結

核心在於 `SelectionStart = Text.Length` + `ScrollToCaret()` 這組組合拳,徹底解決焦點恢復時的全選干擾,提升輸入流暢度。

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