从 Winforms 文本框键按下处理程序启动时,在 WPF 窗口加载时触发的默认按钮



>我正在WinForms TextBox的KeyDown处理程序中启动一个WPF窗口(使用ShowDialog)。WPF 窗口有一个按钮,其中 IsDefault = true。在文本框上按 Enter 后,WPF 访问键机制显然会在窗口加载后选取它并触发默认按钮。

从 WPF 文本框的 KeyDown 处理程序启动窗口时,不存在此问题。

寻找一种解决方法,以防止 WPF 窗口接收 Winforms 文本框中正在处理的按键。

下面是一些说明该问题的示例代码:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        var window = new System.Windows.Window();
        var button = new System.Windows.Controls.Button
        {
            IsDefault = true,
            Content = "OK",
        };
        button.Click += (s, args) => window.Close();
        window.Content = button;
        // window loads then immediately closes due to the default button being triggered
        window.ShowDialog();
    }
}

可能有更好的方法可以做到这一点,但改变

window.ShowDialog(); 

Dispatcher.CurrentDispatcher.Invoke(new Action(() => window.ShowDialog()));

为我提供了预期的行为。

我现在的黑客解决方案是在按钮的命令中放置一个保护条件,该条件仅在内容已呈现时才允许执行命令的其余部分(由 ContentRender 事件处理程序中设置的标志确定)。在我的特定方案(替换消息框)中,这工作正常,它可以本地化在一个地方,但如果存在,仍然在寻找更好的解决方案。

更新:小绵羊的解决方案(在 Dispatcher.Invoke 中显示对话框)要干净得多。

最新更新