C# 中 Panel 鍵盤焦點問題的解決方案
在 GUI 程式設計中,控制項獲得焦點以方便鍵盤互動通常是必要的。然而,C# Windows.Forms 應用程式中的 Panel 類別傾向於將焦點轉移到其子控件,這使得直接向面板本身處理鍵盤輸入變得具有挑戰性。
問題:Panel 無法取得焦點
一位開發者遇到了一個問題,即從 Panel 派生的自訂控制項無法接收鍵盤焦點。對於此控件,KeyUp/KeyDown/KeyPress 和 GotFocus/LostFocus 等事件仍然不會觸發。
解決方案:將 Panel 轉換為可取得焦點的使用者控制項
為了解決這個問題,這位開發者提出了一個優雅的解決方案,擴展了 Panel 的功能:
<code class="language-csharp">using System; using System.Drawing; using System.Windows.Forms; class SelectablePanel : Panel { public SelectablePanel() { this.SetStyle(ControlStyles.Selectable, true); this.TabStop = true; } protected override void OnMouseDown(MouseEventArgs e) { this.Focus(); base.OnMouseDown(e); } protected override bool IsInputKey(Keys keyData) { if (keyData == Keys.Up || keyData == Keys.Down) return true; if (keyData == Keys.Left || keyData == Keys.Right) return true; return base.IsInputKey(keyData); } protected override void OnEnter(EventArgs e) { this.Invalidate(); base.OnEnter(e); } protected override void OnLeave(EventArgs e) { this.Invalidate(); base.OnLeave(e); } protected override void OnPaint(PaintEventArgs pe) { base.OnPaint(pe); if (this.Focused) { var rc = this.ClientRectangle; rc.Inflate(-2, -2); ControlPaint.DrawFocusRectangle(pe.Graphics, rc); } } }</code>
此程式碼完成了一些關鍵修改:
使用 SelectablePanel 的好處
透過應用此程式碼,開發者增強了其自訂的 Panel 派生控件,使其具有無縫的鍵盤焦點擷取和導航功能。它巧妙地解決了 Panel 無法獲取焦點的難題,使其圖形程式能夠有效地進行鍵盤互動。
以上是如何使 C# 面板控制項接收鍵盤焦點?的詳細內容。更多資訊請關注PHP中文網其他相關文章!