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;