diff --git a/src/Main/ICSharpCode.Core.WinForms/ICSharpCode.Core.WinForms.csproj b/src/Main/ICSharpCode.Core.WinForms/ICSharpCode.Core.WinForms.csproj index d7ffcfcbe6..d6aabfe10f 100644 --- a/src/Main/ICSharpCode.Core.WinForms/ICSharpCode.Core.WinForms.csproj +++ b/src/Main/ICSharpCode.Core.WinForms/ICSharpCode.Core.WinForms.csproj @@ -44,10 +44,19 @@ + + 3.0 + + + 3.0 + + + 3.0 + diff --git a/src/Main/ICSharpCode.Core.WinForms/Menu/MenuCommand.cs b/src/Main/ICSharpCode.Core.WinForms/Menu/MenuCommand.cs index c323dbbb38..77752791fa 100644 --- a/src/Main/ICSharpCode.Core.WinForms/Menu/MenuCommand.cs +++ b/src/Main/ICSharpCode.Core.WinForms/Menu/MenuCommand.cs @@ -66,9 +66,9 @@ namespace ICSharpCode.Core.WinForms protected override void OnClick(System.EventArgs e) { base.OnClick(e); - if (command != null && command.CanExecute(caller)) { - ServiceSingleton.GetRequiredService().TrackFeature(command.GetType().FullName, "Menu"); - command.Execute(caller); + command = CommandWrapper.Unwrap(command); + if (command != null) { + MenuService.ExecuteCommand(command, caller); } } diff --git a/src/Main/ICSharpCode.Core.WinForms/Menu/MenuService.cs b/src/Main/ICSharpCode.Core.WinForms/Menu/MenuService.cs index 09e442d6ed..f09238da03 100644 --- a/src/Main/ICSharpCode.Core.WinForms/Menu/MenuService.cs +++ b/src/Main/ICSharpCode.Core.WinForms/Menu/MenuService.cs @@ -12,6 +12,8 @@ namespace ICSharpCode.Core.WinForms { public static class MenuService { + public static Action ExecuteCommand; + public static void AddItemsToMenu(ToolStripItemCollection collection, object owner, string addInTreePath) { AddItemsToMenu(collection, AddInTree.BuildItems(addInTreePath, owner, false)); diff --git a/src/Main/SharpDevelop/Workbench/WpfWorkbench.cs b/src/Main/SharpDevelop/Workbench/WpfWorkbench.cs index 12ffdcefa3..7b04b7b828 100644 --- a/src/Main/SharpDevelop/Workbench/WpfWorkbench.cs +++ b/src/Main/SharpDevelop/Workbench/WpfWorkbench.cs @@ -121,6 +121,7 @@ namespace ICSharpCode.SharpDevelop.Workbench DockPanel.SetDock(statusBar, Dock.Bottom); dockPanel.Children.Insert(dockPanel.Children.Count - 2, statusBar); + Core.WinForms.MenuService.ExecuteCommand = ExecuteCommand; UpdateMenu(); AddHandler(Hyperlink.RequestNavigateEvent, new RequestNavigateEventHandler(OnRequestNavigate)); @@ -140,6 +141,21 @@ namespace ICSharpCode.SharpDevelop.Workbench SD.StatusBar.SetMessage("${res:MainWindow.StatusBar.ReadyMessage}"); } + void ExecuteCommand(ICommand command, object caller) + { + ServiceSingleton.GetRequiredService() + .TrackFeature(command.GetType().FullName, "Menu"); + var routedCommand = command as System.Windows.Input.RoutedCommand; + if (routedCommand != null) { + var target = System.Windows.Input.FocusManager.GetFocusedElement(this); + if (routedCommand.CanExecute(caller, target)) + routedCommand.Execute(caller, target); + } else { + if (command.CanExecute(caller)) + command.Execute(caller); + } + } + // keep a reference to the event handler to prevent it from being garbage collected // (CommandManager.RequerySuggested only keeps weak references to the event handlers) EventHandler requerySuggestedEventHandler;