我正在寻找一些启示......我开始在WPF中开展一个项目,并且遇到了我在WinForms中编写的一些旧代码的需求。由于我认为这两个平台之间存在巨大差异,我原本预计会出现某种类型的警告,但我决定将WinForms项目中的一些代码文件导入到新的WPF项目中,看看会发生什么。请注意,WinForms代码和WPF代码都在同一个项目中,它们被编译到同一个程序集中。期待一个错误,我不仅惊讶于我可以导入它,但代码工作正常。当然它们都是用C#和.Net 4.0编写的,但我没有意识到WPF和WinForms可以像这样共存。
我显然误解了这些框架的工作方式,有人可以解释这些框架如何在同一个程序集中共存而不会发生冲突吗?
答案 0 :(得分:7)
WPF和Winforms之间没有太大区别。他们都使用HWND来保存他们的内容。他们都使用消息泵。他们都解决了大多数事情的Win32调用问题。 WPF和Winforms都使用资源。访问两者都会产生IL代码。它们仅引用不同的基本程序集,但这些基本程序集可以共存,就像在同一模块中同时使用System.Xml和System.IO一样。
主要区别在于内部,例如绘图/渲染方法,但您可以使用WinFormsHost在WPF中显示Winforms内容。
答案 1 :(得分:2)
当您尝试在旧学校Form
中托管WPF内容或尝试在WPF Window
中托管WinForm控件时,您唯一会看到问题。在这种情况之外,他们都编译成完全有效的IL,这是.NET需要生成正确的机器代码。
答案 2 :(得分:0)
一般来说,WPF和Winforms都是Windows Application Dev中的表示层技术。它们只是同一框架的两个不同部分 - .Net Framework。
根据维基百科:
Winforms是图形应用程序编程的名称 作为Microsoft .NET Framework的一部分包含的接口(API), 提供对本机Microsoft Windows界面元素的访问 将现存的Windows API包装在托管代码中。
Windows Presentation Foundation(或WPF)是一种计算机软件 用于在基于Windows的情况下呈现用户界面的图形子系统 应用。 WPF,以前称为“Avalon”,最初是 作为.NET Framework 3.0的一部分发布。而不是依靠 较旧的GDI子系统,WPF使用DirectX。
以下图片可能会让您更清楚地了解他们之间的关系。