0

我创建了一个带有 4 个文本框和一个按钮的单个表单的 winform 项目。

单击按钮时,我执行以下操作:

Window1 w = new Window1();
ElementHost.EnableModelessKeyboardInterop(w);
w.Show();

其中窗口 1 是 Wpf 窗口。Window1 上有一个按钮,当单击该按钮时,会发生以下情况:

System.Windows.MessageBox.Show("HelloWOrld");

当您运行应用程序时,会弹出 WinForm 表单。如果你点击选项卡,它会在 4 个文本框之间循环,没问题。然后单击按钮打开 WPF 窗口。单击该按钮并弹出消息框。让它们保持打开状态,然后返回 WinForm 表单,您不能再通过选项卡浏览这些字段,但您可以键入其他字符。看起来好像文本框得到了击键,但表单没有得到它们。我还收到系统提示音,好像模型正在敲击键盘一样。

编辑 2014 年 9 月 9 日下午 3:44

汉斯在评论中回应并且是正确的。我尝试描述一个更简单的案例,让其他人更容易重现使用相同的症状。我们的实际问题是我们创建了一个窗口基类,它支持模态到父功能。这是我们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。

4

0 回答 0