我正在 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();
}
}
答案 0 :(得分:1)
可能有更好的方法,但更改
window.ShowDialog();
到
Dispatcher.CurrentDispatcher.Invoke(new Action(() => window.ShowDialog()));
给了我预期的行为。
答案 1 :(得分:0)
我现在的hacky解决方案是在按钮的命令中放入一个保护条件,只有在内容被渲染时才允许执行其余的命令(由ContentRendered事件处理程序中设置的标志确定)。在我的特定场景(替换消息框)中,这可以正常工作,并且可以在一个地方进行本地化,但如果存在,仍然可以寻找更好的解决方案。
更新:一个小羊的解决方案(显示Dispatcher.Invoke中的对话框)更清晰。