从Winforms TextBox KeyDown处理程序启动时,在WPF窗口加载时触发默认按钮

时间:2012-06-20 21:52:44

标签: wpf winforms

我正在 Winforms TextBox的KeyDown处理程序中启动 WPF 窗口(使用ShowDialog)。 WPF窗口有一个IsDefault = true的按钮。按下TextBox上的Enter后,WPF AccessKey机制显然在窗口加载后将其拾取并触发默认按钮。

从WPF TextBox的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();
    }
}

2 个答案:

答案 0 :(得分:1)

可能有更好的方法,但更改

window.ShowDialog(); 

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

给了我预期的行为。

答案 1 :(得分:0)

我现在的hacky解决方案是在按钮的命令中放入一个保护条件,只有在内容被渲染时才允许执行其余的命令(由ContentRendered事件处理程序中设置的标志确定)。在我的特定场景(替换消息框)中,这可以正常工作,并且可以在一个地方进行本地化,但如果存在,仍然可以寻找更好的解决方案。

更新:一个小羊的解决方案(显示Dispatcher.Invoke中的对话框)更清晰。