Dot-Net
設置 Form.KeyPreview = true 的缺點?
我想知道 Form.KeyPreview 屬性實際上有什麼用?為什麼它存在,通過將其設置為 true 我會“冒險”什麼?我想它一定有一些負面影響——否則它根本不應該存在(或者至少預設情況下是真的)?
編輯:我非常清楚它的作用。我在問為什麼。為什麼我必須將其設置為 true 才能觸發鍵盤事件?為什麼鍵盤事件不總是為表單觸發。什麼不只是標準行為?
我問的特殊原因是:我剛剛在我的應用程序的基本形式中設置了 KeyPreview = true,所有其他形式都繼承自該基本形式。我有什麼令人討厭的驚喜嗎?
Form.KeyPreview 有點不合時宜,繼承自用於表單設計的 Visual Basic 對像模型。回到 VB6 時代,您需要 KeyPreview 才能實現快捷鍵。在 Windows 窗體中不再需要,覆蓋 ProcessCmdKey() 是更好的解決方案:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == (Keys.Control | Keys.F)) { DoSomething(); // Implement the Ctrl+F short-cut keystroke return true; // This keystroke was handled, don't pass to the control with the focus } return base.ProcessCmdKey(ref msg, keyData); }但是支持 KeyPreview 以幫助 VB6 程序員軍團在 2000 年代初切換到 .NET。KeyPreview 或 ProcessCmdKey() 的目的是讓您的 UI 響應快捷鍵。鍵盤消息通常發送到具有焦點的控制項。Windows 窗體消息循環允許程式碼在控制項看到該消息之前先查看它。這對於快捷鍵很重要,為每個可能獲得焦點以檢測它們的控制項實現 KeyDown 事件是非常不切實際的。
將 KeyPreview 設置為 True 不會導致問題。表單的 KeyDown 事件將執行,只有當它具有對擊鍵執行某些操作的程式碼時才會產生影響。但請注意,它緊跟 VB6 用法,您看不到用於導航的擊鍵類型。就像游標鍵和 Tab、Escape 和 Enter 用於對話框一樣。ProcessCmdKey() 沒有問題。