当前位置:编程学习 > C#/ASP.NET >>

WPF里的窗口不能正确响应ESC键,郁闷了很久的问题

是这样的,我在父窗口里用ShowDialog()模态地弹出子窗口,父窗口、子窗口都有处理Escape键的KeyUp消息,目的是在Escape KeyUp时,关闭当前窗口,代码如下:

private void Window_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Escape)
    {
         this.Close();
    }
}

可是,那个子窗口死活就是接受不到Escape的KeyUp消息,反倒被父窗口给抢去了(结果两个窗口都关闭)。

xaml文件里都标有KeyUp="Window_KeyUp"了,搞不懂问题出在哪?哪位哥姐指点下,必有酬谢! --------------------编程问答-------------------- 有句代码是在子窗体接受键盘事件前父窗体先接受,可能你添加这个了 --------------------编程问答-------------------- 终于搞定了,总结如下,以惠后人:

首先,这里只针对ESC Key的Up消息,因为它比较特殊。

你在Window_KeyUp方法里对ESC Key的Up消息做了处理(比如调用this.Close()),但是却发现当你按下又松开ESC Key时,这个Up消息竟然被父窗口截获了,那么请检查:

1. 当前窗口(或父窗口)有没有这样的Button,其IsCancel属性为True。IsCancel为True的话,表示这个键会通过ESC来触发。(我的情况是,正好有一个Cancel button其IsCancel="True"——写到这里,我真想匾那个UI Designer)

2. 你是这样做的吗:在xaml文件的Window标签里加上KeyUp="Window_KeyUp",还是这样:在CS代码里 this.KeyDown += new KeyEventHandler(Window_KeyUp)?如果是后者,即使没有IsCancel为True的Button也会出现如上所述的情形。

Done. --------------------编程问答-------------------- mark. --------------------编程问答-------------------- 直接使用command中的ApplicationCommands.Stop
将private void Window_KeyUp(object sender, KeyEventArgs e)事件处理函数,改成command的处理函数例如StopCommand_Executed(...)

    <Page.CommandBindings>
        <CommandBinding Command="{x:Static ApplicationCommands.Stop}" 
                        Executed="StopCommand_Executed" />
    </Page.CommandBindings>

将原有的Button代码<Button KeyUp="Window_KeyUp" />
改成<Button Command="{x:Static ApplicationCommands.Stop}" />

平时开发过程中,如果不考虑太多的效率问题,应尽量使用系统自带的command进行Binding,
一方面,可以获得统一的处理,及通过CanExecute方法实现Button的Disable/Enable
另一方面,可以自动绑定一些所需的热键,例如:ApplicationCommands.Stop就是默认绑定Esc按键的
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,