uwp汉堡菜单的实现
---恢复内容开始---
现在uwp上面的汉堡菜单(就是那个三道杠,点击之后会出现菜单)使用的越来越普遍,比如微软自己家的Cortana。现在我使用的实现方法是使用SplitView实现。首先SplitView将整个App的界面分成两块,一块是弹出来的汉堡菜单,一块是收起汉堡菜单之后App的界面。弹出来的汉堡菜单叫做Pane,这个界面在<SplitView.Pane></SplitView.Pane>标签下面写,就和普通的页面布局一样,该用Grid就用Grid(对了,现在微软所谓的响应式布局是不是推荐使用Grid?)
<SplitView.Pane>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button x:Name="btnSplitViewClose" Grid.Column="0" Click="btnSplitViewClose_Click">
<Image Source="Assets/Menu.png" Height="30" Width="30"/>
</Button>
<TextBlock Text="目录" Grid.Column="1" x:Name="PaneHeader"
Margin="30,12,0,0" Style="{StaticResource BaseTextBlockStyle}"/>
</Grid>
<ListView x:Name="NavLinksList" Margin="0,12,0,0" SelectionMode="None" Grid.Row="1" VerticalAlignment="Stretch"
ItemClick="NavLinksList_ItemClick" IsItemClickEnabled="True"
ItemsSource="{x:Bind NavLinks}" ItemTemplate="{StaticResource NavLinkItemTemplate}"/>
</Grid>
</SplitView.Pane>
效果是这样的:

剩下的Span收起后的界面就是和平常写界面的一样啦,把汉堡菜单忘掉之后接着写自己的App界面就好。
这个界面的所有XAML是这样的:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" x:Name="rootGrid">
<SplitView
DisplayMode="Overlay"
OpenPaneLength="220"
x:Name="splitView">
<SplitView.Pane>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button x:Name="btnSplitViewClose" Grid.Column="0" Click="btnSplitViewClose_Click">
<Image Source="Assets/Menu.png" Height="30" Width="30"/>
</Button>
<TextBlock Text="目录" Grid.Column="1" x:Name="PaneHeader"
Margin="30,12,0,0" Style="{StaticResource BaseTextBlockStyle}"/>
</Grid>
<ListView x:Name="NavLinksList" Margin="0,12,0,0" SelectionMode="None" Grid.Row="1" VerticalAlignment="Stretch"
ItemClick="NavLinksList_ItemClick" IsItemClickEnabled="True"
ItemsSource="{x:Bind NavLinks}" ItemTemplate="{StaticResource NavLinkItemTemplate}"/>
<!--<StackPanel Orientation="Horizontal"
Grid.Row="2" Margin="14,24,0,24">
<SymbolIcon Symbol="Setting"/>
<TextBlock Text="Settings" Margin="24,0,0,0"
VerticalAlignment="Center" Tapped="TextBlock_Tapped"/>
</StackPanel>-->
</Grid>
</SplitView.Pane>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<!--你的主界面代码-->
</SplitView>
</Grid>
</Grid>
private ObservableCollection<NavLink> _navLinks = new ObservableCollection<NavLink>()
{
new NavLink() {Label="个性化",Symbol=Symbol.People },
new NavLink() {Label="地图",Symbol=Symbol.Map },
new NavLink() { Label = "联系我", Symbol = Windows.UI.Xaml.Controls.Symbol.Mail },
new NavLink() { Label = "使用帮助", Symbol = Symbol.Help },
new NavLink() {Label="Settings",Symbol=Symbol.Setting }
}; public ObservableCollection<NavLink> NavLinks
{
get { return _navLinks; }
} private void NavLinksList_ItemClick(object sender, ItemClickEventArgs e)
{
switch((e.ClickedItem as NavLink).Label)
{
case "个性化":
this.Frame.Navigate(typeof(PersonalSettings));
break;
case "地图":
this.Frame.Navigate(typeof(Map));
break;
case "联系我":
conTool.SendEmail("cncmn@sina.cn", "反馈", "紧急求助反馈", "");
break;
case "使用帮助":
this.Frame.Navigate(typeof(UserGuide));
break;
case "Settings":
this.Frame.Navigate(typeof(Settings));
break;
default:
break;
}
}
附上后台响应包括ListView数据源的C#代码。
有时候大家打开这个汉堡菜单喜欢主界面上右划打开,左划关闭。实现起来也十分简单。
private void RootGrid_PointerPressed(object sender, PointerRoutedEventArgs e)
{
beforePoint = e.GetCurrentPoint(rootGrid);
} private void RootGrid_PointerReleased(object sender, PointerRoutedEventArgs e)
{
afterPoint = e.GetCurrentPoint(rootGrid);
if((beforePoint.PointerId==afterPoint.PointerId&&(afterPoint.Position.X-beforePoint.Position.X>))||
(beforePoint.PointerId == afterPoint.PointerId && (afterPoint.Position.Y - beforePoint.Position.Y > )))
{
splitView.IsPaneOpen = true;
}else if(beforePoint.PointerId == afterPoint.PointerId &&
((afterPoint.Position.X - beforePoint.Position.X < -)|| (afterPoint.Position.Y - beforePoint.Position.Y < -))
&& splitView.IsPaneOpen)
{
splitView.IsPaneOpen = false;
}
}
其中,rootGrid是上面定义的一个Grid的Name,通过SplitView.IsPaneOpen的赋值是True或者False来控制汉堡菜单的开关,其中,beforePoint和afterPoint是PointerPoint的两个对象,用于存储手势开始和结束的两个点。我这里定义向下和向右都可以打开汉堡菜单。
uwp汉堡菜单的实现的更多相关文章
- 10分钟制作UWP汉堡菜单
什么是汉堡菜单? 汉堡菜单,指的是一个可以弹出和收回的侧边栏.在UWP和Android应用中,汉堡菜单都非常常见. 首先我们列出所有需要掌握的前置知识: 1,SplitView 2,StackPane ...
- (UWP开发)在ListView中通过向右滑动展开汉堡菜单
首先在移动APP开发中,手势滑动已经成为一个必备的技能,无论大大小小的APP都需要拥有手势滑动功能.在Android和iOS操作系统的APP中,手势滑动比较普及.然而由于国内有关UWP应用的教程比较少 ...
- Win10 UWP 开发系列:使用SplitView实现汉堡菜单及页面内导航
在Win10之前,WP平台的App主要有枢轴和全景两种导航模式,我个人更喜欢Pivot即枢轴模式,可以左右切换,非常方便.全景视图因为对设计要求比较高,自己总是做不出好的效果.对于一般的新闻阅读类Ap ...
- 张高兴的 Xamarin.Forms 开发笔记:为 Android 与 iOS 引入 UWP 风格的汉堡菜单 ( MasterDetailPage )
所谓 UWP 样式的汉堡菜单,我曾在"张高兴的 UWP 开发笔记:汉堡菜单进阶"里说过,也就是使用 Segoe MDL2 Assets 字体作为左侧 Icon,并且左侧使用填充颜色 ...
- 张高兴的 UWP 开发笔记:汉堡菜单进阶
不同于Windows 8应用,Windows 10引入了"汉堡菜单"这一导航模式.说具体点,就拿官方的天气应用来说,左上角三条横杠的图标外加一个SplitView控件组成的这一导航 ...
- 使用MvvmCross框架实现Xamarin.Forms的汉堡菜单布局
注:本文是英文写的,偷懒自动翻译过来了,原文地址:Implementing MasterDetail layout in Xamarin.Forms by MvvmCross 欢迎大家关注我的公众号: ...
- WPF实现Win10汉堡菜单
WPF开发者QQ群: 340500857 | 微信群 -> 进入公众号主页 加入组织 前言 有小伙伴提出需要实现Win10汉堡菜单效果. 由于在WPF中没有现成的类似UWP的汉堡菜单,所以我们 ...
- 【Win10开发】关于汉堡菜单-SplitView的用法
SplitView(汉堡菜单)是win10新加的一种控件,顾名思义,其实就是将视图分割成两部分,废话不多说,下面来介绍一下SplitView的基本用法. 首先介绍几个SplitView经常用到的属性. ...
- UWP 圆形菜单
用过Surface dial的童鞋们都很熟悉,当使用Dial的时候,那个圆形菜单很漂亮,那么我们在普通的uwp中是否也可以实现吗? 答案是肯定的. 其实这是来源于GayHub的一个开源项目,做的很不错 ...
随机推荐
- POJ 2728 - 最小比例生成树
传送门 题目大意 有n个村庄,每个村庄都有一个(x, y)坐标和z海拔,定义两个村庄间的dist为坐标的距离,cost为海拔差的绝对值,求图的一颗生成树,使得\(\frac{\sum cost}{\s ...
- 【t012】整理书架
Time Limit: 1 second Memory Limit: 32 MB [问题描述] 小明是一个非常喜欢读书的孩子,他有一个特别的书架,书架上摆放着他买的新书.当他决定要阅读某本图书时,他就 ...
- Android开发入门——Andoird Studio的安装与配置
Android的开发离不开Java,仍然需要对Java进行安装与配置,所以我写了上一篇文章,Java的安装与配置. 开始进行Android Studio的安装与配置. 一.进行配置Java,如果电脑里 ...
- switch语句中default用法详解
当年学C语言switch开关语句的时候,很多人会告诉你它是这么用的: switch(表达式){ case常量表达式1: 语句1;break; case常量表达式2: 语句2;break; - case ...
- 解决mysql连接异常—-com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception
DBCP连接池连接MySql数据库时,一奇葩数据库设置为30秒内无请求自动断开.超时后链接无法关闭,活动链接数飞奔,最后挂掉. 网上找了一圈,一般是这三种,方法一pass,方法二测试无效可能设置错了吧 ...
- Android的PVPlayer介绍
1 Player的组成 OpenCore的Player的编译文件是pvplayer/Android.mk,将生成动态库文件 libopencoreplayer.so.这个库包括了双方面的内容:一方是P ...
- MySQL - 常见的三种数据库存储引擎
原文:MySQL - 常见的三种数据库存储引擎 数据库存储引擎:是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧. ...
- 开发Android项目中使用androidannotations
前言 最近接手了一个工程,使用了androidannotations,因为以前使用过butterknife所以有似曾相识的感觉,但是有些用法还是不一样,所以就花时间学习了下androidannotat ...
- 假设做一个循环滚动UIScrollView
先上效果图: 首先初始化: - (void)viewDidLoad { //加入最后一张图 用于循环 int length = 4; NSMutableArray *tempArray = [NSMu ...
- [WebGL入门]十一,着色器编译器和连接器
注意:文章翻译http://wgld.org/,原作者杉本雅広(doxas).文章中假设有我的额外说明.我会加上[lufy:].另外.鄙人webgl研究还不够深入.一些专业词语,假设翻译有误.欢迎大家 ...