不同于Windows 8应用,Windows 10引入了“汉堡菜单”这一导航模式。说具体点,就拿官方的天气应用来说,左上角三条横杠的图标外加一个SplitView控件组成的这一导航模式就叫“汉堡菜单”。

  本文讨论的是如何实现官方的这一样式(点击后左侧出现一个填充矩形),普通实现网上到处都是,有需要的朋友自己百度下吧。

  下面将介绍两种不同的实现方法,第一种最简单的方法是直接使用 Template 10 模板,第二种就是纯手写了。

  若有什么不正确的地方望指正,大家共同讨论。

  1. Template 10 模板

  使用 Template 10 模板可以快速建立出应用的框架,简单快捷。(帮助文档 https://github.com/Windows-XAML/Template10/wiki )

  要使用 Template 10 首先点击 Visual Studio “工具”菜单中的“扩展与更新”,搜索并安装 Template 10(简化搜索可以直接输入t10)

  安装完成需要重启,重启后按下图找到项目模板新建即可,使用很简单,帮助文档连接也在上方给出。

  2. 手写

  先分析一下界面的构成,暂时不看标题栏,由一个设置了 Canvas.ZIndex 的 Button 和一个 SplitView 构成。SplitView.Pane 中又包含了两个ListView(一级菜单和二级菜单)。ListView 里的每个 Item 又由 Rectangle,FontIcon,TextBlock 组成。见下图

  构成清晰之后实现的思路大概也就清晰了。下面给一个简单的Demo,解决方案结构如下。(GitHub https://github.com/ZhangGaoxing/uwp-demo/tree/master/HamburgerDemo)

  先创建一个NavMenuItem类

using System;
using System.ComponentModel;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Media;namespace HamburgerDemo
{class NavMenuItem : INotifyPropertyChanged{// 记录图标字体public FontFamily FontFamily { get; set; }// 图标的C#转义代码public string Icon { get; set; }// 标题public string Label { get; set; }// 导航页public Type DestPage { get; set; }// 用于左侧矩形的显示private Visibility selected = Visibility.Collapsed;public Visibility Selected{get { return selected; }set{selected = value;this.OnPropertyChanged("Selected");}}// 双向绑定,用于更新矩形是否显示public event PropertyChangedEventHandler PropertyChanged;public void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}}
}

  

  主页面框架代码

<Pagex:Class="HamburgerDemo.MainPage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:HamburgerDemo"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"><Page.Resources><!--菜单的数据模板--><DataTemplate x:Key="DataTemplate"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="48" /><ColumnDefinition Width="*" /></Grid.ColumnDefinitions><Rectangle Fill="{ThemeResource SystemControlBackgroundAccentBrush}" Visibility="{Binding Selected, Mode=TwoWay}" HorizontalAlignment="Left" Width="5" Height="48" /><FontIcon FontFamily="{Binding FontFamily}" Glyph="{Binding Icon}" Foreground="White" VerticalAlignment="Center" Margin="-2,0,0,0" Width="48" Height="48" /><TextBlock Grid.Column="1" Text="{Binding Label}" Foreground="White" Margin="12,0,0,0" VerticalAlignment="Center" /></Grid></DataTemplate><!--ListViewItem样式定制--><Style x:Key="NavMenuItemContainerStyle" TargetType="ListViewItem"><Setter Property="MinWidth" Value="{StaticResource SplitViewCompactPaneThemeLength}"/><Setter Property="Height" Value="48"/><Setter Property="Padding" Value="0"/><Setter Property="UseSystemFocusVisuals" Value="True" /><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="ListViewItem"><ListViewItemPresenter ContentTransitions="{TemplateBinding ContentTransitions}"Control.IsTemplateFocusTarget="True"SelectionCheckMarkVisualEnabled="False"PointerOverBackground="{ThemeResource SystemControlHighlightListLowBrush}"PointerOverForeground="{ThemeResource ListViewItemForegroundPointerOver}"SelectedBackground="Transparent"SelectedForeground="{ThemeResource SystemControlForegroundAccentBrush}"SelectedPointerOverBackground="{ThemeResource SystemControlHighlightListLowBrush}"PressedBackground="{ThemeResource SystemControlHighlightListMediumBrush}"SelectedPressedBackground="{ThemeResource SystemControlHighlightListMediumBrush}"DisabledOpacity="{ThemeResource ListViewItemDisabledThemeOpacity}"HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"ContentMargin="{TemplateBinding Padding}"/></ControlTemplate></Setter.Value></Setter></Style></Page.Resources><Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><!--汉堡菜单开关--><Button Name="PaneOpenButton" FontFamily="Segoe MDL2 Assets" Content="" Foreground="White" Background="{Binding BackgroundColor}" Width="48" Height="48" VerticalAlignment="Top" Canvas.ZIndex="100" /><SplitView Name="RootSplitView" DisplayMode="CompactOverlay" CompactPaneLength="48" OpenPaneLength="256" IsPaneOpen="True"><SplitView.Pane><Grid Background="#CC000000"><Grid.RowDefinitions><!--空出Button的高度--><RowDefinition Height="48" /><RowDefinition Height="*" /><RowDefinition Height="Auto" /></Grid.RowDefinitions><!--一级菜单--><ListView Name="NavMenuPrimaryListView" Grid.Row="1" VerticalAlignment="Top" SelectionMode="None" IsItemClickEnabled="True" ItemTemplate="{StaticResource DataTemplate}" ItemContainerStyle="{StaticResource NavMenuItemContainerStyle}"/><!--二级菜单--><ListView Name="NavMenuSecondaryListView" Grid.Row="2" VerticalAlignment="Bottom" SelectionMode="None" IsItemClickEnabled="True" ItemTemplate="{StaticResource DataTemplate}" ItemContainerStyle="{StaticResource NavMenuItemContainerStyle}" BorderBrush="{ThemeResource SystemControlBackgroundAccentBrush}" BorderThickness="0,1,0,0" /></Grid></SplitView.Pane><SplitView.Content><Frame Name="RootFrame" /></SplitView.Content></SplitView></Grid>
</Page>

  主页面的后台代码

using HamburgerDemo.Views;
using System.Collections.Generic;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;namespace HamburgerDemo
{public sealed partial class MainPage : Page{// 为不同的菜单创建不同的List类型private List<NavMenuItem> navMenuPrimaryItem = new List<NavMenuItem>(new[]{new NavMenuItem(){FontFamily = new FontFamily("Segoe MDL2 Assets"),Icon = "\xE10F",Label = "页面1",Selected = Visibility.Visible,DestPage = typeof(Page1)},new NavMenuItem(){FontFamily = new FontFamily("Segoe MDL2 Assets"),Icon = "\xE11A",Label = "页面2",Selected = Visibility.Collapsed,DestPage = typeof(Page1)},new NavMenuItem(){FontFamily = new FontFamily("Segoe MDL2 Assets"),Icon = "\xE121",Label = "页面3",Selected = Visibility.Collapsed,DestPage = typeof(Page1)},new NavMenuItem(){FontFamily = new FontFamily("Segoe MDL2 Assets"),Icon = "\xE122",Label = "页面4",Selected = Visibility.Collapsed,DestPage = typeof(Page1)}});private List<NavMenuItem> navMenuSecondaryItem = new List<NavMenuItem>(new[]{new NavMenuItem(){FontFamily = new FontFamily("Segoe MDL2 Assets"),Icon = "\xE713",Label = "设置",Selected = Visibility.Collapsed,DestPage = typeof(Page1)}});public MainPage(){this.InitializeComponent();// 绑定导航菜单NavMenuPrimaryListView.ItemsSource = navMenuPrimaryItem;NavMenuSecondaryListView.ItemsSource = navMenuSecondaryItem;// SplitView 开关PaneOpenButton.Click += (sender, args) =>{RootSplitView.IsPaneOpen = !RootSplitView.IsPaneOpen;};// 导航事件NavMenuPrimaryListView.ItemClick += NavMenuListView_ItemClick;NavMenuSecondaryListView.ItemClick += NavMenuListView_ItemClick;// 默认页RootFrame.SourcePageType = typeof(Page1);}private void NavMenuListView_ItemClick(object sender, ItemClickEventArgs e){// 遍历,将选中Rectangle隐藏foreach (var np in navMenuPrimaryItem){np.Selected = Visibility.Collapsed;}foreach (var ns in navMenuSecondaryItem){ns.Selected = Visibility.Collapsed;}NavMenuItem item = e.ClickedItem as NavMenuItem;// Rectangle显示并导航item.Selected = Visibility.Visible;if (item.DestPage != null){RootFrame.Navigate(item.DestPage);}RootSplitView.IsPaneOpen = false;}}
}

  运行效果图如下

转载于:https://www.cnblogs.com/zhanggaoxing/p/6218717.html

张高兴的 UWP 开发笔记:汉堡菜单进阶相关推荐

  1. 张高兴的 UWP 开发笔记:横向 ListView

    ListView 默认的排列方向是纵向 ( Orientation="Vertical" ) ,但如果我们需要横向显示的 ListView 怎么办? Blend for Visua ...

  2. 张高兴的 UWP 开发笔记:手机状态栏 StatusBar

    UWP 有关应用标题栏 TitleBar 的文章比较多,但介绍 StatusBar 的却没几篇,在这里随便写写.状态栏 StatusBar 用法比较简单,花点心思稍微设计一下,对应用会是个很好的点缀. ...

  3. 张高兴的 UWP 开发笔记:定制 ContentDialog 样式

    我需要一个背景透明的 ContentDialog,像下图一样.如何定制?写了一个简单的示例(https://github.com/ZhangGaoxing/uwp-demo/tree/master/C ...

  4. 张高兴的 Xamarin.Forms 开发笔记:为 Android 与 iOS 引入 UWP 风格的汉堡菜单 ( MasterDetailPage )...

    所谓 UWP 样式的汉堡菜单,我曾在"张高兴的 UWP 开发笔记:汉堡菜单进阶"里说过,也就是使用 Segoe MDL2 Assets 字体作为左侧 Icon,并且左侧使用填充颜色 ...

  5. iOS开发笔记--Facebook POP 进阶指南

    https://github.com/facebook/pop Facebook 在发布了 Paper 之后,似乎还不满足于只是将其作为一个概念性产品,更进一步开源了其背后的动画引擎 POP,此举大有 ...

  6. 张高兴的 Windows 10 IoT 开发笔记:BH1750FVI 光照度传感器

    张高兴的 Windows 10 IoT 开发笔记:BH1750FVI 光照度传感器 原文:张高兴的 Windows 10 IoT 开发笔记:BH1750FVI 光照度传感器 BH1750FVI 是一款 ...

  7. Android开发笔记(一百零一)滑出式菜单

    可移动页面MoveActivity 滑出式菜单从界面上看,像极了一个水平滚动视图HorizontalScrollView,当然也可以使用HorizontalScrollView来实现侧滑菜单.不过今天 ...

  8. 【QtDesigner 开发笔记】在PyCharm中配置、使用方法、信号与槽、菜单、Tab Widget、子窗口

    QtDesigner开发笔记 在PyCharm中配置QtDesigner和Pyuic QtDesigner使用:跑起一个最简单的项目 QtDesigner中使用信号与槽 方法1:设计器中连接信号与槽 ...

  9. 汉堡菜单_开发人员在编写汉堡菜单时犯的错误

    汉堡菜单 by Jared Tong 汤杰(Jared Tong) 开发人员在编写汉堡菜单时犯的错误 (The mistake developers make when coding a hambur ...

最新文章

  1. html 文件、图片、txt 下载 链接和按钮
  2. java读取本地文件_java 读取本地文件实例详解
  3. js实现连接的两种放法
  4. mysql++3307,mysql多实例配置方法
  5. 苹果笔记本上的qq 查看看自己的QQ空间 ,打开多个QQ
  6. oracle 11g的audit导致system表空间快速增长的问题
  7. mysql配置命令大全_MySQL常用命令汇总
  8. 安川机器人报错_安川机器人报错代码:原点位置数据修改
  9. 爬取mzi.com妹子图片网站(requests库)
  10. 怎么浏览计算机上的驱动程序,怎么查找和更新驱动程序
  11. 王阳明的智慧:如何让职场从“举步维艰”到“平步青云”?
  12. EasyTouch5学习笔记
  13. 《爱和自由》——孩子达到顺从的三个阶段
  14. 南京计算机工程大学分数线,2017南京信息工程大学录取分数线
  15. 前端项目:从0开始实现一个合成大西瓜
  16. PMbok 全书串讲
  17. 从事java的年龄_请教前辈们:JAVA的职业有年龄限制吗
  18. 素数判断 isPrime
  19. 成都链安预警:eos竞猜游戏FASTWIN遭黑客攻击 损失近700eos
  20. 信号与系统—让我们来了解信号

热门文章

  1. 基础排序算法及其优化(Java)
  2. CPU飙高的常见场景及处理办法
  3. RMP安装ImageMagick
  4. cocos子节点转父节点坐标 原理浅析(局部坐标转世界坐标同理)
  5. l293d电机驱动_L293D电机驱动器IC
  6. Java中的常量和变量
  7. Web安全-浅析CSV注入漏洞的原理及利用
  8. php x4co 16进制,北语18春《PHP》作业1234参考
  9. 使用 Unity 3D 开发游戏的架构设计难点
  10. OceanBase 再破纪录!核心成员陈萌萌:坚持 HTAP 就是坚持我们做数据库的初心