寫 WinForm 的 Focus Event 常常要考慮到「鍵盤事件 (KeyBoard Evnet)」與「滑鼠事件 (Mouse Evnet)」,
這兩個事件都相同只是觸發順序不太相同。
鍵盤事件 (KeyBoard Evnet)
觸發條件
- 1. 使用鍵盤 (Tab、Shift Tab等)
- 2. 使用 Select() 或 SelectNextControl() 方法
- 3. ContainerControl.ActiveControl 屬性改變
焦點事件發生順序
- 1. Enter: 發生於輸入控制項時。
- 2. GotFocus: 此元素取得邏輯焦點時發生。
- 3. Leave: 發生於輸入焦點離開控制項時。
- 4. Validating: 正在驗證控制項時發生。
- 5. Validated: 發生於控制項完成驗證時。
- 6. LostFocus: 發生於控制項遺失焦點時。
滑鼠事件 (Mouse Evnet)
觸發條件
- 1. 使用滑鼠點擊
- 2. 使用 Focus() 方法
焦點事件發生順序
- 1. Enter: 發生於輸入控制項時。
- 2. GotFocus: 此元素取得邏輯焦點時發生。
- 3. LostFocus: 發生於控制項遺失焦點時。
- 4. Leave: 發生於輸入焦點離開控制項時。
- 5. Validating: 正在驗證控制項時發生。
- 6. Validated: 發生於控制項完成驗證時。
事件注意
- 1. GotFocus 和 LostFocus 事件觸發條件都是接收Windows 底層訊息「WM_KILLFOCUS」與「WM_SETFOCUS」。
- 2. 大多控制項都會使用 Enter 和 Leave 事件,較不會使用GotFocus 和 LostFocus 事件。
- 3. 若是要撰寫自訂控制項時,才會使用到 GotFocus 和 LostFocus 事件。
- 4. CausesValidation 屬性設定爲 False,Validating 和 Validated 事件會被取消。
- 5. 若觸發 Validating 事件時,CancelEventArgs 的 Cancel 屬性設置爲 True, 一般情況 Validating 事件結束後,所有事件都會被取消,且焦點不會離開該控制項。
- 6. Form 的 Activated和Deactivate事件,可中斷 控制項 Enter 和 Leave 事件。
- 7. 盡量避免使用 LostFocus 事件處理焦點設定,使用 LostFocus 事件容易導致整個應用程序或操作系統停止回應。
- 8. 更多細節可以參考MSDN。
參考文獻: http://tc.chinawin.net/it/softwaredev/article-2543a.html