【翻译】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: ...
随机推荐
- 企业邮箱在Android(安卓)系统手机上POP3/IMAP协议的设置方法
此处以三星(系统版本4.4.2)为例,介绍下使用安卓系统自带的客户端如何设置pop/imap协议方式方法 以下我们将使用test@zhuyuming.so 为测试案例,请您操作时更换成您自己的邮箱账号 ...
- JAVA-android 更改APP名称与图标
首先要在你的资源文件放入你想换的图标图片拖到drawable-XX文件夹下,然后你打开AndroidManifest.xml这个配置清单文件找到application标签里的这句android:ico ...
- Centos和Redhat的区别和联系
网上看到的,转载给大家 CentOS与RedHat的关系: RedHat在发行的时候,有两种方式:二进制的发行方式以及源代码的发行方式.无论是哪一种发行方式,你都可以免费获得(例如从网上下载),并再次 ...
- 【2016-10-13】【坚持学习】【Day4】【virtual 虚函数】
定义一个基类,有一个虚函数 定义三个子类,分别继承,重写,New,这个虚函数 abstract class Test { public virtual void Prinf() { Console ...
- 《Invert》开发日志03:一些想法
本来标题想写“详细设计”,但是由于独立游戏开发有很强的探索性,最终项目一定是经过原型调整迭代而来的,所以在实际效果出来之前把设计做得太细并没有太大意义,现在只能先陈列目前的一些想法,不能定义“它是什么 ...
- 基于网格的波动方程模拟(Wave equation on mesh)附源码
波动方程是偏微分方程 (PDE) 里的经典方程,它在物理学中有大量应用并经常用来解释空间中的能量传播.波动方程是一个依赖时间的方程,它解释了系统状态是如何随着时间的推移而发生变化.在下面模拟波动方程时 ...
- iOS - 用 UIBezierPath 实现果冻效果
最近在网上看到一个很酷的下拉刷新效果(http://iostuts.io/2015/10/17/elastic-bounce-using-uibezierpath-and-pan-gesture/). ...
- 配置Tomcat使用Redis作为session管理
1. 在 tomcat/lib 中增加以下jar包 commons-pool2-.jar jedis-.jar tomcat-redis-session-manager-.jar 2. 修改tomca ...
- python子网拆分IP段
# author: 阿辉枫情 import re import struct import socket def IPSplitBlocks(minip, maxip): result = [] Ju ...
- Cordova - 常用的插件汇总(附插件的安装、查询、更新、删除等命令)
Hybrid应用比web应用强大之处在于可以使运行在容器中的web内容访问 native APIs.Cordova 提供了许多插件用于调用移动设备上的API. 一,插件相关常用命令 1,查看所有已 ...