bool ShowContextMenu(ContextMenuEntryContext context, out ContextMenu menu) { menu = new ContextMenu(); foreach (var category in MefState.Instance.entries.OrderBy(c => c.Metadata.Order).GroupBy(c => c.Metadata.Category)) { bool needSeparatorForCategory = menu.Items.Count > 0; foreach (var entryPair in category) { IContextMenuEntry entry = entryPair.Value; if (entry.IsVisible(context)) { if (needSeparatorForCategory) { menu.Items.Add(new Separator()); needSeparatorForCategory = false; } MenuItem menuItem = new MenuItem(); menuItem.Header = entryPair.Metadata.Header; bool isEnabled; if (entryPair.Value.IsEnabled(context)) { menuItem.Click += (s, e) => { // Clear this before executing the command since MainWindow might // fail to give focus to new elements if it still thinks the menu // is opened. isMenuOpened = false; entry.Execute(context); }; isEnabled = true; } else { menuItem.IsEnabled = false; isEnabled = false; } if (!string.IsNullOrEmpty(entryPair.Metadata.Icon)) { MainWindow.CreateMenuItemImage(menuItem, entry, entryPair.Metadata.Icon, BackgroundType.ContextMenuItem, isEnabled); } menuItem.InputGestureText = entryPair.Metadata.InputGestureText ?? string.Empty; var entry2 = entry as IContextMenuEntry2; if (entry2 != null) { entry2.Initialize(context, menuItem); } menu.Items.Add(menuItem); } } } menu.Opened += (s, e) => isMenuOpened = true; menu.Closed += (s, e) => { isMenuOpened = false; ClearReferences(); }; return(menu.Items.Count > 0); }
bool ShowContextMenu(TextViewContext context, out ContextMenu menu) { menu = new ContextMenu(); foreach (var category in MefState.Instance.entries.OrderBy(c => c.Metadata.Order).GroupBy(c => c.Metadata.Category)) { bool needSeparatorForCategory = menu.Items.Count > 0; foreach (var entryPair in category) { IContextMenuEntry entry = entryPair.Value; if (entry.IsVisible(context)) { if (needSeparatorForCategory) { menu.Items.Add(new Separator()); needSeparatorForCategory = false; } MenuItem menuItem = new MenuItem(); menuItem.Header = entryPair.Metadata.Header; bool isEnabled; if (entryPair.Value.IsEnabled(context)) { menuItem.Click += delegate { entry.Execute(context); }; isEnabled = true; } else { menuItem.IsEnabled = false; isEnabled = false; } if (!string.IsNullOrEmpty(entryPair.Metadata.Icon)) { MainWindow.CreateMenuItemImage(menuItem, entry, entryPair.Metadata.Icon, BackgroundType.ContextMenuItem, isEnabled); } menuItem.InputGestureText = entryPair.Metadata.InputGestureText ?? string.Empty; var entry2 = entry as IContextMenuEntry2; if (entry2 != null) { entry2.Initialize(context, menuItem); } menu.Items.Add(menuItem); } } } menu.Opened += (s, e) => Interlocked.Increment(ref menuCount); menu.Closed += (s, e) => { Interlocked.Decrement(ref menuCount); ClearReferences(); }; return(menu.Items.Count > 0); }