如何在mahapp的HamburgerMenu中添加MaterialDesignInXaml图标?

How to add MaterialDesignInXaml icon to HamburgerMenu of mahapp?

我正在尝试将 HamburgerMenu 项的图标设置为 MaterialDesignInXamlPackIcon 中可用的图标,我目前所做的是:

 <Grid.Resources>
        <DataTemplate x:Key="MenuItemTemplate" DataType="{x:Type materialDesign:PackIcon}">
            <Grid Height="48">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="48" />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" FontSize="16" HorizontalAlignment="Center" VerticalAlignment="Center"
                           Foreground="White" Text="{Binding Kind}" />
                <TextBlock Grid.Column="1" VerticalAlignment="Center" FontSize="16" 
                           Foreground="White" Text="{Binding Label}" />
            </Grid>
        </DataTemplate>
    </Grid.Resources>

我在 Grid 资源中定义了一个 MenuItemTemplate,使用 DataType materialDesign 的 PackIcon 这样定义的:

xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"

然后,我尝试在项目上应用图标:

 <Controls:HamburgerMenu.ItemsSource>
            <Controls:HamburgerMenuItemCollection>
                <Controls:HamburgerMenuGlyphItem  Glyph="?" Label="General">
                    <Controls:HamburgerMenuGlyphItem.Tag>
                        <Settings:view/>
                    </Controls:HamburgerMenuGlyphItem.Tag>
                </Controls:HamburgerMenuGlyphItem>

我应该得到 Kind 属性 而不是 Glyph,我做错了什么?

您使用了错误的助手 class HamburgerMenuGlyphItem 其中 Glyph 属性 是字符串而不是对象。

如果你想使用任何额外的对象来显示在MenuItem处,那么你可以使用HamburgerMenuIconItem。这有一个 属性 Icon 类型 object.

<DataTemplate x:Key="MenuItemTemplate" DataType="{x:Type controls:HamburgerMenuIconItem}">
    <Grid x:Name="RootGrid"
          Height="48"
          Background="Transparent">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="48" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <!-- This ContentControl binds to the Icon property which contains a PackIconXYZ control -->
        <ContentControl Grid.Column="0"
                        HorizontalAlignment="Center"
                        VerticalAlignment="Center"
                        Content="{Binding Icon}"
                        Focusable="False" />
        <TextBlock Grid.Column="1"
                   VerticalAlignment="Center"
                   FontSize="16"
                   Text="{Binding Label}" />
    </Grid>
</DataTemplate>

你可以看到这个DataTemplate 可以显示任何对象,如 PackIcon。我在此示例中使用了 MahApps.Metro.IconPacks 库,其中还包含此类 MarkupExtensions {iconPacks:Material Kind=Home}.

<controls:HamburgerMenu x:Name="HamburgerMenuControl"
                        DisplayMode="CompactInline"
                        IsPaneOpen="True"
                        ItemTemplate="{StaticResource MenuItemTemplate}"
                        OptionsItemTemplate="{StaticResource MenuItemTemplate}"
                        PaneForeground="White"
                        PaneBackground="#FF444444">

    <!--  Items  -->
    <controls:HamburgerMenu.ItemsSource>
        <controls:HamburgerMenuItemCollection>
            <controls:HamburgerMenuIconItem Icon="{iconPacks:Material Kind=Home}"
                                               Label="Home">
                <controls:HamburgerMenuIconItem.Tag>
                    <views:HomeView />
                </controls:HamburgerMenuIconItem.Tag>
            </controls:HamburgerMenuIconItem>


            <controls:HamburgerMenuIconItem Icon="{iconPacks:Material Kind=AccountCircle}"
                                               Label="Private">
                <controls:HamburgerMenuIconItem.Tag>
                    <views:PrivateView />
                </controls:HamburgerMenuIconItem.Tag>
            </controls:HamburgerMenuIconItem>


            <controls:HamburgerMenuIconItem Icon="{iconPacks:Material Kind=Settings}"
                                               Label="Settings">
                <controls:HamburgerMenuIconItem.Tag>
                    <views:SettingsView />
                </controls:HamburgerMenuIconItem.Tag>
            </controls:HamburgerMenuIconItem>
        </controls:HamburgerMenuItemCollection>
    </controls:HamburgerMenu.ItemsSource>


    <!--  Options  -->
    <controls:HamburgerMenu.OptionsItemsSource>
        <controls:HamburgerMenuItemCollection>
            <controls:HamburgerMenuIconItem Icon="{iconPacks:Material Kind=Help}" Label="About">
                <controls:HamburgerMenuIconItem.Tag>
                    <views:AboutView />
                </controls:HamburgerMenuIconItem.Tag>
            </controls:HamburgerMenuIconItem>
        </controls:HamburgerMenuItemCollection>
    </controls:HamburgerMenu.OptionsItemsSource>

    <!--  Content template  -->
    <controls:HamburgerMenu.ContentTemplate>
        <DataTemplate DataType="{x:Type controls:HamburgerMenuItem}">
            <Grid x:Name="TheContentGrid">
                <Grid.RowDefinitions>
                    <RowDefinition Height="48" />
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Border Grid.Row="0" Background="#FF444444">
                    <TextBlock x:Name="Header"
                               HorizontalAlignment="Center"
                               VerticalAlignment="Center"
                               FontSize="24"
                               Foreground="White"
                               Text="{Binding Label}" />
                </Border>
                <ContentControl x:Name="TheContent"
                                Grid.Row="1"
                                Content="{Binding Tag}"
                                Focusable="False"
                                Foreground="{DynamicResource BlackBrush}" />
            </Grid>
        </DataTemplate>
    </controls:HamburgerMenu.ContentTemplate>

</controls:HamburgerMenu>

此示例也可以在 GitHub 上找到。

希望对您有所帮助!