面向22世纪的现代化应用程序可以同时在多种设备上运行,于是有朋友会有一个疑问:有时候,我们还真的需要判断一下,UAP应用程序在哪个平台上运行。尽管大多情况下我们不必要这样做,但某些特殊情况还得考虑。比如一串数据列表,我希望如果在桌面上运行时就以横向列表展现;但要是运行在手机上就以纵向列表展现。
也就是说,其实我们只需分析两种情况即可:
一、桌面。(台式机、笔记本、平板、游戏机、发广告专用机、导航器……)
二、移动环境。其实就是手机。
那么,有啥办法可判断呢?勿急,老周先告诉你,方法比较简单。咱们先看一段代码:
var context = ResourceContext.GetForCurrentView(); string s = string.Empty; foreach (var item in context.QualifierValues) { s += item.Key + " : " + item.Value; s += "\n"; } tb.Text = s;
ResourceContext类在Windows.ApplicationModel.Resources.Core命名空间下,就是用于访问与当前应用程序的限定资源的API,也可以把这个“资源”理解为应用程序的一些配置信息,如什么语言的,日语的还中文的;什么主题基调的,浅色还是深色;什么比例的,缩放100%还是180%……
调用ResourceContext.GetForCurrentView()方法可以直接得到ResourceContext实例,再通过QualifierValues属性得到一个字典数据:Key为字符串,Value也是字符串。QualifierValues属性表示该资源的限定符集合。
悟性高的朋友可能已经猜到其中的玄机了,不过猜不到也不用急,现在我们用上面的代码做两件事,做完这两件事你就会明白了。
第一件事,在本地计算机和平板模拟器上运行应用,然后得到如下图的结果:
第二件事,在手机模拟器上运行一下,得到结果如下:
不知道你看懂了没,如果还没有看出其中的奥妙,那老周就揭晓了:在资源限定符字典中,有一条记录的Key为DeviceFamily,如果在桌面上运行的话,它的Value就是Desktop;如果在手机上运行,Value就是Mobile。
怎么样,现在懂了吧?
那么,你猜猜,如果判断UAP正在运行的设备,该想到方法了吧。
老周给出个例子,界面上有个StackPanel容器,里面放了几块正方形的烧饼。如果在桌面上运行,烧饼就横着放;如果在手机上运行,烧饼就竖着放,以方便用户流口水。
XAML代码如下:
<StackPanel Margin="15" Name="panel"> <Rectangle Margin="14" Width="125" Height="125" Fill="Yellow"/> <Rectangle Margin="14" Width="125" Height="125" Fill="Red"/> <Rectangle Margin="14" Width="125" Height="125" Fill="Pink"/> <Rectangle Margin="14" Width="125" Height="125" Fill="Orange"/> </StackPanel>
处理代码如下:
// 得到资源上下文对象 ResourceContext resContext = ResourceContext.GetForCurrentView(); // 访问键名为DeviceFamily的值 string value = resContext.QualifierValues["DeviceFamily"]; // 分析 if (value == "Desktop") { panel.Orientation = Orientation.Horizontal; } else { panel.Orientation = Orientation.Vertical; }
OK,首先,在本地计算机上运行一下,结果如下:
接着,在手机模拟器上运行,结果如下:
看来这个DeviceFamily确实很Family。
补充:后来发现,访问Windows.System.Profile.AnalyticsVersionInfo.DeviceFamily属性也可以获得平台名称。