面板未获得焦点
我继续在我的简单图形程序中(使用 C#)编写某种键盘导航。而我又遇到了麻烦。
我的问题是我想处理键盘输入以移动图层。使用鼠标移动图层已经可以很好地工作,但控件未获得焦点(此控件既不会触发 KeyUp/KeyDown/KeyPress 也不会触发 GotFocus/LostFocus)。 由于我的类派生自Panel(并覆盖了几个事件),因此我也覆盖了上面提到的事件,但我无法成功触发这些事件。
我想我可以使用 Keyboard.GetState() 或 ProcessCmdWnd 之类的东西来实现键盘响应。但是:我仍然必须能够判断控件何时获得焦点。
是否有一种或多或少优雅的方式将此功能添加到用户控件(基于面板)?
我在这里检查了许多线程,我可能会使用这种方法用于键盘输入。然而焦点问题仍然存在。
非常感谢您提前提供信息!
伊戈尔.
ps:我正在使用 VS2008 使用 C# .NET v3.5 进行编程。它是一个 Windows.Forms 应用程序,不是 WPF。
I am continuing to program some kind of keyboard navigation in my simple graphic program (using C#). And I ran into trouble once again.
My problem is that I want to process the keyboard input to move a layer around. Moving the layer with the mouse already works quite well, yet the control doesn't get the focus (neither KeyUp/KeyDown/KeyPress nor GotFocus/LostFocus is triggered for this control).
Since my class derives from Panel (and overwrites a couple of events), I've also overwritten the events mentioned above, but I can't succeed in getting those events triggered.
I think I could manage to implement keyboard response either using something like Keyboard.GetState() or ProcessCmdWnd or something. However: I still have to be able to tell when the control got the focus.
Is there an more or less elegant way to add this ability to a user control (which is based on Panel)?
I've checked many threads in here and I might use this approach for keyboard input. The focus problem however still remains.
Thank you very much for information in advance!
Igor.
p.s.: I am programming in C# .NET v3.5, using VS2008. It's a Windows.Forms application, not WPF.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
Panel 类被设计为容器,它避免获取焦点,因此子控件将始终获得焦点。你需要做一些手术来解决这个问题。我还添加了代码以在 KeyDown 事件中获取光标击键:
The Panel class was designed as container, it avoids taking the focus so a child control will always get it. You'll need some surgery to fix that. I threw in the code to get cursor key strokes in the KeyDown event as well:
Hans Passant 的代码已翻译为 VB.NET
The code from Hans Passant translated to VB.NET
点击事件中调用焦点
call focus in click event
要获得焦点,请在“属性”窗口中检查 MouseEnter 事件。
写下下面的代码:
To get the focus,check for MouseEnter event in Properties window.
Write below code:
当由于任何原因我无法使用父 Form KeyPreview 属性来使 Form 处理按键事件时,我使用的最简单的技巧是在
面板上放置一个 Textbox:
并使用它来捕获 KeyDown 事件:
最后一步是设置当面板上的其他控件单击时,焦点集中到此文本框:
The simplest trick I use when for any reason I can’t use the parent Form KeyPreview property to make the Form handle key events, is to put a Textbox on
The panel:
And use it to capture KeyDown event:
The last step is to set focus to this TextBox when other controls on the panel clicked:
面板没有获得焦点,如果您想跟踪离开和输入事件,则必须选择面板,
在
MouseClick
事件中调用panel1.Select()
Panels are not getting focus, you have to select the panel if you want to track leave and enter events
call
panel1.Select()
inMouseClick
Event