最近在开发一个项目时,遇到了一个奇怪的问题,项目依赖的最低版本是10586,目标版本是14393,开发完毕发布到商店后,很多用户报无法正常加载页面。经查,有问题的都是Win10 10586版本。

我上篇博客中写到的自定义的AppBar控件,也存在这个问题,10586会报错。

为此特意下载了10586的SDK调试。错误显示,一个样式找不到,名为ListViewItemBackground。因为开发的时候是基于14393的,有可能是14393的SDK中默认有该样式,但10586没有。

首先找到以下目录:

C:\Program Files (x86)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP

可以看到里面有以下三个目录:

这就是三个不同版本的Win10。依次打开里面的Generic目录,里面的generic.xaml就是默认的样式文件。为了比较三个版本不同的区别,使用VS Code的同学可以安装这个插件:

安装完毕后,reload一下,把三个版本的generic.xaml拖进来,在第一个要比较的文件上右键单击选择Mark 1st file,在第二个文件上右键单击选择Mark 2nd file,就可以进行比较了。

首先查找ListViewItemBackground这个值,发现14393里是有这个属性的,但10586没有,找不到这个值就报错了:

可以看到,差异还是比较大的。

至于自定义的AppBar的问题,是因为我从14393的样式里复制出来的模板,是这样的:

而在10586中,AppBar的模板是这样的:

但在14393中,其实跟10586的值是一样的:

也就是说,14393里把一些资源重新起了个名。传说中的微软改名部再次立功了。

再比较一下14393和15063,可以发现也有一些小改动:

所以如果要用到这些样式的时候,一定要确认在不同版本中的默认样式中是存在的,否则就会找不到资源而报错。

那如何解决这个问题?一种方案使,将14393的默认样式中10586里不存在的那部分复制到项目中。但是如果使用了自定义控件,仍然有可能会发现莫名其妙的错误,比如有些控件的模板使用了只有14393才支持的属性,可以参考这几个文章:

http://stackoverflow.com/questions/40397909/templatebinding-used-after-must-be-a-markup-extension-error-on-uwp-gridvi

https://social.msdn.microsoft.com/Forums/windowsapps/en-US/af308462-59b3-4ec6-9640-f0a3c5956004/uwptemplatebinding-used-after-must-be-a-markup-extension-error-on-uwp-gridview?forum=wpdevelop

所以保险起见,项目最低版本改成14393就行了。需要注意的是,15063的样式仍然有改动,如果自定义了模板的话还需要考虑兼容性。

Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题的更多相关文章

  1. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  2. Win10 UWP开发系列:实现Master/Detail布局

    在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...

  3. Win10 UWP 开发系列:使用SQLite

    在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中.但如果数据多的话,还是需要本地数据库的支持.在UWP开发中 ...

  4. Win10 UWP 开发系列:使用多语言工具包让应用支持多语言

    之前我在一篇blog中写过如何使用多语言工具包,见http://www.cnblogs.com/yanxiaodi/p/3800767.html 在WinEcos社区也发布过一篇详细的文章介绍多语言工 ...

  5. Win10 UWP 开发系列:使用SplitView实现汉堡菜单及页面内导航

    在Win10之前,WP平台的App主要有枢轴和全景两种导航模式,我个人更喜欢Pivot即枢轴模式,可以左右切换,非常方便.全景视图因为对设计要求比较高,自己总是做不出好的效果.对于一般的新闻阅读类Ap ...

  6. Win10 UWP 开发系列:支持异步的SQLite

    上篇文章已经实现了在UWP中使用SQLite作为本地存储,作为移动端的程序,及时响应用户的操作是提高用户体验的重要途径,因此UWP的很多api都是异步的.那么如何使SQLite支持异步呢? 参考SQL ...

  7. Win10 UWP开发系列——开源控件库:UWPCommunityToolkit

    在开发应用的过程中,不可避免的会使用第三方类库.之前用过一个WinRTXamlToolkit.UWP,现在微软官方发布了一个新的开源控件库—— UWPCommunityToolkit 项目代码托管在G ...

  8. Win10 UWP开发系列:开发一个自定义控件——带数字徽章的AppBarButton

    最近有个项目有一个这样的需求,在文章浏览页底部有几个AppBarButton,其中有一个是评论按钮,需要在评论按钮上显示一个红色数字,类似微信的新消息提醒: 这种设计在iOS和Android平台都是很 ...

  9. Win10/UWP开发—使用Cortana语音与App后台Service交互

    上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...

随机推荐

  1. 《java入门第一季》之面向对象面试题(fianl关键字)

    /* 面试题:final修饰局部变量的问题 基本类型:基本类型的值不能发生改变. 引用类型:引用类型的(地址值)(不能发生改变),但是,该对象的堆内存的值是可以改变的. */ class Studen ...

  2. 关于iOS常用的26中公共方法,可copy的代码

    1. 获取磁盘总空间大小 //磁盘总空间 + (CGFloat)diskOfAllSizeMBytes{ CGFloat size = 0.0; NSError *error; NSDictionar ...

  3. shell脚本处理长参数的模板

    shell脚本处理长参数的模板 一个shell模板,处理命令行参数,支持长短参数: #!/bin/bash # # FILE: kvm-clone-v2.sh # # DESCRIPTION: Clo ...

  4. 【Qt编程】Qt学习笔记<一>

    1.      在创建项目时,项目名和路径中都不能出现中文. 2.      可以使用Ctrl + "+"和Ctrl + "-"来改变程序的字体大小(Ctrl+ ...

  5. RubyGem默认源安装太慢,修改国内淘宝源

    原帖地址:http://www.hiceon.com/topic/Ruby-Gem-install-source-taobao/ WHY? 由于国内网络原因(你懂的),导致 rubygems.org ...

  6. 一个类搞定UIScrollView那些事儿

    前言 UIScrollView可以说是我们在日常编程中使用频率最多.扩展性最好的一个类,根据不同的需求和设计,我们都能玩出花来,当然有一些需求是大部分应用通用的,今天就聊一下以下需求,在一个categ ...

  7. 【Python】模拟radius coa报文

    Radius协议中网关设备NAS是client,实现radius协议的服务为服务端(例如freeradius),这种情况下radius server并不能主动给NAS发送信息.在 rfc3576 Dy ...

  8. Leetcode_204_Count Primes

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/46366207 Description: Count the ...

  9. application之OnLowMemory()和 OnTrimMemory(level)讲解

    1. OnLowMemory OnLowMemory是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLo ...

  10. LeetCode(41)-Rectangle Area

    题目: Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defin ...