2017-04-24 33 views
2

注:我使用MVVM光工具包MahApps.MetroWPF Mahapps - 如何隱藏漢堡菜單集合中的選項卡?

所以,我有我的應用程序中的HamburgerMenu控制,它包含內HamburgerMenuItemCollection一個HamburgerMenuImageItem秒。 我想要做的是隱藏一個項目,並根據用戶的登錄情況顯示另一個項目。我擁有所有信息,我知道用戶是誰,以及他/她是否被允許查看該選項卡,但我擁有不知道如何隱藏標籤。

<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

回答

1

你可以給你的XAML標記的HamburgerMenuImageItemx: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); 
     } 
    } 
} 
+0

像往常一樣,mm8來營救。 :) 另外,你認爲有一種方法可以在MVVM時尚中做到這一點?畢竟,我已經完成的所有事情(包括95%的事情)都是在ViewModel中完成的。 – Desomph

+0

好吧,既然你在視圖中創建了HamburgerMenuImageItem,你也可以從視圖中刪除它。否則,MVVM方式將綁定到您在視圖模型中定義的(數據)項目集合,然後爲視圖中的每種數據類型定義模板。 – mm8

+0

我明白了:) 我會在稍後嘗試使用MVVM。再次感謝! – Desomph

1

我想我找到了解決方案。我已經附上加載事件處理程序的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布爾,我使用了結合這。