我创建了一个winform项目,其中包含一个包含4个文本框和一个按钮的表单。
点击按钮,我执行以下操作:
Window1 w = new Window1();
ElementHost.EnableModelessKeyboardInterop(w);
w.Show();
窗口1是Wpf窗口。 Window1上有一个按钮,单击该按钮时会发生以下情况:
System.Windows.MessageBox.Show("HelloWOrld");
运行应用程序时弹出WinForm表单。如果你点击tab它循环通过4个文本框没问题。然后单击按钮以打开WPF窗口。单击该按钮并弹出消息框。将它们保持打开状态,然后返回到WinForm表单,您不再可以在字段中进行选项卡,但您可以键入其他字符。看起来好像文本框得到了击键,但表格并没有得到它们。我也得到一个系统蜂鸣声,好像模型正在进行击键。
EDIT 9/9/2014 3:44 PM
汉斯在评论中回答并且是正确的。我尝试描述一个更简单的案例,让其他人更容易复制,使用相同的症状。我们的实际问题是我们已经创建了一个支持模态到父级功能的窗口基类。这是我们BaseWindow的相关代码
public class BaseWindow: Window
{
[DllImport("user32.dll")]
static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
public void ShowModalToParent(Window frmParent, Action<bool?> callback = null)
{
IntPtr myHandle = (new System.Windows.Interop.WindowInteropHelper(this)).Handle;
EnableWindow(myHandle,
SetForegroundWindow(myHandle);
this.Closing += Window_Closing;
ShowInTaskbar = false;
Owner = frmParent; // Keep on top of parent
ClosedCallBack += callback ?? (p => { _modalDialogResult = p; });
var parentHandle = (new System.Windows.Interop.WindowInteropHelper(frmParent)).Handle;
EnableWindow(parentHandle, false); // Prevent events for parent
new ShowAndWaitHelper(this).ShowAndWait();
}
internal class ShowAndWaitHelper
{
private readonly Window _window;
private DispatcherFrame _dispatcherFrame;
internal ShowAndWaitHelper(Window window)
{
if (window == null)
{
throw new ArgumentNullException("panel");
}
this._window = window;
}
internal void ShowAndWait()
{
if (this._dispatcherFrame != null)
{
throw new InvalidOperationException("Cannot call ShowAndWait while waiting for a previous call to ShowAndWait to return.");
}
this._window.Closed += new EventHandler(this.OnPanelClosed);
_window.Show();
this._dispatcherFrame = new DispatcherFrame();
Dispatcher.PushFrame(this._dispatcherFrame);
}
private void OnPanelClosed(object source, EventArgs eventArgs)
{
if (this._dispatcherFrame == null)
{
return;
}
this._window.Closed -= new EventHandler(this.OnPanelClosed);
this._dispatcherFrame.Continue = false;
this._dispatcherFrame = null;
}
}
}
我确定此代码来自某种类型的博客/论坛帖子,但我无法在代码中找到对它的任何引用。我们希望将模态保留为父模式,但有些如何解决奇数按键问题。要重现该问题,请将Window1中的button_click替换为在将其用作基类的窗口上调用ShowModalToParent。