【问题标题】:Designing a Hamburger menu in WPF with Mahapps.Metro使用 Mahapps.Metro 在 WPF 中设计汉堡菜单
【发布时间】:2018-01-01 13:30:41
【问题描述】:

目前,我正在使用 GridButtons 作为导航键。这很可怕,但可以完成工作。

这是 XAML 块:

<Button x:Name="ShowMainMenu" Grid.Column="0" Margin="5" Content="Main Menu"/>
<Button x:Name="ShowReportsMenu" Grid.Column="2" Margin="5" Content="Reports"/>
<Button x:Name="Reset" Grid.Column="4" Margin="5" Content="Reset"/>
<Button x:Name="TryClose" Grid.Column="6" Margin="5" Content="Close"/>

顺便说一句,我使用的是 Caliburn.micro,因此命名按钮足以将它们绑定到正确的命令。

现在,我希望他们将它们放入汉堡菜单中。

到目前为止我尝试过的是这样的:

<Controls:HamburgerMenu >
    <Controls:HamburgerMenu.ItemTemplate>
            <DataTemplate DataType="{x:Type Controls:HamburgerMenuGlyphItem}">
                <Grid Height="48">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="48" />
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Margin="12" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Glyph}" />
                    <TextBlock Grid.Column="1" VerticalAlignment="Center" FontSize="16" Text="{Binding Label}" />                            
                </Grid>
            </DataTemplate>                
    </Controls:HamburgerMenu.ItemTemplate>
    <Controls:HamburgerMenu.ItemsSource>
        <Controls:HamburgerMenuItemCollection>
            <Controls:HamburgerMenuGlyphItem Glyph="1" Label="Main Menu" cal:Message.Attach="[Event Click] = [Action ShowMainMenu]"/>
            </Controls:HamburgerMenuItemCollection>
    </Controls:HamburgerMenu.ItemsSource>
</Controls:HamburgerMenu>

但这不起作用,因为Controls:HamburgerMenuGlyphItem 不是FrameworkElement

顺便说一下,过渡视图是这样实现的:

那么,如何将我的一堆 Buttons 翻译成 HamburgerMenu?我也找不到 Caliburn.micro 的 HamburgerMenu 的正确文档。

【问题讨论】:

    标签: wpf xaml caliburn.micro mahapps.metro hamburger-menu


    【解决方案1】:

    好吧,我自己想通了。

    代码如下:

    <DockPanel>        
        <DockPanel.Resources>            
            <DataTemplate x:Key="MenuItemTemplate">
                <Grid Height="48" Background="Black">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="MouseLeftButtonUp">
                            <cal:ActionMessage MethodName="{Binding Tag}"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="48"/>
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Segoe MDL2 Assets" Foreground="BlanchedAlmond" Text="{Binding Glyph}"/>
                    <TextBlock Grid.Column="1" VerticalAlignment="Center" FontSize="16" Foreground="White" Text="{Binding Label}"/>
                </Grid>
            </DataTemplate>
        </DockPanel.Resources>
    
        <Controls:HamburgerMenu Foreground="White" PaneBackground="#FF444444" IsPaneOpen="False" DisplayMode="CompactOverlay" OptionsItemTemplate="{StaticResource MenuItemTemplate}" ItemTemplate="{StaticResource MenuItemTemplate}">
            <Controls:HamburgerMenu.ItemsSource>
                <Controls:HamburgerMenuItemCollection>
                    <Controls:HamburgerMenuGlyphItem Glyph="M" Label="Main Menu" Tag="ShowMainMenu"/>
                    <Controls:HamburgerMenuGlyphItem Glyph="I" Label="Invoice" Tag="OpenInvoiceMaker"/>
                    <Controls:HamburgerMenuGlyphItem Glyph="R" Label="Reports" Tag="ShowReportsMenu"/>
                </Controls:HamburgerMenuItemCollection>
            </Controls:HamburgerMenu.ItemsSource>
            <Controls:HamburgerMenu.OptionsItemsSource>
                <Controls:HamburgerMenuItemCollection>
                    <Controls:HamburgerMenuGlyphItem Glyph="A" Label="About" Tag="About"/>
                </Controls:HamburgerMenuItemCollection>
            </Controls:HamburgerMenu.OptionsItemsSource>
            <Controls:HamburgerMenu.Content>
                <DockPanel>
                    <Border Background="#FF444444" DockPanel.Dock="Top">
                        <TextBlock x:Name="Header" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="15" Foreground="White" Text="{Binding ActiveItem.DisplayName}" />
                    </Border>
                    <ScrollViewer Grid.Row="1" CanContentScroll="True" IsDeferredScrollingEnabled="False">
                        <Controls:TransitioningContentControl Transition="LeftReplace" x:Name="ActiveItem" Content="{Binding ActiveItem}"/>
                    </ScrollViewer>
                </DockPanel>
            </Controls:HamburgerMenu.Content>
        </Controls:HamburgerMenu>
    </DockPanel>
    

    基本上,我使用EventTrigger 来实现与按钮相同的功能。剩下的很简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-03
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多