4

问题:

  1. KeyUp 由主窗口中的网格处理 ( Grid_KeyUp)
  2. 主窗口显示一个子窗口(例如MessageBox.Show(...)
  3. 用户按 [Return] ( Keys.Return) 关闭MessageBox
  4. 主窗口实际上从 MessageBox 中的该按键获取 KeyUp 事件

我有一个非常简单的孤立样本,它显示了我遇到的问题。只需创建一个空的 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

奇怪的事实:

  1. 按 [Escape] 时我得到相同的行为(KEYUP: Escape被打印),但是当我按 [Space] 时,控制台不会打印出任何东西!
  2. e.Source 和 e.OriginalSource 指向主窗口中的按钮(这显然是错误的)。
  3. 如果您MessageBox.Show(...)在事件未由 out KeyUp 处理程序处理后立即放置断点(即输出为空)。

谁能向我解释发生了什么?

PS目标框架是:.NET 4 Client

4

1 回答 1

4

显然,当您按下 enter 或 escape 时,消息框会关闭,并且在您抬起按钮之前,MainWindow会获得焦点并捕获KeyPressaswell

空格键没有发生这种情况的原因是按下空格键会按下按钮,但在您自己释放空格键之前不会释放它。这意味着空格键在按钮“未按下”之前被释放,因此MessageBox只有在释放空格键后才会关闭,因此MainWindow不会捕捉按钮按下。

您可以通过按住空格键来测试这一点。 您会看到按钮被按住但直到您释放它才被按下。

MessageBox您可以创建一个在收盘后熄灭的标志。检查它是否是第一个KeyPress(也许检查它是否在关闭后不到 10 毫秒发生)然后忽略它。

我知道,它很丑,但我认为你无能为力(如果我是对的)

于 2012-04-17T07:22:52.140 回答