0

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

从 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();
    }
}
4

2 回答 2

1

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

window.ShowDialog(); 

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

为我提供了预期的行为。

于 2012-06-20T23:02:53.397 回答
0

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

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

于 2012-06-21T15:43:00.010 回答