我已经创建了一个 WPF 和 WinForm 应用程序,我需要做的是从 WPF 应用程序中打开 WinForm。两者都在同一个解决方案中,但它们是不同的项目。
我尝试了以下方法:
Dim newWinForm as New MainWindow
newWinForm.show()
我从这里找到了一个可能的解决方案: Opening winform from wpf application programmatically
但我不明白我到底要做什么。我希望你能帮助我。谢谢!
我已经创建了一个 WPF 和 WinForm 应用程序,我需要做的是从 WPF 应用程序中打开 WinForm。两者都在同一个解决方案中,但它们是不同的项目。
我尝试了以下方法:
Dim newWinForm as New MainWindow
newWinForm.show()
我从这里找到了一个可能的解决方案: Opening winform from wpf application programmatically
但我不明白我到底要做什么。我希望你能帮助我。谢谢!
通常,您需要将表单托管在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 的引用/导入
让我们假设你这两个项目被称为WPFApp
and WinFormApp
。
它们都声明了一个MainWindow
类,即主应用程序窗口。
为了WinFormApp
MainWindow
从WPFApp
应用程序中打开,您只需对WPFApp
项目执行以下操作:
WinFormApp
项目的引用System.Windows.Forms
WinFormApp.MainWindow
对象Show()
它特里的回答对我不起作用。我想返回我的 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; }
}
从 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