集成 WPF 与 Windows Forms
为 Windows Forms 应用程序添加 WPF 功能
引言
本文讨论了如何将 WPF XPS 文档查看器集成到 Windows Forms 应用程序中。
“WPF 很棒,提供了美好的未来,我们都应该开始使用它,并将所有产品都改为使用它。”
这是一个好主意,但对于我们许多人来说,这是不可能的。例如,我们的主要产品有成千上万行代码和数百个表单。将所有这些都扔进垃圾箱并重新开始将是经济上的自杀行为。尽管如此,开发使用 WPF 的新领域并将这些领域与我们的 Windows Forms 解决方案集成将会很好。

背景
不久前,我开始研究我们如何交付电子文档。PDF 一直是传统方法,但 Microsoft 的 XPS 提供了更多功能,因此我决定遵循这条道路。从编程的角度来看,它带来了一些挑战,例如创建、显示、交付等,我将在未来几个月内与您分享我的解决方案,但现在我将讨论使用 Visual Studio 2008 附带的文档查看器显示 XPS 文档并将该文档嵌入到 Windows Forms 解决方案中的任务。通过这样做,我希望能够演示将 WPF 与 Windows Forms 集成是多么容易。
Using the Code
作为一项练习,我在 VS2008 中创建了一个解决方案,该方案包含一个 WPF 库类项目和一个 Windows Forms 应用程序项目。WPF 项目包含一个 Windows Forms 用户控件,该控件本身包含一个 WPF 文档查看器控件。Windows Forms 项目只包含一个用于演示用户控件用法的表单。

当您添加 WPF 库类时,Visual Studio 会为您添加基本引用,但由于我们将添加一个 Windows Forms 用户控件,因此我们需要添加一些额外的引用。
默认情况下会添加以下引用
PresentationCore
PresentationFramework
系统
System.Core
System.Data
System.Data.DataSetExtensions
System.XML
System.Xml.Linq
WindowsBase
您将需要添加对以下内容的引用
ReachFramework
System.Drawing
System.Printing
System.Windows.Forms
UIAutomationProvider
WindowsFormsIntegration
确保您的引用与上面相同。
将 WPF 用户控件添加到项目中,并在其中添加您需要的任何 WPF 功能。就我而言,我只是添加了一个 Windows 文档查看器。
现在我们需要添加将暴露给我们的 Windows Forms 应用程序的 Windows Forms 用户控件。在代码中,添加以下导入语句。
Imports System.Windows.Forms.Integration
在 Forms 用户控件中,声明 WPF 用户控件的实例,并在加载事件中创建实例并进行连接。我们通过创建 ElementHost
的实例来做到这一点。这基本上是一个与 Windows Forms 和 WPF 都兼容的容器。我们创建 WPF 控件的实例,并将其设置为 ElementHost
的子控件,然后将 ElemenHost
添加到控件集合中。
Private WithEvents wpfExtension As ParitorWPF.XPSDocumentViewer
Private Sub ParitorDocumentViewer_Load_
(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim host As New ElementHost
wpfExtension = New ParitorWPF.XPSDocumentViewer
host.Child = wpfExtension
host.Dock = Forms.DockStyle.Fill
Me.Controls.Add(host)
End Sub
我们还可以将传递方法添加到用户控件中,以调用 WPF 控件或捕获其事件。
现在,我们可以将一个表单添加到 Windows Forms 应用程序中,并将我们的 Windows Forms 用户控件放在其上。当我们运行表单时,它会显示 WPF 应用程序,就我而言,是文档查看器。
就这么简单 - 因此,也许我们无法直接替换现有的 Windows Forms 解决方案,但希望我已经向您展示了将 WPF 功能逐渐添加到它们是多么容易。
历史
- 初始版本