原文 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题

虽然微软宣称 Windows 10 将是最后一个 Windows 版本,但由于年代跨越实在太久远,兼容性依然是避不开的问题。Microsoft.UI.Xaml 的预览版现已推出,旨在解决 UWP UI 控件在各个不同版本 Windows 上的兼容性问题。

本文将简单了解一下 Microsoft.UI.Xaml 库,然后实际看看它的效果。


本文内容
  • Windows 10 的兼容性问题
  • Microsoft.UI.Xaml 库
  • 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 的兼容性问题相关推荐

  1. UWP控件与DataBind

    原文:UWP控件与DataBind 在uwp开发中必不可少的一个环节就是各种通用的控件的开发,所以在闲暇时间汇总了一下在uwp开发中控件的几种常用写法,以及属性的几种绑定方式,有可能不全面,请大家多多 ...

  2. 以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件(经经经经经典)

    以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件 发布日期 : 12/2/2004| 更新日期 : 12/2/2004 Mark Bukovec Empir ...

  3. 安装Microsoft.UI.Xaml.2.6(WSA安卓子系统安装缺失)

    一.原因 由于用 Add-AppxPackage命令安装WSA安卓子系统时出现类似如下问题: Add-AppxPackage : 部署失败,原因是 HRESULT: 0x80073CF3, 包无法进行 ...

  4. 第一章:初识WPF,XAML,WPF控件

    前言 总目录 本章主要介绍WPF与XAML,以及WPF的控件的基本使用,让大家先初步认识WPF. 关于WPF的官方资料:官方WPF文档1 .官方WPF文档2.官方WPF文档3.官方WPF文档4 一.W ...

  5. RAD Studio 10.4.1新的基于Chromium的Microsoft Edge浏览器的TEdgeBrowser控件用法

    目录 RAD Studio 10.4.1新的基于Chromium的Microsoft Edge浏览器的TEdgeBrowser控件用法 一.TEdgeBrowser安装部署说明 1.1.TEdgeBr ...

  6. 微软 microsoft calendar control 11.0 控件下载

    微软 microsoft calendar control  11.0 控件下载 https://files.cnblogs.com/files/mqingqing123/csccal2.rar

  7. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础-手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  8. 解决dev控件版本过期问题

    解决dev控件版本过期问题 参考文章: (1)解决dev控件版本过期问题 (2)https://www.cnblogs.com/lixioayi/p/9533024.html 备忘一下.

  9. pb调用计算机默认游览器,PB打开ole控件IE浏览器版本问题_指定Webbrowser控件所用IE内核版本(转)...

    如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe 对于32位 ...

最新文章

  1. Java读写文件,中文乱码解决
  2. UITextView中的占位符
  3. 金字塔式梯度方向直方图(PHOG)
  4. R,Python,Scala,Go,Julia
  5. ffmpeg命令详解(转)
  6. Linux SD卡驱动开发(五) —— SD 卡驱动分析Core补充篇
  7. 如何对memcache的数据(key-value)进行遍历操作
  8. python自带的用于解析HTML的库HtmlParser
  9. oracle恢复被覆盖的存储过程
  10. SQL在线格式化工具
  11. jsp主板 jtp_HPlaserjtp1008不开机故障的检测与维修流程
  12. PhotoShop 各历史版本
  13. New:Spire.Office for Java 7.7.1 Not Crack
  14. python微信红包代码_哄女朋友必备之微信自动发红包脚本(python+adb+androidviewclient)...
  15. Adobe Photoshop 2021 22.4.2 绿色精简版
  16. 关于独立DFS和域DFS板书
  17. CUPS学习五:打印机基础
  18. 最重要的两种思维:逻辑思维与结构化思维
  19. 配置文件和日志文件导出方法
  20. 从输入URL到页面加载…

热门文章

  1. Mongo db 与mysql 语法比较
  2. 「BZOJ 3529」「SDOI 2014」数表「莫比乌斯反演」
  3. laravel中文字模型的增删改查
  4. photoshop常用快捷键大全
  5. 关于单片机大循环结构编程
  6. 从0到1搭建移动App功能自动化测试平台(2):操作iOS应用的控件
  7. TCP/IP 详解笔记
  8. 解决SQLite异常:library routine called out of sequence
  9. 解决css引用字体跨域问题
  10. 解决在工具栏Chrome图标上点击右键会显示“常去网站”和“最后关闭网站”的问题