示例#1
0
 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);
 }
示例#2
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);
 }