【翻译】Windows 10 中为不同设备加载不同页面的3种方法
在以前,为PC和手机做App是两个工程,PC和手机各一个。在Windows 10中会发现只有一个了,对于简单的页面变化可以使用VisualState来解决,但是比如网易云音乐这种PC版和手机版差异巨大使用VisualState也许就力不从心了。如何解决因为UI差异过大所导致的问题?
有两个解决方案
1.分别为PC和手机创建单独的安装包
2.在运行时动态加载
UWP版本淘宝选择了第一种方式,其实这样的方式和Win8.1下的通用App是一样的,应该叫做UAP。建议根据实际情况选择对应的解决方案
下面我们就来看一下如何实现运行时动态加载页面。原文
第一种:DeviceFamily-Type folder
首先创建一个空白的工程,在MainPage中添加一下代码
<TextBlock Foreground="Red" Text="This is desktop." FontSize="72"
VerticalAlignment="Center" HorizontalAlignment="Center"/>
然后在工程中添加DeviceFamily-Mobile文件夹,并向其中添加一个名称为MainPage的View

然后添加一下代码:
<TextBlock Text="Hello Windows Phone"
HorizontalAlignment="Center"
Foreground="Red"
VerticalAlignment="Center" />
运行效果如下:


需要注意的是:DeviceFamily-Type文件夹必须与Page页面在同一层

第二种:.DeviceFamily-Type in file name
第二种其实很简单就是把刚才的文件夹换成了文件

注意:不能同时使用1,2两种方法
第三种:重载InitializeComponent方法
前两种其实都是一种合约,但是第三种非常强大,可以编写自己的逻辑。
首先我们在解决方案资源管理器中将MainPage展开,会发现MainPage类中有两个InitializeComponent方法

点击任意一个InitializeComponent方法
会打开MainPage.g.i.cs这个文件,这个其实是一个XAML设计器生成的文件, 用于代码提示。

从图中可以发现,在构造函数中调用的是第一种重载, <( ̄︶ ̄)>,也就是说我们可以手动调用第二个不就完嘛!
下面给出一段代码:
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
private bool _isMobile = Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons");
public MainPage()
{
if (!_isMobile)
this.InitializeComponent();
else
this.InitializeComponent(new Uri("ms-appx:///PrimaryMainPage.xaml", UriKind.Absolute));
}
}
需要注意的是:请保持MainPage前台页面是空的,否则当前台出现带有x:Name的控件时,XAML设计器生成的代码就会变成了下面这一种。

会发现InitializeComponent(System.Uri resourceLocator)这一种重载没有了!!!,这是XAML设计器的生成规则,所以请保持MainPage页面前台也就是跳转页面前台是干净的,否则很有可能无法通过编译,而且本来MainPage在这种情况下就是没有用的,只不过是为了做一个跳转而已,所以此时只需要为手机,PC或者是Table分辨创建页面然后在运行时判断加载哪一个。至于ViewModel之类的能否共享就看实际的需求和程序的设计了
各位还可以在第三种方法上继续发挥想象力。
以上就是三种运行时动态加载页面的方法。
谢谢啦!
【翻译】Windows 10 中为不同设备加载不同页面的3种方法的更多相关文章
- 如何完全禁用或卸载Windows 10中的OneDrive - 51CTO.COM
OneDrive 是微软的个人云存储平台,提供了对个人用户的文件托管.存储和同步等服务,OneDrive 默认被内置在 Windows 10 操作系统当中,而且当用户使用 微软账户 登录时,OneDr ...
- [转载]在 Windows 10 中, 如何卸载和重新安装 OneNote App
在 Windows 10 中, 如何卸载和重新安装 OneNote App 15/8/2015 使用 PowerShell 命令卸载 OneNote App 开始菜单 -> 输入 "P ...
- 在Windows 10中截取截图的6种方式 简介
在Windows 10中截取截图的6种方式 简介 截图对于不同的目的很重要.它可以用于捕获笔记本电脑上的任何内容的截图.所以,如果你使用Windows 10,你可能不知道如何截图,因为它是比较新的.因 ...
- 重装助手教你如何在Windows 10中更改您的帐户名称
当您设置新的Win10免费下载 PC时,您选择用户名的部分可能会让您措手不及.如果是这种情况,您可以选择弹出头部的第一件事或者您打算稍后更改的随机和临时事物.但令人惊讶的是,在Windows 10中更 ...
- 如何在 Windows 10 中搭建 Node.js 环境?
[编者按]本文作者为 Szabolcs Kurdi,主要通过生动的实例介绍如何在 Windows 10 中搭建 Node.js 环境.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 在本文中 ...
- Windows 10 中的存储空间
存储空间有助于保护你的数据免受驱动器故障的影响,并随着你向电脑添加驱动器而扩展存储.你可以使用存储空间将两个或多个驱动器一起分组到一个存储池中,然后使用该池的容量来创建称为存储空间的虚拟驱动器.这些存 ...
- [转]如何在Windows 10中更改文件夹背景颜色
ini文件.我们甚至可以使用相同的技术将图片设置为文件夹背景. 已有工具可以更改Windows 7中Windows资源管理器背景的颜色,并将图像设置为Windows 7中的文件夹背景,但这些工具与Wi ...
- []如何在Windows 10中更改文件夹背景颜色
ini文件.我们甚至可以使用相同的技术将图片设置为文件夹背景. 已有工具可以更改Windows 7中Windows资源管理器背景的颜色,并将图像设置为Windows 7中的文件夹背景,但这些工具与Wi ...
- 在 Windows 10 中开启移动 WLAN 热点
本文将介绍如何在 Windows 10 中开启移动 Wi-Fi 热点. This post is written in multiple languages. Please select yours: ...
随机推荐
- HTTP请求工具类
HTTP请求工具类,适用于微信服务器请求,可以自测 代码; /// <summary> /// HTTP请求工具类 /// </summary> public class Ht ...
- 好用的排名函数~ROW_NUMBER(),RANK(),DENSE_RANK() 三兄弟
排名函数三兄弟,一看名字就知道,都是为了排名而生!但是各自有各自的特色!以下一个例子说明问题!(以下栗子没有使用Partition By 的关键字,整个结果集进行排序) RANK 每个值一个排名,同样 ...
- MySQL 优化之 index merge(索引合并)
深入理解 index merge 是使用索引进行优化的重要基础之一.理解了 index merge 技术,我们才知道应该如何在表上建立索引. 1. 为什么会有index merge 我们的 where ...
- msysGit管理GitHub代码
msysGit管理GitHub代码 代码的管理,在日常开发中是很重要的环节,程序员的修炼三部曲——版本控制,单元测试,项目自动化. 本篇就简单的说说通过msysGit来管理GitHub中的代码,实 ...
- windows下使用mysql双机热备功能
一. 准备工作 1. 准备两台服务器(电脑),接入局域网中,使互相ping得通对方 2. 两台服务器都安装mysql-server-5.1,必须保证mysql的版本一致 3. 假设,服务器A:192. ...
- Linux信号
信号本质上就是一个软件中断,它既可以作为两个进程间的通信的方式, 更重要的是, 信号可以终止一个正常程序的执行, 通常被用于处理意外情况 ,* 信号是异步的, 也就是进程并不知道信号何时会到达 $ki ...
- mysql优化之索引篇
对mysql优化是一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) b: 添加适当索引(index) [四种: 普通索引.主键索引.唯一索引unique.全文索引] c: 分表技术(水平 ...
- Oracle Dataguard的原理与基本配置
最近集团在做灾备方案,用于Oracle的高可用性,在不影响主库性能的前提下,我们选择使用DG的"最大性能"模式. DG是Oracle数据库自带的数据同步功能,其基本原理是将日志 ...
- 谁在死锁Mutex——用Windbg查找Mutex死锁所有者线程
Who is blocking that Mutex? - Fun with WinDbg, CDB and KD 05 Aug 2006 By Ingo Rammer I'm currently t ...
- 嵌入式Linux驱动学习之路(九)Linux系统调用、驱动程序框架
应用程序通过open read write close 等函数来操作计算机硬件.类似是一个接口. 当应用程序调用这些接口程序时,计算机是如何进入内核的呢?这是经过了系统调用. 实际上当调用接口函数 ...