Windows 10通用应用程序针对特定的平台还会有一个子API的集合,当我们要使用到某个平台的特定API的时候(比如手机相机硬件按钮触发事件),这时候就需要调用特定平台的API。因为Windows 10应用程序是一个安装包可以部署到所有的Windows 10系统平台的,所以这里就涉及到一个API适配的问题,对特定平台的API进行特殊处理。除了特定平台的API之外,还有一个适配的工作就是界面的适配,Windows 10也提供了一系列的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所示。
Windows 10系统支持多种硬件平台和分辨率,Windows 10系统底层对界面的适配也是非常强大的,同样的控件在不同的硬件平台上显示也可能会有差异,这种适配就是由Windows 10 系统自己来完成适配,来匹配不同的硬件和分辨率的显示效果。虽然Windows 10底层完成了各种控件的适配,但是很多时候还是需要我们在程序里面来实现适配的。我们在开发通用程序的时候要充分地考虑到各种不同分辨率下的显示效果,可以通过可视化设计界面和各种分辨率的模拟器来进行测试。适配界面有几种常用的编程技巧(1)使用相对的布局控件来进行排列,如Grid、RelativePanel等;(2)使用相对的属性来设置控件在容器的位置,如orizontalAlignment、VerticalAlignment属性;(3)设置长度宽度的最大值最小值限制;(4)根据设备实际分辨率来设置长度宽度或者位置。详细的界面适配编程知识将会在布局的章节进行讲解。