6

我需要在 WPF 中使 Panel 可聚焦,以便它像任何其他可聚焦控件一样捕获键盘事件:

  • 用户在面板内单击以使其获得焦点
  • 在小组级别提出任何KeyDown或事件KeyUp
  • 如果单击面板外的另一个可聚焦元素,则面板失去焦点

FocusManager.IsFocusScope="True"在 Panel 上进行了实验并myPanel.Focus()返回true,但仍然没有调用 Panel KeyUp 事件处理程序。

我错过了什么吗?

4

2 回答 2

3

经过更多调查,面板拥有键盘焦点并保持它,直到按下箭头键或 TAB(开始焦点循环)。

我刚刚KeyDown使用 `e.Handled = true;' 为事件添加了一个处理程序 现在一切正常。

总而言之,要有一个可聚焦的面板:

  • 添加FocusManager.IsFocusScope="True"到面板
  • 防止失去对箭头和 Tab 键的关注:
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();.

于 2009-11-12T13:23:38.140 回答
1

如果您的面板不包含任何子元素,即使使用FocusManager.IsFocusScope="True"也不会触发 GotFocus 事件。面板并非设计用于获取键盘输入或焦点。相反,大多数情况下(例如,如果子元素是 Button 控件) FocusManager.IsFocusScope="True"甚至会占用 KeyUp/KeyDown 事件。您的控件和面板都不会触发该事件。

于 2009-11-12T11:36:10.473 回答