问题:
Grid_KeyUp
)MessageBox.Show(...)
)Keys.Return
)关闭MessageBox
我有一个非常简单的隔离样本,显示我遇到的问题。只需创建一个空的WPF项目并使用此XAML:
<Grid KeyUp="Grid_KeyUp">
<Button Click="Button_Click"></Button>
</Grid>
代码隐藏:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Grid_KeyUp(object sender, KeyEventArgs e)
{
Console.WriteLine("KEYUP: " + e.Key);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(this, "TEST");
}
}
如果单击按钮并按[Return]关闭MessageBox,输出窗口将打印:
KEYUP: Return
奇怪的事实:
KEYUP: Escape
打印)时会出现相同的行为,但是当我按[Space]时,控制台不打印任何内容!MessageBox.Show(...)
之后立即设置断点,则事件不会被KeyUp处理程序处理(即输出为空)。有人可以向我解释发生了什么吗?
PS Target框架是:.NET 4 Client
答案 0 :(得分:4)
显然,当您按下回车键或转义符时,消息框将关闭, 会在您抬起按钮之前MainWindow
获得焦点并抓住KeyPress
。
空格键没有发生这种情况的原因是,按空格键会按下按钮 ,但在您自行释放空格键之前不会释放它 。这意味着在按钮“未按下”之前释放空格键,因此MessageBox
仅在空格键释放后才会关闭,因此MainWindow
不会按下按钮。
您可以通过按住空格键来测试。 您将看到该按钮被按下但在您释放按钮之前未按下该按钮。
你可以在MessageBox
关闭后创建一个标志。检查它是否是第一个KeyPress
(并且可能检查它是否在关闭后不到10毫秒发生)然后忽略它。
我知道,它很难看,但我认为你还有很多事情可做(如果我是对的)