您需要处理PreviewKeyDown
事件的形式。然后检查是否要处理该事件,并且如果是这样,请在事件后将事件的Handled
属性设置为true
。
这可能会是这个样子:
public MainWindow()
{
InitializeComponent();
PreviewKeyDown += new KeyEventHandler(MainWindow_PreviewKeyDown);
}
void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Space)
{
Log("Intercepted space in preview");
e.Handled = true;
}
}
为什么你需要设置Handled
到true
? WPF中的事件在几个UI元素上触发,其方式取决于它的“路由策略”。当您的事件处理程序将Handled
设置为true
时,该事件的可见性将仅限于其他UI元素。很快,它不会在其他UI元素中触发。要详细了解上述解决方案的详细信息,请阅读以下答案的其余部分。
如果您想正确使用WPF中的事件,您需要了解一些事项。事件附加到UI元素(文本框,按钮等),事件处理程序可以连接到这些UI元素。而且,UI元素以树结构进行组织。每个元素都有其父元素,直到根UI元素。如前所述,根据“路由策略”在多个元素上触发事件。这里的多个元素意味着一个事件所针对的元素,它是父母,直到根元素为止。事件路由策略可以如下:
- 冒泡:事件首先被解雇事件的目标元素。然后,它的父项,然后是父项的父项,直到根元素为止(通常是Window)
- 隧道:首先针对根UI元素触发事件,然后关闭UI元素树,沿着目标元素的路线。
- 直接:仅针对目标元素触发事件。
这是如何与Handled
财产?当事件使用冒泡或隧道路由策略时,Handled
属性用于停止向下或向上UI元素树的传播。
现在,为什么KeyDown
事件在您将其标记为Handled
时停止传播?因为KeyDown
事件使用冒泡策略。这意味着一个文本框在处理KeyDown事件之前已经到达窗口处理程序,您可以在其中设置Handled
到true
。
因此,您应该使用使用隧道策略的PreviewKeyDown
。您的窗口处理程序检查事件,如果需要将其标记为Handled
。如果它被标记为Handled
它不会被触发到UI树到事件目标。
您可以将其视为.NET框架中的约定。 PreviewX
是使用隧道策略的事件,并且与使用bubbling
策略的X
事件相对应。
To learn more about Routed Events visit this MSDN page.你会发现MSDN是关于WPF的一个很好的信息来源。
让我们了解您已经尝试 – Fredrik 2013-03-19 16:22:22
添加一个事件处理程序代码。 – Emrys90 2013-03-19 16:23:27
我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2013-03-19 16:26:05