8

我已经创建了一个 WPF 和 WinForm 应用程序,我需要做的是从 WPF 应用程序中打开 WinForm。两者都在同一个解决方案中,但它们是不同的项目。

我尝试了以下方法:

Dim newWinForm as New MainWindow
newWinForm.show()

我从这里找到了一个可能的解决方案: Opening winform from wpf application programmatically

但我不明白我到底要做什么。我希望你能帮助我。谢谢!

4

4 回答 4

10

通常,您需要将表单托管在WindowInteropHelper中,如下面的 WPF 窗口 Button.Click 事件处理程序中:

C#:

private void button1_Click(object sender, RoutedEventArgs e) {
  Form1 form = new Form1();
  WindowInteropHelper wih = new WindowInteropHelper(this);
  wih.Owner = form.Handle;
  form.ShowDialog();
}

VB:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    Dim form As New Form1()
    Dim wih As New WindowInteropHelper(Me)
    wih.Owner = Form.Handle
    form.ShowDialog()
End Sub

当然,您需要添加项目和 System.Windows.Forms.dll 的引用/导入

于 2013-05-16T00:38:33.440 回答
1

让我们假设你这两个项目被称为WPFAppand WinFormApp

它们都声明了一个MainWindow类,即主应用程序窗口。

为了WinFormApp MainWindowWPFApp应用程序中打开,您只需对WPFApp项目执行以下操作:

  1. 添加对WinFormApp项目的引用
  2. 添加对的引用System.Windows.Forms
  3. 创建一个新WinFormApp.MainWindow对象
  4. 呼唤Show()
于 2020-06-25T08:02:25.677 回答
0

特里的回答对我不起作用。我想返回我的 WPF 窗口,但后来我不得不将窗口的句柄作为参数添加到 ShowDialog() 方法。我可以解决这个问题。

在我的情况下,来自用户 dapi 的类似问题的解决方案效果更好:

var winForm = new MyFrm();
winForm.ShowDialog(new WpfWindowWrapper(Window.GetWindow(this)));

有一个小助手类:

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

    public IntPtr Handle { get; }
}
于 2022-01-30T18:43:25.717 回答
-3

从 WPF 应用程序加载 win 表单是不可能的。所以你可以这样做:

1-在winform项目中创建一个用户控件并将所有表单的元素添加到用户控件

public partial class myUserControl : UserControl, IDisposable 
{
...// All Form Code and element put here
}

2-创建一个 wpf 窗口并将 Grid 放入其中:

<Grid Name="grid">

</Grid>

3-在Wpf窗口后面的代码如下:

public partial class myWpfWindow: Window
{
    public myWpfWindow()
    {
        InitializeComponent();

        myUserControl = new myUserControl ();
        System.Windows.Forms.Integration.WindowsFormsHost winformHost = new 
             System.Windows.Forms.Integration.WindowsFormsHost();
        winformHost.Child = myUserControl;

        grid.Children.Add(winformHost);  // --> <Grid Name="grid">

    }

}

4-添加两个对项目的引用:WindowsFormsIntegration, System.Windows.Forms

于 2018-07-23T12:26:27.777 回答