title author date CreateTime categories
UWP 和 WPF 对比
lindexi
2018-05-05 17:23:33 +0800
2018-04-16 20:28:43 +0800
WPF UWP dotnetcore

本文告诉大家 UWP 和 WPF 的不同。
如果在遇到技术选择或者想和小伙伴吹的时候可以让他以为自己很厉害,那么请继续看。

如果在看这文章还不知道什么是 UWP 和 WPF 那么也没关系,下面会告诉大家。

实际上 Universal Windows Platform (UWP) 和 Windows Presentation Foundation (WPF) 是不相同的,虽然都可以做界面和桌面开发,但是 UWP 是一个新的 UI 框架,而且 UWP 是支持很多平台,至少比 WPF 多。

那么 UWP 可以使用什么写?

  • xaml 做的 UI 和 C#、VB 写的后台

  • xaml 的 UI 和 C++ Native 写的后台

  • DirectX 的 UI 和 C++ Native 写的后台

  • JavaScript 和 HTML

WPF 呢?他可以使用 xaml 做的前台,C#、VB、F#、C++写的后台。

不过需要知道,WPF 的C++ 后台使用的是托管的C++。

那么网上怎么好多小伙伴说 UWP 的性能比 WPF 好?

因为 UWP 的渲染使用的是 DirectComposition 而 WPF 使用的 Desktop Window Manager,请不要在这里和我说 WPF 使用的 DX9 。

虽然 WPF 渲染是通过 Dx9 但是最后显示出来是需要 DWM ,所以上面这样说。

之外,UWP 使用 dot net core 编译出来的是 Native 本地代码,WPF 使用 dot net Framework 编译出来是 IL 代码,需要知道 编译出来 Native 代码的性能是 80% C++非托管。所以代码运行会快很多。

这时不要说 IL 可以针对每个 CPU 做优化,因为 dot net core 编译的代码就是对不同的 CPU 做优化。如果还需要对特殊CPU做优化,我还没找到。

发布时间

WPF 在 2006 年发布,那时使用的 .net Framework 3.0 ,现在已经是 WPF 4 了,支持的 .net Framework 已经到 4.7.x 了。

UWP 在 2015 年发布,那时还没有 dot net core 1.0

所以垃圾微软的 UWP 有兼容问题,如果选择最低平台,千万不要 10240 这个版本的 api 很多后来系统没有提供的,这是兼容的问题。很多之前的没有公布的 api 已经去掉,很多以前的api已经被标记过时了。

系统要求

因为 WPF 发布的时候还没有 Win7 所以 WPF 是支持 xp 的。但是如果需要支持 xp 就需要使用不大于 .net Framework 4.0 的版本,如果比 4.0 大就无法支持 xp 啦。

需要知道,在 4.5之后 WPF 才修复很多 bug ,提升性能,能不支持 xp 就不要支持 xp。

UWP 发布的时候,因为使用的是 WinRT ,虽然底层和 WPF 一样使用的是 COM 但是添加了很多以前系统不支持的特性。微软为了减少开发或者基于某些考虑,于是UWP不支持以前系统,最低是 win10.

平台

虽然 WPF 很厉害,但是发布的时候几乎没有人知道多平台,所以 WPF 只能支持桌面和 windows 平板。但是现在有 AvaloniaXamarin WPF,这两个都是可以支持很多平台,如 mac 和 Linux ,需要说的是,我一个在开发 Xamarin 的小伙伴说,WPF 是一个恐怖的工程,他不觉得很快就可以把Xamarin WPF放在实际项目。

但是 Avalonia 只要可以注入渲染就可以使用,输入部分做很少修改就可以在很多平台跑,虽然几个小伙伴告诉我他的树莓派无法运行 Avalonia ,不过对于一个开源软件,要修改还是很简单。

对比 WPF ,全平台 UWP 支持PC, Notebook, Tablet, Phone, Xbox, IoT, Surface Hub,需要说的最后一个大家不用支持,因为说了10年还没有卖。但是 UWP 支持的都是 微软的系统,对于 Mac 和 Linux 暂时是无法支持的。如果开发的客户需要使用 Mac 和 Linux ,自己不想开发多个代码就不可以选择 UWP 。

但是如果需要性能和支持好的触摸,建议选择 UWP ,不过 UWP 的坑还是好多。

输入

虽然微软说 WPF 是支持触摸的,但是在 4.7 之前的触摸是很差的。所以 WPF 支持鼠标键盘。

但是 UWP 是支持触摸的,鼠标、键盘。

对于 触摸的支持,uwp 是做的很好的,不仅支持了 4.7.1 的指针消息而且还内部支持很多手势。

对于AR的输入,uwp也是支持的。

界面

虽然 WPF 和 UWP 都使用 xaml 做界面,但是渲染是不相同的。 WPF 的渲染都是使用托管代码计算,然后通过通道使用 DirectX 9 渲染。渲染完成给 DWM 选择是否显示。但是 WPF 没有使用 DirectX 9 的性能,所以渲染是比较慢的。听说 WPF 可以使用 dx11 dx12都是使用优化级别是 fl9 。

我尝试使用 WriteableBitmap 渲染,结果性能比 WPF 渲染快。

但是 UWP 的渲染很快,因为他使用DirectComposition直接渲染,使用 DX11 渲染。DirectComposition 是通过集成 DWM 渲染的。组合的图形和动画通过 DirectComposition 构建然后传到 DWM 渲染到屏幕。所以使用 DirectComposition 不需要特殊的渲染框架。而且渲染的代码都是编译本地,比较多使用 DX11 ,但是对于很多硬件都支持 dx12 。

那么 DWM 的作用是什么,实际上从博客可以看到 DWM 实际作用 Windows 组合引擎或合成程序,需要每个窗口把显示的内容给屏外表面或缓冲区,缓冲区是系统给每个顶层窗口分配的,所有的 GDI、D3D、D2D 到先渲染到这里。然后 DWM 决定如何显示,是组合窗口还是做特效,最后再把缓存放到显卡。

参见:Why use DirectComposition? (Windows)

定制

虽然开始的 WPF 定制不好,但是现在的 WPF 定制是很好的,可以使用 Host 加入其他的程序,可以使用 dx 加入。如何在 WPF 使用 dx 是相对比较难的,但是可以使用 SharpDx 和 SharpGL 使用 dx 和 opg。

但是 UWP 的定制虽然像 UWP 但是限制很多,一个就是他的源代码看不到,其他的就是很多功能无法使用,如 Adorner 和继承属性。

样式

虽然看起来 WPF 和 UWP 的样式定义是一样的,但是 UWP 没有了功能很好的 Trigger 和样式继承。这样 UWP 的功能就没有 WPF 那么容易定制。

而且 WPF 和 UWP 的设计器经常无法使用,不过两个都可以在运行修改样式。但是在运行时可以 WPF 可以通过 Snoop 查看元素的值,但是 UWP 不可以,所以调试 UWP 界面还是比较难。

调试

在 WPF 如果有一个代码抛异常,那么 VisualStudio 很容易告诉大家是哪里异常,因为 VisualStudio 也是 WPF 写的。但是如果 dot net core 抛异常,那么 VisualStudio 很难告诉但是哪里异常,不过 UWP 是 dot net core 写的,所以 UWP 的异常很难知道是哪里异常,特别是界面异常,经常告诉大家出现一个未知的异常。

对比 WPF,现在的微软开放了部分 dot net framework 的源代码,在 WPF ,即使没有源代码,自己反编译也可以看到。但是在 UWP ,没有源代码,而且难以反编译,如果遇到坑都不知道是不是微软的代码写的。

需要说的是 UWP 用的 dot net core 是开放源代码的,如果大家想读代码可以在 github 搜索 dot net core 就可以下载。

安装

现在的 WPF 可以做绿色版,直接运行就可以。不过要求用户的电脑有 .net Framework 。

但是 dot net core可以带所有的环境,所以 UWP 安装不需要要求用户有 .net Framework 环境,不过 UWP 只能通过应用商店和开发者方式安装。

很多小伙伴还不会安装 UWP 程序,虽然双击就可以安装。

虽然 UWP 不需要 .net framework 环境,但是他需要 win10 ,现在很多用户的电脑都是 win7 所以暂时很难直接告诉大家使用 UWP ,很多人无法安装。

文件

在 WPF 几乎所有文件都能使用,如果发现有文件没权限,那么可以通过申请的方式拿到。对比 WPF 这么不安全,因为可能有开发者删掉了重要的文件,微软提出了安全的代码,所有的不是应用内的文件都需要用户申请才可以。

成熟

WPF 是比较成熟的,现在已经有 10 多年,有很多库,而且遇到的问题基本都有人遇到。

对于 UWP ,是比较不成熟,很多功能没有。

参见:UWP vs. WPF · jbe2277/waf Wiki

感谢

特别感谢 Naruto Mouri 指出文章的不足

2018-5-5-UWP-和-WPF-对比的更多相关文章

  1. UWP 和 WPF 对比

    原文:UWP 和 WPF 对比 本文告诉大家 UWP 和 WPF 的不同. 如果在遇到技术选择或者想和小伙伴吹的时候可以让他以为自己很厉害,那么请继续看. 如果在看这文章还不知道什么是 UWP 和 W ...

  2. What is the difference between WinRT, UWP and WPF?

    在学习UWP的过程中确实有这个迷惑,在此分享一下. UWP (Universal Windows platform), Metro and WinRT are all result of Micros ...

  3. 在uwp仿制WPF的Window

    移植WPF软件到uwp时碰到用作对话框的Window有多种处理选择.我个人认为最省事的是用ContentDialog模拟Window. 比如你想把上面这个WPF窗体弄到uwp里面去 1.修改Conte ...

  4. 如何在 UWP 使用 wpf 的 Trigger

    本文需要告诉大家,如何使用 Behaviors 做出 WPF 的 Trigger ,需要知道 UWP 不支持 WPF 的 Trigger . 安装 Behaviors 请使用 Nuget 安装,可以输 ...

  5. [UWP]为附加属性和依赖属性自定义代码段(兼容UWP和WPF)

    1. 前言 之前介绍过依赖属性和附加属性的代码段,这两个代码段我用了很多年,一直都帮了我很多.不过这两个代码段我也多年没修改过,Resharper老是提示我生成的代码可以修改,它这么有诚意,这次就只好 ...

  6. dotnet 从入门到放弃的 500 篇文章合集

    本文是记录我从入门到放弃写的博客 博客包括 C#.WPF.UWP.dotnet core .git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到 ...

  7. 2018-8-10-dotnet-从入门到放弃的-500-篇文章合集

    title author date CreateTime categories dotnet 从入门到放弃的 500 篇文章合集 lindexi 2018-08-10 19:16:52 +0800 2 ...

  8. 如何组织一个同时面向 UWP/WPF/.Net Core 控制台的 C# 项目解决方案

    希望写一个小型工具,给自己和需要的人.考虑到代码尽可能的复用,我准备采用 .Net Standard 来编写大多数核心代码,并基于 .Net Core 编写跨平台控制台入口,用 WPF 编写桌面端 U ...

  9. 【广州.NET社区推荐】【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

    原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...

随机推荐

  1. c++复习——类(2)

    1.this指针 this指针是一个指向对象的指针.  this指针是一个隐含于成员函数中的对象指针.  this指针是一个指向正在调用成员函数的对象的指针.  类的静态成员函数没有this指针 ...

  2. 给字体和元素加阴影text-shadow和box-shadow

    1.语法:  对象选择器 {text-shadow:X轴偏移量 Y轴偏移量 阴影模糊半径 阴影颜色} 注:text-shadow可以使用一个或多个投影,如果使用多个投影时必须需要用逗号“,”分开. 2 ...

  3. android读取xml

    /*** 从config.xml中获取版本信息以及应用id* * @param urlPath* @return* @throws Exception*/public List getUpdateIn ...

  4. 动态淀粉质(划掉)题单&简要题解

    简介 动态点分治的思想:还不太清楚诶怎么办. 大概是通过降低树高来降低每次修改和询问的复杂度吧,还可以把树上一个连通块的信息统计到一个点(重心)上.具体实现方式和普通的静态点分治没有太大的区别,只是把 ...

  5. Alexa TOP 100万的域名列表

    Alexa是一家专门发布网站世界排名的网站,是亚马逊公司的一家子公司.Alexa每天在网上搜集多达几十亿的网址链接,而且为其中的每一个网站进行了排名. Alexa通过Alexa官网查询好像TOP 50 ...

  6. Vuex的五个核心属性

    Vuex的五个核心属性 Vuex的五个核心概念 本文参考自Vue文档,说的非常详细,建议看文档. Vuex是什么? VueX 是一个专门为 Vue.js 应用设计的状态管理架构,统一管理和维护各个vu ...

  7. postman之请求&断言

    http://www.jianshu.com/p/dd0db1b13cfc    ---参考网址 文档:https://www.v2ex.com/p/7v9TEc53 api地址:https://ww ...

  8. mac 电脑设置密码可以直接使用 passwd 这个命令

    mac 电脑设置密码可以直接使用 passwd 这个命令 说明:这个命令行级别的设置会直接影响到我们登录.

  9. redhat 6.8 配置 centos6 163 的 yum 源

    1. 检查是否安装yum包[root@node1 rpms]# rpm -qa|grep yum 2. 删除自带的yum包[root@node1 rpms]# rpm -qa|grep yum|xar ...

  10. jQuery实现三级联动菜单(鼠标悬停联动)

    效果图: 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> < ...