【问题标题】:Is it possible to host a WinForm form within a WPF Form via a container/wrapper?是否可以通过容器/包装器在 WPF 表单中托管 WinForm 表单?
【发布时间】:2011-01-18 14:10:25
【问题描述】:

有没有办法在 WPF 表单中的某种容器或包装器类型控件中托管/显示完整的 WinForms 表单(不仅仅是单个控件)?我正在寻找在概念上类似于 php 中的虚拟包含或 html 中的 iframe 的东西。可能通过将其编译成 OCX 或 DLL。

【问题讨论】:

    标签: c# wpf visual-studio-2008 winforms-interop


    【解决方案1】:

    据我所知,您无法在 WPF 中托管实际的 WinForms 表单。

    然而,一个好的替代方法是在 WinForms(作为 Windows 窗体控件库项目)中创建一个包含所有必需功能和子控件的普通 UserControl。

    然后在您的 WPF 项目中,引用 WindowsFormsIntegration.dll(应该在添加引用的 .NET 选项卡中)。

    然后还引用包含 WinForms UserControl 的程序集,最后将 WindowsFormsHost 容器添加到 XAML。

    有关更多信息,请参阅 Sacha Barber 的 useful tutorial

    【讨论】:

      【解决方案2】:

      CodeProject 上有一篇文章展示了如何在 WinForms 上托管一个 exe 作为控件(这是一个使用标签页的应用程序,将 Winform.exe 拖到它上面,它会创建一个带有该窗口的标签页),来源于这篇文章here。我知道您特别要求 WPF,但也许这可能会引导您朝着正确的方向前进?

      希望这会有所帮助, 最好的祝福, 汤姆。

      【讨论】:

      • 最终没有使用这个,但它是一个很棒的工具。感谢您的链接。
      【解决方案3】:

      您可以使用以下代码:

      在您的 XAML 中:

      <WindowsFormsHost name="wfHost" />
      

      在您的代码隐藏中:

      Form foo = new Form();
      foo.TopLevel = false;
      foo.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
      wfHost.Child = foo;
      

      【讨论】:

      • +1,鲜为人知的TopLevel。用于在 .NET Compact 1.1 中执行此操作以复制“子表单”功能,如 Microsoft Access
      猜你喜欢
      • 2012-07-18
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2012-03-15
      • 2021-11-22
      相关资源
      最近更新 更多