【问题标题】:Equivalent of 'KeyPreview' property in WinRT MetroWinRT Metro 中“KeyPreview”属性的等效项
【发布时间】:2012-07-18 21:49:18
【问题描述】:

我正在编写一个 Metro 应用程序,在该应用程序中,只要用户开始输入,焦点就可以跳转到单个文本框。但是我无法弄清楚如何在本地实现此功能,而无需修改其他用户控件以检测 keydown 并将焦点转发到文本框。

在 WinForms 中,我会使用表单的“KeyPreview”属性,这会导致表单控件中的任何按键都触发表单 KeyDown/KeyPress/KeyUp 事件。我在地铁中找不到任何等价物。

我尝试了一种简单的解决方案,即在文本框离开时强制将焦点集中在文本框上,但这存在明显的问题(例如,当您单击并按住按钮时,按钮会闪烁而不是保持突出显示)。

如何确保任何键盘输入都转到特定的文本框?

【问题讨论】:

    标签: c# .net keyboard microsoft-metro windows-runtime


    【解决方案1】:

    事件需要放置在当前核心窗口上,这是所有控件嵌套的根元素。

    Windows.UI.Xaml.Window.Current.CoreWindow.KeyDown += (sender, arg) => {
        // invoked anytime a key is pressed down, independent of focus
    }
    

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 要么文档有误,要么我遇到了特殊情况。我已经尝试将 KeyDown 处理程序放在顶级控件上。如果我只是单击一个可以像按钮一样具有焦点的控件,它会起作用,但如果我单击背景则不会。
      【解决方案3】:

      在您的 xaml 代码中,您将这些事件绑定到页面::

          Loaded="pageRoot_Loaded_1"
          Unloaded="pageRoot_Unloaded_1"
      

      在这些方法中,你必须为 keydown 或 keypress 绑定和取消绑定你的事件

          private void pageRoot_Loaded_1(object sender, RoutedEventArgs e)
          {
          Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;
          }
      
          private void pageRoot_Unloaded_1(object sender, RoutedEventArgs e)
          {
              Window.Current.CoreWindow.KeyDown -= CoreWindow_KeyDown;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多