wpf - 在 XAML WPF 中插入 Winforms 表单

标签 wpf winforms interop

我正在尝试将 WinForms 表单集成到 WPF XAML 页面中。 我见过使用 WindowsFormsHost 放置 Windows 窗体控件的示例,但没有见过集成整个窗体的示例。

有办法吗? Windows 窗体托管在 WPF 应用程序内部,目前我可以将其作为新窗口加载,但不能加载到 XAML 页面内。

最佳答案

将 WinForms 表单放入 WPF 表单中的 WindowsFormsHost 标记内是一个错误。但是您可以从任何 WPF 项目实例化新表单。方法如下:

假设您有两个项目“WinFormProj”和“WPFProj”。 WinFormProj 有一个名为“登录”的表单。

首先在WPFProj项目中添加对WinFormProj的引用。

然后在任何 WPFProj 元素中的任何事件后面,执行以下操作:

var winFormWindow = new WinFormProj.Login();  
winFormWindow.Show();  
// or  
windFormWindow.ShowDialog();  

如果这不起作用,您可以将 WinForms 表单转换为用户控件,该控件存在于 WindowsFormsHost WPF 标记中。要做到这一点,通常很简单......

转到类声明并更改:

public class Login : Form

public class Login : UserControl

接下来,在 WPF 表单中,将 WinForms 项目添加为 xml 命名空间:

xmlns:winForms="clr-namespace:WinFormsProj;assembly=WinFormsProj"

最后,将其添加到您的 Grid/StackPanel/任何您希望托管用户控件的位置:

<WindowsFormsHost Name="LoginControl">
    <winForms:LogIn />
</WindowsFormsHost>

一旦你揭开它的神秘面纱,就会变得非常简单。

关于wpf - 在 XAML WPF 中插入 Winforms 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3204728/

相关文章:

c# - App.xaml MVVM指示灯中的空引用错误

c# - ItemsControl 中的 ScrollViewer - ScrollBar 未显示但有效

c# - 无法在 ControlTemplate 中引用控件

c# - PInvoke - 读取字符串字段的值 - "Attempted to read or write protected memory"

c# - 如何获得使用范围内的整个列?

c# - WPF - 将文本框的内容绑定(bind)到其他文本框

c# - "SelectedIndexChanged"在 ListBox 中的 "Items.Clear()"之后不触发

c# - 取消已初始化并在另一个事件处理程序方法中运行的任务

c# - 如何以编程方式删除 Windows 媒体播放列表

vba - 为什么我们需要 Application.PathSeparator?