如何在单个页面中实现Template 10 HamburgerMenu

时间:2017-08-23 06:27:01

标签: uwp template10 hamburger-menu

我正在尝试在UWP应用程序的单个页面中使用模板10 HamburgerMenu控件(与PageHeader控件一起使用),而不是更典型的应用程序范围的汉堡包菜单托管在shell页面中。

文档没有具体解释如何做到这一点,只是声明“HamburgerMenu是一个XAML控件,因此可以放在应用程序的任何页面中”。

假设此控件与SplitView的工作方式类似,并使用Template10 HamburgerMenu演示代码作为起点,我将以下最小实现添加到页面中:

<controls:HamburgerMenu x:Name="Menu">
    <controls:HamburgerMenu.PrimaryButtons>
        <controls:HamburgerButtonInfo ButtonType="Command">
            <StackPanel Orientation="Horizontal">
                <SymbolIcon Width="48" Height="48" Symbol="Home" />
                <TextBlock Margin="12,0,0,0" VerticalAlignment="Center" Text="Home" />
            </StackPanel>
        </controls:HamburgerButtonInfo>
    </controls:HamburgerMenu.PrimaryButtons>

    <controls:HamburgerMenu.Content>
        <TextBlock>Sample Text</TextBlock>
    </controls:HamburgerMenu.Content>
</controls:HamburgerMenu>

这会呈现内容TextBlock,但不会显示包含的菜单。我已经尝试了所有明显的HamburgerMenu属性,包括HamburgerButtonVisibilityDisplayModeIsOpenIsFullScreen,但没有任何内容使菜单可见。

有人可以指点我在一个页面上同时包含HamburgerMenuPageHeader控件的示例吗?

1 个答案:

答案 0 :(得分:1)

从评论中可以理解,您对汉堡包模板基于shell的方法没有任何问题。你想做的就是,

  

仅在一个页面显示汉堡菜单,而在其他页面上只显示汉堡菜单,以避免用户直接导航。

所以来到解决方案,Hamburger Control中的Template10附带了一个属性IsFullScreen。将其设置为true,如:

Shell.Instance.HamburgerMenu.IsFullScreen="true";

这会隐藏你的汉堡包菜单。

有两种方法可以解决这个问题。我将首先提出可以完成的解决方案,但我不会推荐它。

  1. 您可以从任何页面访问Shell.xaml.cs(这是美丽的),因为它有一个静态的单例实例。您可以在要显示菜单的IsFullScreen="false"的{​​{1}}和OnNavigatedTo覆盖方法中更改OnNavigatingFrom属性,并在shell中将其保留为默认值true。或者vis-ver default设置为true,您可以在导航并导航到页面时将其设置为false。
  2. 第二种方式(推荐)是访问Page应用使用的settingsService(另一项惊人功能)。 Template10负责settingsServiceAppThemeHamburgerMenu IsFullScreen state以及using the shell back button or the page header oneCache duration按钮。
  3. 原因:我之所以使用设置服务的单例实例而不是Shell的实例,是因为我希望我的所有应用设置都转到中间人身上执行操作。所以明天,如果我计划根据值更改某些功能,我将只需编辑settingsService,而不是搜索整个应用程序,以便我在何处更新此属性。

    你是怎么做到的?

    要遵循第二种方法并将默认值保持为假,我首先要开始:

    1. 文件 - &gt;新项目 - &gt;汉堡包模板。
    2. 清理并构建项目(只是为了恢复所有包)。
    3. (如果您希望默认为隐藏的汉堡包,则可选)转到Hiding the HamburgerMenu并将属性Shell.xaml添加到代码行IsFullScreen="True"
    4. 现在我将转到我想要显示汉堡菜单的页面(假设它是<Controls:HamburgerMenu x:Name="MyHamburgerMenu">),所以我转到detailsPage并在代码隐藏中覆盖了detailsPageOnNavigatingFrom方法如下:

      OnNavigateTo
    5. 这可以胜任。请注意:我正在使用第二种方法。您也可以选择第一种方法。

    6.   

      请注意:protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { Services.SettingsServices.SettingsService.Instance.IsFullScreen = true; base.OnNavigatingFrom(e); } protected override void OnNavigatedTo(NavigationEventArgs e) { Services.SettingsServices.SettingsService.Instance.IsFullScreen = false; base.OnNavigatedTo(e); } 会隐藏IsFullScreen="true"HamburgerMenu会显示HamburgerMenu。

      The control's documentation