我需要在 WPF 中使 Panel 可聚焦,以便它像任何其他可聚焦控件一样捕获键盘事件:
- 用户在面板内单击以使其获得焦点
- 在小组级别提出任何
KeyDown
或事件KeyUp
- 如果单击面板外的另一个可聚焦元素,则面板失去焦点
我FocusManager.IsFocusScope="True"
在 Panel 上进行了实验并myPanel.Focus()
返回true
,但仍然没有调用 Panel KeyUp 事件处理程序。
我错过了什么吗?
经过更多调查,面板拥有键盘焦点并保持它,直到按下箭头键或 TAB(开始焦点循环)。
我刚刚KeyDown
使用 `e.Handled = true;' 为事件添加了一个处理程序 现在一切正常。
总而言之,要有一个可聚焦的面板:
FocusManager.IsFocusScope="True"
到面板myPanel.KeyDown += new KeyEventHandler( delegate(object sender, KeyEventArgs e) { if (e.Key == Key.Left || e.Key == Key.Up || e.Key == Key.Right || e.Key == Key.Down || e.Key == Key.Tab) e.Handled = true; } );
最后用myPanel.Focus();
.
如果您的面板不包含任何子元素,即使使用FocusManager.IsFocusScope="True"
也不会触发 GotFocus 事件。面板并非设计用于获取键盘输入或焦点。相反,大多数情况下(例如,如果子元素是 Button 控件) FocusManager.IsFocusScope="True"
甚至会占用 KeyUp/KeyDown 事件。您的控件和面板都不会触发该事件。