是否有可能包含Winforms和WPF的项目?

时间:2010-06-30 13:08:53

标签: wpf winforms

是否可以有一个包含Winforms和WPF的项目?

说一个在WPF中逐步转换的WinForm项目(通过表单形式),可以在按钮上打开Winform,在另一个按钮上打开一个WPF吗?

5 个答案:

答案 0 :(得分:15)

是。您必须选择一种技术来显示应用中的每个物理窗口和控件,但没有理由不能混合搭配。

例如:

  • WinForms窗口可以显示WPF窗口。
  • WPF窗口可以显示WinForms窗口。
  • WinForms窗口可以包含WPF内容(请参阅ElementHost控件)。
  • WPF窗口可以包含WinForms控件(请参阅WindowsFormsHost控件)。

答案 1 :(得分:2)

答案 2 :(得分:1)

您可能正在寻找的是ElementHost控件。它允许您执行的操作是获取WPF内容并将其托管在Windows窗体窗口中。更多细节在这里:

http://msdn.microsoft.com/en-us/library/ms745781.aspx

还有一个控件可以让您反向执行:从WPF中托管Windows窗体内容:

http://nayyeri.net/host-windows-forms-controls-in-wpf

在两者之间,您可以在一定程度上灵活地移动WPF和Windows窗体之间的“分界线”。

有一点需要注意,你需要记住。 Windows窗体在HWND的内部工作......由传统的Windows窗口管理器(处理z顺序)管理的窗口。 WPF不会这样做...... WPF树通常会呈现为单个HWND',它是用于管理z-order之类的东西的WPF。这对您来说意味着z-order并不总是按照您期望的方式工作,并且您可以使用传统WPF元素对托管的Windows窗体控件执行某些操作。 (实际上有一种方法可以解决这个问题,但它涉及定期将HWND渲染到内存位图中,将该位图渲染到WPF表面,然后将指向WPF表面的事件重定向到基础HWND。这是强大,但很棘手,很难做对。)

答案 3 :(得分:1)

可以顺利地(直接从“添加新项”菜单)向WPF项目添加Winforms,但是没有直接选项将WPF窗口添加到Winforms项目。不过,我按照以下步骤处理了这个问题:

  1. 添加WPF用户控件(此选项在“添加新内容”中可用 项目“菜单”,然后将其转换为WPF窗口。修改XAML 将UserControl父标记更改为Window,并删除 来自UserControl的继承(所有这些都在this link中解释)。

  2. 添加对System.Xaml.dll的引用。请参阅this link

  3. 添加对System.Windows.dll的引用(我在我的计算机上找到它的路径:C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.5。请注意你的可能会有所不同)。请参阅this link

答案 4 :(得分:0)

我没有反对这样做。(我在WinForms Application WPF窗口中) 许多示例使用MessageBox.Show,它是Windows.Forms的一部分。 当然,您必须重写所有窗口,而不仅仅是控件。