2009-09-22 65 views
0

我有一个PreviewKeyDown处理程序在我的mainwindow上处理向上和向下键,所以我可以用我的控件之间的键盘导航。全局PreviewKeyDown处理程序vs本地PreviewKeyDown处理程序

现在我有问题了,在一些文本框中我也想使用上/下键。这似乎是不可能的,因为其他处理程序似乎首先吞下了键。

是否有可能当这些TextBox控件中的一个被关注时,他们首先获取上/下键,然后吞下它们以便“全局”PreviewKeyDown不会获取它们?

当然,我可以以某种方式禁用全局处理程序,当这样一个TextBox得到了重点,但是这种良好的风格?

回答

1

除了在全局密钥处理程序中过滤掉这些密钥之外,并没有真正的选项。

你遇到这个问题的原因是,所有的预览*事件都是隧道效应,这意味着可视树中的控件更高,让它们首先(从根开始)。首先使用这个事件的原因正是导致你的问题。

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

+0

但我可以派生自己的TextBox,然后注册该类的处理程序?或者也许创建一个用户控件? – codymanix 2009-09-22 10:51:17

+0

我认为这样会有效,但我不确定。这绝对值得一试。 – Andy 2009-09-22 18:25:25

+0

抱歉,它不起作用。我使用了EventManager.RegisterClassHandler(typeof(TextBox),TextBox.PreviewKeyDownEvent,new KeyEventHandler(WatchOutHandler))和其他变体,但全局处理程序似乎总是被首先调用。 – codymanix 2009-09-22 19:01:45