【问题标题】:How do you show a Winforms dialog from a WPF window?如何从 WPF 窗口显示 Winforms 对话框?
【发布时间】:2011-08-22 19:17:03
【问题描述】:

这个问题的反面已经回答了很多次了。

public static void SetOwner(object activeWindow, object dialog)
{
    if (IsWindow(dialog) && IsWindow(activeWindow))
    {
        (dialog as Window).Owner = (activeWindow as Window);
    }
    else if (IsForm(dialog) && IsForm(activeWindow))
    {
        (dialog as Form).Owner = (activeWindow as Form);
    }
    else if (IsWindow(dialog) && IsForm(activeWindow))
    {
        var wih = new WindowInteropHelper(dialog as Window);
        wih.Owner = (activeWindow as Form).Handle;
    }
    else if (IsForm(dialog) && IsWindow(activeWindow))
    {
        var dialogForm = dialog as Form;
        var ownerWindow = activeWindow as Window;
        // What goes here?
    }           
}

【问题讨论】:

标签: wpf winforms


【解决方案1】:

为了扩展 SLaks 的答案,这里有一个此类的示例:

public class WpfWindowWrapper : System.Windows.Forms.IWin32Window
{
    public WpfWindowWrapper(System.Windows.Window wpfWindow)
    {
        Handle = new System.Windows.Interop.WindowInteropHelper(wpfWindow).Handle;
    }

    public IntPtr Handle { get; private set; }
}

它可以像这样从 WPF 窗口的代码隐藏中使用:

var winForm = new MyWinForm();
winForm.ShowDialog(new WpfWindowWrapper(this));

通过这种方式,Winform 对话框充当 WPF 窗口的适当子窗口,具有正确的模式行为。

【讨论】:

    【解决方案2】:

    您需要创建一个实现 WinForms IWin32Window 接口并返回 WPF 窗口句柄(使用 new WindowInteropHelper(window).Handle)的类,然后将其传递给表单的 ShowDialog

    【讨论】:

    • 我不得不稍微重构一下我的 IDialogService API,但新的解决方案现在效果很好。谢谢!
    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多