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中文网其他相关文章!