WPF Mahapps - 如何隐藏汉堡菜单集合中的选项卡?

WPF Mahapps - How to hide a tab within Hamburger Menu collection?

注意:我正在使用 MVVM Light ToolkitMahApps.Metro

所以我的应用程序中有一个 HamburgerMenu 控件,它在 HamburgerMenuItemCollection 中包含一个 HamburgerMenuImageItems。 我想做的是根据登录的用户隐藏一个项目并显示另一个项目。我拥有所有信息,我知道用户是谁以及 he/she 是否允许查看该选项卡,但我不知道如何隐藏标签。

<controls:HamburgerMenu>
    <controls:HamburgerMenu.ItemsSource>
        <controls:HamburgerMenuItemCollection>
                <controls:HamburgerMenuImageItem Label="Global">
                    <controls:HamburgerMenuImageItem.Thumbnail>
                        <BitmapImage UriSource="../../Resources/Icons/test.png" />
                    </controls:HamburgerMenuImageItem.Thumbnail>
                    <controls:HamburgerMenuImageItem.Tag>
                        <views:GlobalView />
                    </controls:HamburgerMenuImageItem.Tag>
                </controls:HamburgerMenuImageItem>

                <controls:HamburgerMenuImageItem Label="Local">
                    <controls:HamburgerMenuImageItem.Thumbnail>
                        <BitmapImage UriSource="../../Resources/Icons/test.png" />
                    </controls:HamburgerMenuImageItem.Thumbnail>
                    <controls:HamburgerMenuImageItem.Tag>
                        <views:LocalView />
                    </controls:HamburgerMenuImageItem.Tag>
                </controls:HamburgerMenuImageItem>
        </controls:HamburgerMenuItemCollection>
    </controls:HamburgerMenu.ItemsSource>
</controls:HamburgerMenu>

里面有更多我认为不相关的代码(用于显示内容的数据模板)。

我不确定这是否可能,但假设如果 User 登录不允许看到本地选项卡,则本地选项卡将被隐藏。

您可以在 XAML 标记中给 HamburgerMenuImageItem 一个 x:Name,然后在您视图的代码隐藏中以编程方式将其删除:

<controls:HamburgerMenu x:Name="menu">
    <controls:HamburgerMenu.ItemsSource>
        <controls:HamburgerMenuItemCollection>
            ...
            <controls:HamburgerMenuImageItem Label="Local" x:Name="local">
                ...
            </controls:HamburgerMenuImageItem>
        </controls:HamburgerMenuItemCollection>
    </controls:HamburgerMenu.ItemsSource>
</controls:HamburgerMenu>

public partial class MainWindow : MetroWindow
{
    public MainWindow()
    {
        InitializeComponent();

        if(/* user is logged in...*/)
        {
            HamburgerMenuItemCollection itemCollection = menu.ItemsSource as HamburgerMenuItemCollection;
            itemCollection.Remove(local);
        }
    }
}

我想我找到了解决办法。我已将 Loaded EventHandler 附加到 HamburgerMenu:

<controls:HamburgerMenu [...] Loaded="HamburgerMenuLoaded" />

在后面的代码中:

private void HamburgerMenuLoaded(object sender, RoutedEventArgs e)
{
    if (sender is HamburgerMenu hamburgerMenu)
    {
        if (hamburgerMenu.Template.FindName("ButtonsListView", hamburgerMenu) is ListBox listBox)
        {
            var style = new Style(typeof(ListBoxItem))
                        {
                            BasedOn = listBox.ItemContainerStyle
                        };

            style.Triggers.Add(new DataTrigger
                               {
                                   Binding = new Binding(nameof(ITabViewModel.ShowTab)),
                                   Value = false,
                                   Setters =
                                   {
                                       new Setter(VisibilityProperty, Visibility.Collapsed)
                                   }
                               });

            listBox.ItemContainerStyle = style;
        }
    }
}

我的 ViewModel 中的 属性 是一个名为 ShowTab 的布尔值,我将其用于绑定。