【问题标题】:Focusable Panel in WPFWPF 中的可聚焦面板
【发布时间】:2010-12-15 20:10:44
【问题描述】:

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

  • 用户在面板内单击以使其获得焦点
  • 在面板级别引发任何 KeyDownKeyUp 事件
  • 如果单击面板外的另一个可聚焦元素,则面板失去焦点

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

我错过了什么吗?

【问题讨论】:

    标签: wpf focus panel keydown


    【解决方案1】:

    经过更多调查,Panel 拥有键盘焦点并保持它直到按下箭头键或 TAB(这会启动焦点循环)。

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

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

    • 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(); 为焦点。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这就是我所理解的,但问题仍然存在:我需要什么才能使面板具有焦点?我希望扩展它(也许通过派生它)以赋予它该功能。
      • Mart,您可能需要从 IInputElement 派生面板?只是猜测
      猜你喜欢
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多