---恢复内容开始---

现在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汉堡菜单的实现的更多相关文章

  1. 10分钟制作UWP汉堡菜单

    什么是汉堡菜单? 汉堡菜单,指的是一个可以弹出和收回的侧边栏.在UWP和Android应用中,汉堡菜单都非常常见. 首先我们列出所有需要掌握的前置知识: 1,SplitView 2,StackPane ...

  2. (UWP开发)在ListView中通过向右滑动展开汉堡菜单

    首先在移动APP开发中,手势滑动已经成为一个必备的技能,无论大大小小的APP都需要拥有手势滑动功能.在Android和iOS操作系统的APP中,手势滑动比较普及.然而由于国内有关UWP应用的教程比较少 ...

  3. Win10 UWP 开发系列:使用SplitView实现汉堡菜单及页面内导航

    在Win10之前,WP平台的App主要有枢轴和全景两种导航模式,我个人更喜欢Pivot即枢轴模式,可以左右切换,非常方便.全景视图因为对设计要求比较高,自己总是做不出好的效果.对于一般的新闻阅读类Ap ...

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

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

  5. 张高兴的 UWP 开发笔记:汉堡菜单进阶

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

  6. 使用MvvmCross框架实现Xamarin.Forms的汉堡菜单布局

    注:本文是英文写的,偷懒自动翻译过来了,原文地址:Implementing MasterDetail layout in Xamarin.Forms by MvvmCross 欢迎大家关注我的公众号: ...

  7. WPF实现Win10汉堡菜单

    WPF开发者QQ群: 340500857  | 微信群 -> 进入公众号主页 加入组织 前言 有小伙伴提出需要实现Win10汉堡菜单效果. 由于在WPF中没有现成的类似UWP的汉堡菜单,所以我们 ...

  8. 【Win10开发】关于汉堡菜单-SplitView的用法

    SplitView(汉堡菜单)是win10新加的一种控件,顾名思义,其实就是将视图分割成两部分,废话不多说,下面来介绍一下SplitView的基本用法. 首先介绍几个SplitView经常用到的属性. ...

  9. UWP 圆形菜单

    用过Surface dial的童鞋们都很熟悉,当使用Dial的时候,那个圆形菜单很漂亮,那么我们在普通的uwp中是否也可以实现吗? 答案是肯定的. 其实这是来源于GayHub的一个开源项目,做的很不错 ...

随机推荐

  1. NOIP 模拟 玩积木 - 迭代加深搜索 / bfs+hash+玄学剪枝

    题目大意: 有一堆积木,0号节点每次可以和其上方,下方,左上,右下的其中一个交换,问至少需要多少次达到目标状态,若步数超过20,输出too difficult 目标状态: 0 1 1 2 2 2 3 ...

  2. hbase 2.0.2 增删改查

    package cn.hbase.demo; import java.io.IOException; import java.util.Iterator; import org.apache.hado ...

  3. solr 7.x 查询及高亮

    查询时的api分为两种一种是万能的set,还有一种是setxxxquery @Test public void search2() throws Exception{ HttpSolrClient s ...

  4. Oracle停止一个JOB

    Oracle如何停止一个JOB 相关表.视图 dba_jobs all_jobs user_jobs 包含登录用户所有的JOB信息 dba_jobs_running 包含正在运行job相关信息 注意 ...

  5. 关于easyui-accordion的添加以及显示隐藏菜单的使用

    <script type="text/javascript"> $(function() { leftMenus(); }); function leftMenus() ...

  6. oc面试攻略

    原文出自:http://mobile.51cto.com/iphone-402619.htm 1.Object-C有多继承吗?没有的话用什么代替?cocoa 中所有的类都是NSObject 的子类 多 ...

  7. 深度学习实践指南(六)—— ReLU(前向和后向过程)

    def relu_forward(x): out = x * (x > 0) # * 对于 np.ndarray 而言表示 handmard 积,x > 0 得到的 0和1 构成的矩阵 r ...

  8. background意识(两)

    今天看到了有关学习的价值的文章background于 [0积分下载我的小Demo]

  9. Qt5.9 官方发布的新版本亮点的确不胜枚举(而且修复2000+ bugs)

    作者:Summer Fang链接:https://www.zhihu.com/question/60486611/answer/177584284来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...

  10. 用java写的后台方法可以提供给C#调用吗?(转)

    最近和公司搞C#的同事联合搞了一个项目,我把我这边的数据加密之后传给C#,然后C#在对接收到的数据解密.可是问题来了,我这边用JAVA加密的数据C#的同事怎么也解密不出来,于是我就想到了可不可以将JA ...