【发布时间】:2011-01-18 14:10:25
【问题描述】:
有没有办法在 WPF 表单中的某种容器或包装器类型控件中托管/显示完整的 WinForms 表单(不仅仅是单个控件)?我正在寻找在概念上类似于 php 中的虚拟包含或 html 中的 iframe 的东西。可能通过将其编译成 OCX 或 DLL。
【问题讨论】:
标签: c# wpf visual-studio-2008 winforms-interop
有没有办法在 WPF 表单中的某种容器或包装器类型控件中托管/显示完整的 WinForms 表单(不仅仅是单个控件)?我正在寻找在概念上类似于 php 中的虚拟包含或 html 中的 iframe 的东西。可能通过将其编译成 OCX 或 DLL。
【问题讨论】:
标签: c# wpf visual-studio-2008 winforms-interop
据我所知,您无法在 WPF 中托管实际的 WinForms 表单。
然而,一个好的替代方法是在 WinForms(作为 Windows 窗体控件库项目)中创建一个包含所有必需功能和子控件的普通 UserControl。
然后在您的 WPF 项目中,引用 WindowsFormsIntegration.dll(应该在添加引用的 .NET 选项卡中)。
然后还引用包含 WinForms UserControl 的程序集,最后将 WindowsFormsHost 容器添加到 XAML。
有关更多信息,请参阅 Sacha Barber 的 useful tutorial。
【讨论】:
CodeProject 上有一篇文章展示了如何在 WinForms 上托管一个 exe 作为控件(这是一个使用标签页的应用程序,将 Winform.exe 拖到它上面,它会创建一个带有该窗口的标签页),来源于这篇文章here。我知道您特别要求 WPF,但也许这可能会引导您朝着正确的方向前进?
希望这会有所帮助, 最好的祝福, 汤姆。
【讨论】:
您可以使用以下代码:
在您的 XAML 中:
<WindowsFormsHost name="wfHost" />
在您的代码隐藏中:
Form foo = new Form();
foo.TopLevel = false;
foo.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
wfHost.Child = foo;
【讨论】:
TopLevel。用于在 .NET Compact 1.1 中执行此操作以复制“子表单”功能,如 Microsoft Access。