हाय मैं TreeView पर समान बात कर रहा हूँ और मुझे लगता है कि ItemToContextMenuConverter तरह प्रत्येक आइटम भले ही यह नहीं किया जाता है पर निष्पादित किया जाता है नहीं है। यह एक छोटी परियोजना में शायद ठीक है, लेकिन यदि आप प्रत्येक मेनूइटम के लिए सक्षम/अक्षम कोड जोड़ते हैं तो यह धीमा हो सकता है।
यह शायद सबसे अच्छा नहीं है (मैंने अभी WPF के साथ शुरू किया है), लेकिन मैं इसे आपके साथ साझा करूंगा।
मेनू संसाधन:
<Window.Resources>
<ContextMenu x:Key="MnuFolderFavorites" StaysOpen="True">
<MenuItem Header="Remove from Favorites" Click="MnuFolder_RemoveFromFavorites_Click"></MenuItem>
</ContextMenu>
<ContextMenu x:Key="MnuFolder" StaysOpen="True">
<MenuItem Header="New Folder"></MenuItem>
<MenuItem Header="Rename" x:Name="MnuFolderRename" Click="MnuFolder_Rename_Click"></MenuItem>
<MenuItem Header="Add to Favorites" Click="MnuFolder_AddToFavorites_Click"></MenuItem>
</ContextMenu>
</Window.Resources>
TreeView:
<TreeView x:Name="TvFolders">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type data:Folder}" ItemsSource="{Binding Items}">
<StackPanel Orientation="Horizontal" PreviewMouseRightButtonDown="TvFoldersStackPanel_PreviewMouseRightButtonDown">
<Image Width="20" Height="20" Source="{Binding ImagePath}" />
<TextBlock Text="{Binding Title}" Margin="5,0,0,0" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
कोड:
private void TvFoldersStackPanel_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) {
((StackPanel) sender).ContextMenu = null;
Data.Folder item = (Data.Folder) ((StackPanel) sender).DataContext;
if (!item.Accessible) return;
if (item.Parent != null && item.Parent.Title.Equals("Favorites")) {
((StackPanel) sender).ContextMenu = MainWindow.Resources["MnuFolderFavorites"] as ContextMenu;
} else {
((StackPanel) sender).ContextMenu = MainWindow.Resources["MnuFolder"] as ContextMenu;
foreach (MenuItem menuItem in ((StackPanel) sender).ContextMenu.Items) {
switch (menuItem.Name) {
case "MnuFolderRename": {
menuItem.IsEnabled = item.Parent != null;
break;
}
}
}
}
}
private void MnuFolder_RemoveFromFavorites_Click(object sender, RoutedEventArgs e) {
string path = ((Data.Folder)((MenuItem)sender).DataContext).FullPath;
Settings.Default.FolderFavorites.Remove(path);
Settings.Default.Save();
FavoritesFolder?.AddFavorites(true);
}
, पूर्ण उदाहरण के लिए धन्यवाद काफी सही लगता है! – Jared