-->

奇怪KEYUP行为(主要形式处理来自孩子的事件?)(Weird KeyUp behaviour (m

2019-09-16 14:24发布

问题:

  1. KEYUP通过在主窗口中的网格处理( Grid_KeyUp
  2. 主窗口显示了一个子窗口(如MessageBox.Show(...)
  3. 用户按下[返回]( 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");
    }
}

如果您单击该按钮,然后按[返回]关闭MessageBox的输出窗口将打印:

KEYUP: Return

奇怪的事实:

  1. 按下时,我得到了相同的行为[逃生]( KEYUP: Escape获取打印),但是当我按下[空格]控制台不打印出来的东西!
  2. e.Source和e.OriginalSource点在主窗口中的按钮(其是,很明显,错误的)。
  3. 如果你把一个断点右后MessageBox.Show(...)的事件不会得到由出KEYUP处理器(即输出为空)来处理。

任何人都可以向我解释发生了什么?

PS目标框架是:.NET 4客户端

Answer 1:

显然正在发生的事情是,当你按下回车或逃生时,消息框关闭, 你抬起按钮之前的MainWindow获得焦点,并抓住了KeyPress以及

这是为什么不带空格发生的原因是,按空格键按下按钮下来, 但要等到释放自己的空格键不松开 。 这意味着之前的按钮是“未按下”,因此空格键释放MessageBox一次空格键被释放只关闭,所以MainWindow不赶按下按钮。

你可以拿在空格键进行测试。你会看到按钮被按下,但没有按,直到松开为止。

你可以prolly创建后熄灭标志MessageBox接近。 检查是否它是第一个KeyPress (也许检查它结束后发生的小于10毫秒),然后就忽略它。

我知道,它的丑陋,但我不认为有太多别的你可以做(​​如果我是正确的)



文章来源: Weird KeyUp behaviour (main form handles events from child?!)