面板未获得焦点

面板未获得焦点

我继续在我的简单图形程序(使用C#)中编写某种键盘导航程序。我又一次遇到了麻烦。

我的问题是,我想要处理键盘输入,以移动一层左右。用鼠标移动图层已经很好了,但是控件没有得到焦点(此控件既不触发KeyUp/Keydown/KeyPress,也不触发GotFocus/LostFocus。)。因为我的类来自Panel(并且覆盖了几个事件),所以我也重写了上面提到的事件,但是我无法成功地触发这些事件。

我认为我可以使用类似Keyboard.GetState()或ProcessCmdWnd之类的工具来实现键盘响应。然而:我仍然必须能够知道控制什么时候得到了关注。

是否有某种优雅的方法将此功能添加到用户控件(这是基于Panel的)?

我在这里检查了很多线程,我可能会使用这种方法用于键盘输入。然而,焦点问题仍然存在。

非常感谢您事先提供的信息!

伊戈尔。

P.S.:我正在使用VS 2008用C#.NET v3.5编程。这是一个Windows,Forms应用程序,不是WPF.


慕桂英4014372
浏览 560回答 3
3回答

MMTTMM

Panel类被设计为容器,它避免了焦点,因此子控件总是会得到它。你需要做些手术来解决这个问题。我还添加了代码,以便在Keydown事件中获得光标键笔画: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);         }     }}

缥缈止盈

要获得焦点,请检查Properties窗口中的MouseEnter事件。编写以下代码:private void mainPanel_MouseEnter(object sender, EventArgs e){     mainPanel.Focus();}
打开App,查看更多内容
随时随地看视频慕课网APP