WPF Mahapps - 如何隐藏汉堡菜单集合中的选项卡?
WPF Mahapps - How to hide a tab within Hamburger Menu collection?
注意:我正在使用 MVVM Light Toolkit 和 MahApps.Metro
所以我的应用程序中有一个 HamburgerMenu
控件,它在 HamburgerMenuItemCollection
中包含一个 HamburgerMenuImageItem
s。
我想做的是根据登录的用户隐藏一个项目并显示另一个项目。我拥有所有信息,我知道用户是谁以及 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
的布尔值,我将其用于绑定。
注意:我正在使用 MVVM Light Toolkit 和 MahApps.Metro
所以我的应用程序中有一个 HamburgerMenu
控件,它在 HamburgerMenuItemCollection
中包含一个 HamburgerMenuImageItem
s。
我想做的是根据登录的用户隐藏一个项目并显示另一个项目。我拥有所有信息,我知道用户是谁以及 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
的布尔值,我将其用于绑定。