使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题
原文 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题
虽然微软宣称 Windows 10 将是最后一个 Windows 版本,但由于年代跨越实在太久远,兼容性依然是避不开的问题。Microsoft.UI.Xaml 的预览版现已推出,旨在解决 UWP UI 控件在各个不同版本 Windows 上的兼容性问题。
本文将简单了解一下 Microsoft.UI.Xaml 库,然后实际看看它的效果。
Windows 10 的兼容性问题
在创建 UWP 应用的时候,我们可以选择目标版本和最低版本。目标版本决定了我们能使用的最新 API,最低版本决定了我们需要支持的最低版本的 Windows 10。

▲ 图中目标版本为 17134,最低版本为 14393。事实上,目标版本必须是 17134,最低只能支持到 14393。
然而,每一次新版本 Windows 10 的推出,都带来大量新的开发 API。可以去官方文档 Choose a UWP version - UWP app developer - Microsoft Docs 了解各个版本 Windows 10 新增的功能简介。
微软在 Windows 10 16299 版本带来了 XAML 条件编译,用以在 XAML 中兼容不同版本的 Windows 10,然而这意味着必须选择 16299 作为最低 API 版本才能正常使用此功能。当然,XAML 条件编译还是带来了不少方便的特性呢,阅读 win10 uwp xaml 兼容多个版本条件编译 - 林德熙 可以了解 XAML 条件编译的使用方法,顺便收获一只猫。
Windows 10 也在各个版本新增了一些控件。那么问题来了,要支持最低版本就不能使用新控件。Windows 10 又不像 iOS 那样更新率高,意味着根本不能使用新控件进行开发。

Microsoft.UI.Xaml 库
于是微软就推出了在 上推出了 NuGet 包 [Microsoft.UI.Xaml](https://www.nuget.org/packages/Microsoft.UI.Xaml)。
使用此包,你需要将 UWP 的 目标版本设为 17134,支持的 最低版本只能到 14393,不能更低。
官方对此包的描述为:
This package provides backward-compatible versions of Windows UI features including UWP XAML controls, and Fluent styles and materials. It is part of the Windows UI Library.
即提供各种 Windows UI 功能的向后兼容性,包括 UWP XAML 控件、Fluent 流畅设计样式和画刷。当然,不支持亚克力效果的系统版本虽然画刷能用,不崩溃,但也没有效果的。

Microsoft.UI.Xaml 的上手方法
安装 Microsoft.UI.Xaml 后,Visual Studio 会自动打开 readme.txt 文件提示我们用法:
Thanks for installing the WinUI nuget package! Don’t forget to add this to your app.xaml:
<Application.Resources>
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls"/>
</Application.Resources>
See http://aka.ms/winui for more information.
即我们需要在 App.xaml 文件中添加 <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls"/> 作为应用程序的全局资源。不过,官方文档 Getting started with the Windows UI library 中有对此更详细的描述。
如果我们是新 UWP 程序,这样写是没问题的:
<Application>
<Application.Resources>
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls"/>
</Application.Resources>
</Application>
但如果基于原有的程序进行兼容性改造,可能原 Application 中已经有资源了,就必须换一种写法:
<Application>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
当然,以上这种改造在各种 XAML 上的行为都是一样的,比如我在 StackOverflow 上回答的问题 Use ResourceDictionary with other Styles in WPF 也是这样的改法,其中说明了必须这样修改的原因。
不过没有结束,在需要使用到新版本 Windows 10 控件的 XAML 文件中,需要添加命名空间前缀:
xmlns:controls="using:Microsoft.UI.Xaml.Controls"
这样才能在 XAML 中使用 Microsoft.UI.Xaml 库中的新控件:
<Grid>
<controls:NavigationView x:Name="WalterlvDemoView">
<controls:NavigationView.MenuItems>
<ListViewItem Content="Home" />
<ListViewItem Content="Demo" />
<ListViewItem Content="About" />
<ListViewItem Content="https://walterlv.github.io/" />
</controls:NavigationView.MenuItems>
</controls:NavigationView>
</Grid>
还记得本文开头那张 Visual Studio 的兼容性提示图片吗?使用了 Microsoft.UI.Xaml 库之后,不会再有提示了。这不是欺骗,是真的具备了对早期系统的兼容性。

于是,一些广泛使用的 UWP 应用终于不用各种自己写控件来兼容低版本的 Windows 10 了。
当然除了在 XAML 中,也可以在 C# 代码中使用库中的新 API。
解决意料之外的错误
一切可以那么顺利?不一定,你可能在刚刚把 <XamlControlsResources /> 加入之后,就会发现程序启动即崩溃了……
然后提示:
System.Runtime.InteropServices.COMException
HResult=0x80004005
Message=Error HRESULT E_FAIL has been returned from a call to a COM component.
Source= StackTrace:

不得不说,微软再一次把内部错误暴露了出去。实际的错误原因是 —— 目标 SDK 需要设置为 17134—— 这是必须的!

当然,这个版本号并不是跟随系统的,而是跟随 Microsoft.UI.Xaml 库的。库如果更新有新系统的控件,那么你更新库之后就需要再次更新目标 SDK 版本了。
本文会经常更新,请阅读原文: https://walterlv.com/post/getting-started-with-microsoft-ui-xaml.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题的更多相关文章
- WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项 ...
- UWP控件与DataBind
在uwp开发中必不可少的一个环节就是各种通用的控件的开发,所以在闲暇时间汇总了一下在uwp开发中控件的几种常用写法,以及属性的几种绑定方式,有可能不全面,请大家多多包涵 :) 1.先从win10新增的 ...
- Windows Community Toolkit 3.0 新功能 在WinForms 和 WPF 使用 UWP 控件
本文告诉大家一个令人震惊的消息,Windows Community Toolkit 有一个大更新,现在的版本是 3.0 .最大的提升就是 WinForm 和 WPF 程序可以使用部分 UWP 控件. ...
- 以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件
以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件 2007/10/29 Mark BukovecEmpire Down Development 适用于:Mi ...
- WPF中动态加载XAML中的控件
原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...
- iOS开发UI篇—手写控件,frame,center和bounds属性
iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...
- iOS开发UI基础—手写控件,frame,center和bounds属性
iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...
- Kendo UI for Angular 2 控件
Kendo UI for Angular 2 控件 伴随着 Angular 2 的正式 release,Kendo UI for Angular 2 的第一批控件已经发布了,当前是 Beta 版本,免 ...
- Semantic UI中的验证控件的事件的使用
1.Semantic UI中的验证控件,功能挺不错的,中文官网的文档写的都比较详细了,我再这里就不再进行重复了,主要是想说一下它的事件的使用方法,这个可能有部分朋友刚开始接触的时候不太了解 注意看这几 ...
随机推荐
- IQMath是什么 浮点转定点运算,dsp
[转帖注明出处:blog.csdn.net/lanmanck] 网上搜了一下没发现非常合适的,特写出来与大家分享. 大家都知道嵌入式系统里带浮点运算指令的CPU都比較少,TI的DSP也是定点的廉价. ...
- 【3002】删去K个数字
Time Limit: 3 second Memory Limit: 2 MB [问题描述] 输入一个数字串S和整数K(K小于数字串S的长度),从S中删去K个数字,使剩余数字在保持相对位置不变的情况下 ...
- php 转义html标签 反转html标签 符号
$a = '<strong>123</strong>'; //假设这是html代码$b = htmlspecialchars($a); //将< ...
- 我的前端规范——JavaScript篇
相关文章 简书原文:https://www.jianshu.com/p/5918c283cdc3 我的前端规范——开篇:http://www.cnblogs.com/shcrk/p/9271561.h ...
- JSP自己定义标签
JSP自己定义标签 API文档: http://docs.oracle.com/javaee/7/api/ watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ ...
- 为什么位运算可以实现加法(1、 不考虑进位的情况下位运算符中的异或^可以表示+号)(2、 位运算符中的与运算符&和左移运算符<<可以模拟加法中的进位)(3、位运算不仅可以做加法,还可以做其它的乘法减法等:计算机本质是二进制运算)
为什么位运算可以实现加法(1. 不考虑进位的情况下位运算符中的异或^可以表示+号)(2. 位运算符中的与运算符&和左移运算符<<可以模拟加法中的进位)(3.位运算不仅可以做加法,还 ...
- [内核编程] Windebug双机调试环境搭建
Windebug双机调试环境搭建 开始进行内核编程/驱动编程的调试工作是非常烦人的,由于程序运行与内核层不受操作系统的管控,所以容易引起主机蓝屏和崩溃是常有的事.这也就使得内核程序的调试成了一大 ...
- ArcGIS Engine中正确释放打开资源
转自原文 ArcGIS Engine中正确释放打开资源 AE中对MDB,SDE等数据库操作时,打开后却往往不能及时释放资源,导致别人操作提示对象被锁定. 很多帖子说了很多原理,看的也烦且不实用,比如一 ...
- JNDI 的理解
JNDI是 Java 命名与文件夹接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之中的一个,不少专家觉得,没有透彻理解JNDI的意义和作用 ...
- C++常用数据结构的实现
常用数据结构与算法的实现.整理与总结 我将我所有数据结构的实现放在了github中:Data-Structures-Implemented-By-Me 常用数据结构与算法的实现.整理与总结 KMP字符 ...