WPF Mahapps - 如何在Hamburger Menu集合中隐藏选项卡?

时间:2017-04-24 13:19:24

标签: c# wpf mvvm mahapps.metro hamburger-menu

注意:我使用 MVVM Light Toolkit MahApps.Metro

所以我的应用程序中有一个HamburgerMenu控件,它在HamburgerMenuImageItem中包含HamburgerMenuItemCollection个。 我想要做的是隐藏一个项目并根据用户的登录情况显示另一个项目。我拥有所有信息,我知道用户是谁以及他/她是否可以看到选项卡,但我不知道如何隐藏选项卡。

<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>

其中包含更多代码,我认为它不相关(用于显示内容的DataTemplates)。

我不确定它是否可行,但是请注意,如果登录User且不允许看到本地标签,则会隐藏本地标签。

enter image description here

2 个答案:

答案 0 :(得分:3)

您可以在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);
        }
    }
}

答案 1 :(得分:1)

我想我找到了解决方案。我已经将一个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的bool,我将其用于绑定。