Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题
2017-09-21 10:21
555 查看
原文:Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题最近在开发一个项目时,遇到了一个奇怪的问题,项目依赖的最低版本是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的样式仍然有改动,如果自定义了模板的话还需要考虑兼容性。
我上篇博客中写到的自定义的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差异导致的兼容性问题
- 跨平台C++软件开发中,由于不同操作系统对Unicode的支持差异,而导致的一些问题及解决方案
- 如何完美的解决时间轴开发中的"绝对定位"导致的Android兼容性问题(断线,断点问题)
- 跨平台C++软件开发中,由于不同操作系统对Unicode的支持差异,而导致的一些问题及解决方案。
- jQuery的写法不同导致的兼容性问题的解决方法
- BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
- 浏览器版本不同导致文件无法下载问题解决方法
- DIV CSS在不同IE版本和FF以及Chrome中的兼容性差异解决方法(推荐)
- BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
- 解决不同版本的eclipse或sdk所导致的android layout xml无法显示的问题
- 解决由于升级的Win10周年版本后Oracle VM VirtualBox无法运行导致的eNSP V390里面的路由器和防火墙等设备无法启动的问题(错误代码40)
- 关于解决jq不同版本兼容性问题
- jQuery的写法不同导致的兼容性问题的解决方法
- Websphere 7小版本不同导致的JAXP兼容性问题
- BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
- 把同一个Resource添加到同一个Group中两个不同Application导致的问题及解决方法
- DotNetNuke(DNN)皮肤制作-通过JS文件解决不同IE版本对CSS解释不一致的问题
- WPF开发中遇到的问题及解决系列(三):如何改变ListView 中各行的背景色(背景色产生交替效果)
- .Net反射技术应用解决对象不同版本方法不同参数的问题
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结