[深入浅出Windows 10]不同平台设备的适配
2.3 不同平台设备的适配
Windows 10通用应用程序针对特定的平台还会有一个子API的集合,当我们要使用到某个平台的特定API的时候(比如手机相机硬件按钮触发事件),这时候就需要调用特定平台的API。因为Windows 10应用程序是一个安装包可以部署到所有的Windows 10系统平台的,所以这里就涉及到一个API适配的问题,对特定平台的API进行特殊处理。除了特定平台的API之外,还有一个适配的工作就是界面的适配,Windows 10也提供了一系列的API来给我们做界面的适配工作。
2.3.1 特定平台的API调用
目前在Windows 10里面有Windows Mobile Extension SDK和Windows Desktop Extension SDK两个扩展的SDK分别表示手机版本和桌面版本的扩展SDK,在书本的后面章节里面有用到特定平台的API都会进行区分标识。这两个SDK都是直接内置在Windows 10的开发SDK里面的,但是默认情况下不会给项目工程添加上,需要使用可以在项目工程里面进行引用,路径为(Project > Add Reference >Windows Universal > Extensions)。在使用特定平台的API的时候,必须要进行判断当前的环境是否支持使用,否则不支持的平台调用将会引发异常。判断的方法为Windows.Foundation.Metadata.ApiInformation.IsTypePresent(String typeName),typeName表示带完整的命名空间的API的名称,返回true表示支持,返回false表示不支持。下面通过一个手机硬件后退键的适配来演示一下如果使用和适配特定平台的API。
首先创建一个Windows 10的通用应用程序项目,命名为BackButtonDemo,在项目里面引用Windows Mobile Extension SDK,如图2.12所示。

打开App.xaml.cs文件添加下面的代码:
代码清单2-2:适配手机后退按钮(源代码:第2章\Examples_2_2)
App.xaml.cs文件部分代码
------------------------------------------------------------------------------------------------------------------
// 是否支持硬件后退键的标识
public static bool IsHardwareButtonsAPIPresent;
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
// 判断当前是否支持硬件后退键
IsHardwareButtonsAPIPresent =
Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons");
if (IsHardwareButtonsAPIPresent)
// 添加后退键事件
Windows.Phone.UI.Input.HardwareButtons.BackPressed +=
HardwareButtons_BackPressed;
}
}
// 后退键事件,如果可以返回上一个页面则返回上一个页面
private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
Frame frame = Window.Current.Content as Frame;
if (frame == null)
{
return;
}
if (frame.CanGoBack)
{
frame.GoBack();
e.Handled = true;
}
}
在项目中添加一个新的XAML页面BlankPage.xaml,如图2.13所示,在页面中增加顶部的后退按钮和隐藏显示逻辑,代码如下所示:
BlankPage.xaml文件部分代码
------------------------------------------------------------------------------------------------------------------
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel VerticalAlignment="Top" Orientation="Horizontal">
<Button x:Name="backButton" Margin="24,24,24,24" Click="backButton_Click" Style="{StaticResource NavigationBackButtonNormalStyle}"/>
<TextBlock Text="你好" FontSize="30" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
</StackPanel>
</Grid>
BlankPage.xaml.cs文件部分代码
------------------------------------------------------------------------------------------------------------------
public BlankPage1()
{
this.InitializeComponent();
if(App.IsHardwareButtonsAPIPresent)
{
backButton.Visibility = Visibility.Collapsed;
}
else
{
backButton.Visibility = Visibility.Visible;
}
}
// 后退按钮处理
private void backButton_Click(object sender, RoutedEventArgs e)
{
if(this.Frame.CanGoBack)
{
// 返回上一个页面
this.Frame.GoBack();
}
}
打开MainPage.xaml页面添加转到至BlankPage.xaml页面的逻辑,代码如下所示:
MainPage.xaml文件部分代码
------------------------------------------------------------------------------------------------------------------
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Button Content="跳转到新的页面" Click="Button_Click" VerticalAlignment="Center" HorizontalAlignment="Center"></Button>
</Grid>
MainPage.xaml.cs文件部分代码
------------------------------------------------------------------------------------------------------------------
private void Button_Click(object sender, RoutedEventArgs e)
{
// 从MainPage页面跳转到BlankPage1页面
this.Frame.Navigate(typeof(BlankPage1));
}
把程序部署到手机模拟器上,可以看到BlankPage.xaml页面顶部的后退按钮隐藏掉了,硬件后退键接管了后退的操作,如图2.14、2.15所示。把程序部署到本地PC上,可以看到BlankPage.xaml页面顶部的后退按钮显示出来了,如图2.16、2.17所示。


2.3.2 界面适配
Windows 10系统支持多种硬件平台和分辨率,Windows 10系统底层对界面的适配也是非常强大的,同样的控件在不同的硬件平台上显示也可能会有差异,这种适配就是由Windows 10 系统自己来完成适配,来匹配不同的硬件和分辨率的显示效果。虽然Windows 10底层完成了各种控件的适配,但是很多时候还是需要我们在程序里面来实现适配的。我们在开发通用程序的时候要充分地考虑到各种不同分辨率下的显示效果,可以通过可视化设计界面和各种分辨率的模拟器来进行测试。适配界面有几种常用的编程技巧(1)使用相对的布局控件来进行排列,如Grid、RelativePanel等;(2)使用相对的属性来设置控件在容器的位置,如orizontalAlignment、VerticalAlignment属性;(3)设置长度宽度的最大值最小值限制;(4)根据设备实际分辨率来设置长度宽度或者位置。详细的界面适配编程知识将会在布局的章节进行讲解。
源代码下载:http://vdisk.weibo.com/u/2186322691
目录:http://www.cnblogs.com/linzheng/p/5021428.html
欢迎关注我的微博@WP林政 微信公众号:wp开发(号:wpkaifa)
Windows10/WP技术交流群:284783431
[深入浅出Windows 10]不同平台设备的适配的更多相关文章
- 《深入浅出Windows 10通用应用开发》
<深入浅出Windows 10通用应用开发>采用Windows 10的SDK进行重新改版,整合了<深入浅出Windows Phone 8.1应用开发>和<深入解析 ...
- [深入浅出Windows 10]布局原理
5.2 布局原理 很多时候在编写程序界面的时候都会忽略了应用布局的重要性,仅仅只是把布局看作是对UI元素的排列,只要能实现布局的效果就可以了,但是在实际的产品开发中这是远远不够的,你可能面临要实现的布 ...
- [深入浅出Windows 10]QuickCharts图表控件库解析
13.4 QuickCharts图表控件库解析 QuickCharts图表控件是Amcharts公司提供的一个开源的图表控件库,这个控件库支持WPF.Silverlight.和Windows等 ...
- [深入浅出Windows 10]应用实战:Bing在线壁纸
本章介绍一个使用Bing搜索引擎背景图接口实现的一个应用——Bing在线壁纸,讲解如何使用网络的接口来实现一个壁纸下载,壁纸列表展示和网络请求封装的内容.通过该例子我们可以学习到如何使用网络编程的知识 ...
- 如何解决Windows 10系统下设备的声音问题
如何解决Windows 10系统下设备的声音问题? 请阅读下面的说明来解决Windows 10设备上的声音问题. 1. 检查设备管理器 打开开始菜单,键入设备管理器, 从出现的结果中选择并打开它. 在 ...
- [深入浅出Windows 10]模拟实现微信的彩蛋动画
9.7 模拟实现微信的彩蛋动画 大家在玩微信的时候有没有发现节日的时候发一些节日问候语句如“情人节快乐”,这时候会出现很多爱心形状从屏幕上面飘落下来,我们这小节就是要模拟实现这样的一种动画效果.可能微 ...
- [深入浅出Windows 10]实现饼图控件
13.2 实现饼图控件 上一小节讲解了动态生成折线图和区域图,对于简单的图形这样通过C#代码来生成的方式是很方便的,但是当我们的图表要实现更加复杂的逻辑的时候,这种动态生成的方式就显得力不从心了,那就 ...
- [深入浅出Windows 10]分屏控件(SplitView)
4.18 分屏控件(SplitView) 分屏控件(SplitView)是Windows 10新增的控件类型,也是Windows 10通用应用程序主推的交互控件,通常和一个汉堡按钮搭配作为一种抽屉式菜 ...
- Windows 10 版本 1507 中的新 AppLocker 功能
要查看 Windows 10 版本信息,使用[运行]> dxdiag 回车 下表包含 Windows 10 的初始版本(版本 1507)中包括的一些新的和更新的功能以及对版本 1511 的 W ...
随机推荐
- 【JAVA正则表达式综合练习】
一.治疗口吃. 将字符串“我我我我我我我..........我.......要要要要要..................要要要要...学习习习习.......习习习习习习习习编程程程程程程..... ...
- 【译】DotNet 5.4或者说 .NET平台标准
原文:DotNet 5.4 or .NET Platform Standards 是的,你看到的确实是"DotNet 5.4".使用Visual Studio 2015 RC1 u ...
- 自制工具:迅速打开一个Node 环境的Playground
需求 经常有这种情况,写代码的时候需要实验种想法,亟需一种playground 环境来玩耍.如果是前端的话可以打开chrome 的控制台,但是如果是Node 的话就比较麻烦了.我要打开我的存放试验代码 ...
- 攻城狮在路上(叁)Linux(十一)--- 用户与用户组、文件权限、目录配置
一.用户与用户组: 3个概念:文件所有者(user).用户组(group).其他人(others). /etc/passwd <==存放所有的用户名 /etc/shadow <==存放 ...
- android 运行时出现The connection to adb is down, and a severe error has occured.(转)
点击项目run,报了这样的错,前几天都好好的: [2013-09-14 15:27:13 - QualityPicture_Client1.3.1.9.7.1] ----------------- ...
- WPF Navigation
在开始学习WPF时,一开始对WPF的Window, Page, UserControl感到很迷惑.不知道什么时候该使用哪一个.下面简单介绍一下这三者的区别. Window:故名思意,桌面程序的窗体.在 ...
- [Surface] 在win8.1上使用QQ截图放大问题(解决办法)
在使用每次截图的时候整个都被放大了,很让人郁闷,截不到完整的图,本着遇到问题解决问题的想法,这事早解决早好. 开工: 1. 度娘上搜索"win8 qq截图 放大",找到很多资料 ...
- unity3D与网页的交互---做项目的一点总结
(来自博客园) 由于项目需要,要求用unity来展示三维场景,并在三维中能够方便的查询数据库等.一开始尝试在unity中直接连接数据库,当时连的xml,然而每次发布成网页后都会出现路径找不到等问题,所 ...
- ios摇一摇截屏代码
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- $(function(){})与window.onload的区别
不太一样window.onload是在页面所有的元素都加载完成后才触发$(function(){})是在页面的dom结构加载完毕后就触发 dom里的内容不一定都已经加载完成比如说一个页面有好多图片 而 ...