UWP 快速的Master/Detail实现
最近在写快报(还没有写完)的过程中,一开始就遇到了这个Master/Detail如何实现的问题。
微软给出Demo并不符合要求,搜索后找到了今日头条开发者写的一篇 :实现Master/Detail布局
拜读之后感觉实现有些麻烦,所以呢这里给出一个更快速的实现。
好滴,下面直接进入正题。
为了实现Master/Detail我决定和今日头条开发者一样采用左右各一个Frame来托管页面
<Grid.ColumnDefinitions> <ColumnDefinition x:Name="MasterColumn" Width="500" /> <ColumnDefinition x:Name="DetailColumn" Width="*" /> </Grid.ColumnDefinitions>
这里左侧给出的宽度为500作为新闻列表的宽度
然后添加两个Frame
<Frame x:Name="MasterFrame" Grid.Column="0" x:FieldModifier="Public"> </Frame> <Frame x:Name="DetailFrame" Grid.Column="1" x:FieldModifier="Public"> </Frame>
然后呢我们为添加一个VisualState,并且添加CurrentStateChanged事件
<VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="AdaptiveStates" CurrentStateChanged="AdaptiveStates_CurrentStateChanged"> <VisualState x:Name="DefaultState"> <VisualState.StateTriggers> <AdaptiveTrigger MinWindowWidth="720"></AdaptiveTrigger> </VisualState.StateTriggers> </VisualState> <VisualState x:Name="NarrowState"> <VisualState.StateTriggers> <AdaptiveTrigger MinWindowWidth="0"></AdaptiveTrigger> </VisualState.StateTriggers> <VisualState.Setters> <Setter Target="MasterColumn.Width" Value="*" /> <Setter Target="DetailColumn.Width" Value="0" /> <Setter Target="DetailFrame.(Grid.Column)" Value="0"/> </VisualState.Setters> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups>
看到这里想必各位已经知道了如何实现了,就是在NarrowState的时候主动把右侧的Column宽度设置为0,然后把DetailFrame从右侧移到左侧,此时DetailFrame会覆盖在MasterFrame之上。那么你肯定会问要是DetailFrame里没有内容呢?本应该显示MasterFrame的,但现在DetailFrame将其遮盖了。
其实这就是上面为什么要监听CurrenStateChanged事件的原因
在CurrentStateChanged事件里可以判断如果DetailFrame中内容为空,直接将其设置为不可见就可以了。
下面给出这个函数的代码
private void AdaptiveStates_CurrentStateChanged(object sender, VisualStateChangedEventArgs e) { UpdateUI(); } private void UpdateUI() { if (AdaptiveStates.CurrentState.Name == "NarrowState") { DetailFrame.Visibility = DetailFrame.CanGoBack ? Visibility.Visible : Visibility.Collapsed; } SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = DetailFrame.CanGoBack || MasterFrame.CanGoBack ? AppViewBackButtonVisibility.Visible : AppViewBackButtonVisibility.Collapsed; }
为了能在实现在NarrowState的情况下从点击MasterFrame中的新闻之后可以让DetailFrame从不可见变为可见还需要订阅MasterFrame的Navigated事件
为了在按下后退键后DetailFrame被清空后可以返回MasterFrame同样还需要订阅DetailFrame的Navigated事件
所以呢在构造函数如下
public MainPage() { this.InitializeComponent(); this.NavigationCacheMode = NavigationCacheMode.Required; #region Event DetailFrame.Navigated += DetailFrame_Navigated; MasterFrame.Navigated += MasterFrame_Navigated; SystemNavigationManager.GetForCurrentView().BackRequested += View_BackRequested; #endregion }
private void MasterFrame_Navigated(object sender, NavigationEventArgs e) { UpdateUI(); } private void DetailFrame_Navigated(object sender, NavigationEventArgs e) { ) { DetailFrame.BackStack.RemoveAt(); } UpdateUI(); }
这里需要交代一下快报的情况,DetailFrame默认会有一个背景页面而且默认DetailFrame页面深度为2所以会主动清空上一次的详细页面,这就是RemoveAt(1)的原因。
同样的后退键事件处理函数如下:
private void View_BackRequested(object sender, BackRequestedEventArgs e) { if (DetailFrame.CanGoBack) { DetailFrame.GoBack(); e.Handled = true; } else if (MasterFrame.CanGoBack) { MasterFrame.GoBack(); e.Handled = true; } }
大体的思路就是这样,具体的代码还是直接看源码吧!懒得粘贴了。源文件
最终实现的效果如图:
UWP 快速的Master/Detail实现的更多相关文章
- Win10 UWP开发系列:实现Master/Detail布局
在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...
- Android的Master/Detail风格界面中实现自定义ListView的单选
原文在这里:http://duduli.iteye.com/blog/1453576 可以实现多选,那么如何实现单选呢,这里我写了一个非常简单的方法: public void onListItemCl ...
- Win10 UWP系列:关于错误 0x80073CF9及一个小bug的解决
最近一直在开发XX的uwp版本,也是边摸索边做,最近遇到几个比较奇怪的问题,记录于此. 1.项目可用部署到PC,但无法部署到手机,提示以下错误: 错误 : DEP0001 : 意外错误: Instal ...
- PC版淘宝UWP揭秘
经过第一轮内测后的bug数量:65 2015/11/27 - bug数量 = 60 2015/11/30 - bug数量 = 53 2015/12/1 - bug数量 = 49 2015/12/2 - ...
- 如何用SAP WebIDE的Fiori创建向导基于ABAP OData service快速创建UI5应用
如果我们手上已经有可以正常工作的OData服务,无论位于ABAP on-premise系统还是public上的internet OData service,都可以用SAP WebIDE里的Fiori创 ...
- “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)
前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...
- 【转】推荐10款最热门jQuery UI框架
推荐10款最热门jQuery UI框架 原创 在进行Web开发时,并非所有的库都适合你的项目,但你仍需要收藏一些Web UI设计相关的库或框架,以在你需要的时候,加快你的开发效率.本文为你推荐10款非 ...
- jquery 中的框架
DWZ 国产Ajax RIA开源框架 Ninja UI 框架 提供页面插件 angela ui框架 表单布局等 Chico UI 快速页面布局 PrimeUI w2ui 布局 ...
- 交互设计师常用的web设计模式(转)
交互设计师在设计线框图原型时,熟知常见的web设计模式很有帮助,做到“心中有数”才能创造出符合需求,用户易学易用的界面来.所谓“没有必要重复发明轮子”,模式往往容易解决常见问题,正确的模式能帮用户熟悉 ...
随机推荐
- python中set集合
一.set集合的特性 访问速度快 天生解决重复问题 二.set变量申明 s1 = set() s2 = set([1,2,3]) 备注:第二种方式在set类中直接传入一个序列. 三.set类中方法大全 ...
- 初学Mahout测试kmeans算法
预备工作: 启动hadoop集群 准备数据 Synthetic_control.data数据集下载地址http://archive.ics.uci.edu/ml/databases/synthetic ...
- Bootstrap入门(二)栅格
Bootstrap入门(二)栅格 Bootstrap入门(二)栅格 全局CSS样式--栅格 先引入本地的CSS文件(根据自己的文件夹,有不同的引入地址,我是放在一个新建的名为css的文件夹中) con ...
- Windows 保存BMP图片
在Windows下保存BMP图片还是挺方便的,直接上代码,拷贝就能用 void savebmp(uchar * pdata, char * bmp_file, int width, int heigh ...
- nodeJS Express 删除 x-powered-by
在使用Express4 Header头部会输出,在晚上搜索几种方案也没有产生效果,就看了一下官方文档 Property Type Value Default x-p ...
- seq
Linux 中seq 命令的用法 用于产生从某个数到另外一个数之间的所有整数 用法: seq [选项]... 尾数 或:seq [选项]... 首数 尾数 或:seq [选项]... 首数 增量 尾数 ...
- Puppet3在CentOS6.5集群下的安装
环境:3台主机, IP分别为10.211.55.11.12.13 puppet master安装在10.211.55.11 puppet agent安装在10.211.55.11.12.13 1.安装 ...
- @Value取不到值引出的spring的2种配置文件applicationContext.xml和xxx-servlet.xml
项目中经常会用到配置文件,定义成properties的形式比较常见,为了方便使用一般在spring配置文件中做如下配置: <context:property-placeholder ignore ...
- Entity framework 级联删除注意事项
版本:EF6.0.1 RC 一对多场景,在子对象映射中开启级联删除情况下,删除父对象将自动删除其下所有子对象,需要注意一些事项: 需要保证DbContext中已经加载了该父对象的所有子对象. 如果Db ...
- Pairs Forming LCM(素因子分解)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=109329#problem/B 全题在文末. 题意:在a,b中(a,b<=n) ...