【问题标题】:Global PreviewKeyDown handler vs local PreviewKeyDown handler全局 PreviewKeyDown 处理程序与本地 PreviewKeyDown 处理程序
【发布时间】:2009-09-22 00:54:17
【问题描述】:

我的主窗口上有一个 PreviewKeyDown 处理程序,它处理向上和向下键,因此我可以使用键盘在我的控件之间导航。

现在我遇到的问题是,在某些文本框中我还想使用向上/向下键。这似乎是不可能的,因为其他处理程序似乎先吞下了密钥。

是否有可能当这些 TextBox 控件之一被聚焦时,它们首先获得向上/向下键,然后吞下它们,这样“全局”PreviewKeyDown 就无法获得它们?

当然,当这样的 TextBox 获得焦点时,我可以以某种方式禁用全局处理程序,但这是一种好的风格吗?

【问题讨论】:

    标签: c# .net wpf events navigation


    【解决方案1】:

    除了在全局键处理程序中过滤掉这些键之外,您实际上别无选择。

    您遇到此问题的原因是所有 Preview* 事件都是隧道式的,这意味着视觉树中较高的控件首先获取它们(从根开始)。您首先使用此事件的真正原因是导致您的问题。

    一个不太理想的选择是为TextBox.PreviewKeyDown 注册一个类处理程序(请参阅EventManager.RegisterClassHandler())。虽然这将在您的窗口的PreviewKeyDown 处理程序之前调用,但它将在您的应用程序中为所有TextBoxes 调用。这可能是也可能不是您想要的。

    【讨论】:

    • 但我可以派生自己的 TextBox,然后为该类注册处理程序?或者也许创建一个用户控件?
    • 我认为这可行,但我不确定。绝对值得一试。
    • 对不起,它不起作用。我使用了 EventManager.RegisterClassHandler(typeof(TextBox), TextBox.PreviewKeyDownEvent, new KeyEventHandler(WatchOutHandler)) 和其他变体,但似乎总是首先调用全局处理程序。
    • 我现在使用一个标志来停用我的全局处理程序,这将是最简单的解决方案^^
    猜你喜欢
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2012-12-31
    相关资源
    最近更新 更多