Browse Source

fix #538: WPF Commands do not work properly in Windows Forms ContextMenus

pull/522/merge
Siegfried Pammer 12 years ago
parent
commit
048134be8f
  1. 3
      src/Main/ICSharpCode.Core.WinForms/Menu/MenuCommand.cs
  2. 1
      src/Main/ICSharpCode.Core.WinForms/Menu/MenuService.cs
  3. 16
      src/Main/SharpDevelop/Workbench/WpfWorkbench.cs

3
src/Main/ICSharpCode.Core.WinForms/Menu/MenuCommand.cs

@ -100,7 +100,8 @@ namespace ICSharpCode.Core.WinForms @@ -100,7 +100,8 @@ namespace ICSharpCode.Core.WinForms
} catch (ResourceNotFoundException) {}
}
Visible = GetVisible();
Enabled = command != null && command.CanExecute(caller);
command = CommandWrapper.Unwrap(command);
Enabled = command != null && MenuService.CanExecuteCommand(command, caller);
}
}

1
src/Main/ICSharpCode.Core.WinForms/Menu/MenuService.cs

@ -28,6 +28,7 @@ namespace ICSharpCode.Core.WinForms @@ -28,6 +28,7 @@ namespace ICSharpCode.Core.WinForms
public static class MenuService
{
public static Action<System.Windows.Input.ICommand, object> ExecuteCommand;
public static Func<System.Windows.Input.ICommand, object, bool> CanExecuteCommand;
public static void AddItemsToMenu(ToolStripItemCollection collection, object owner, string addInTreePath)
{

16
src/Main/SharpDevelop/Workbench/WpfWorkbench.cs

@ -137,6 +137,7 @@ namespace ICSharpCode.SharpDevelop.Workbench @@ -137,6 +137,7 @@ namespace ICSharpCode.SharpDevelop.Workbench
dockPanel.Children.Insert(dockPanel.Children.Count - 2, statusBar);
Core.WinForms.MenuService.ExecuteCommand = ExecuteCommand;
Core.WinForms.MenuService.CanExecuteCommand = CanExecuteCommand;
UpdateMenu();
AddHandler(Hyperlink.RequestNavigateEvent, new RequestNavigateEventHandler(OnRequestNavigate));
@ -160,9 +161,9 @@ namespace ICSharpCode.SharpDevelop.Workbench @@ -160,9 +161,9 @@ namespace ICSharpCode.SharpDevelop.Workbench
{
ServiceSingleton.GetRequiredService<IAnalyticsMonitor>()
.TrackFeature(command.GetType().FullName, "Menu");
var routedCommand = command as System.Windows.Input.RoutedCommand;
var routedCommand = command as RoutedCommand;
if (routedCommand != null) {
var target = System.Windows.Input.FocusManager.GetFocusedElement(this);
var target = FocusManager.GetFocusedElement(this);
if (routedCommand.CanExecute(caller, target))
routedCommand.Execute(caller, target);
} else {
@ -171,6 +172,17 @@ namespace ICSharpCode.SharpDevelop.Workbench @@ -171,6 +172,17 @@ namespace ICSharpCode.SharpDevelop.Workbench
}
}
bool CanExecuteCommand(ICommand command, object caller)
{
var routedCommand = command as RoutedCommand;
if (routedCommand != null) {
var target = FocusManager.GetFocusedElement(this);
return routedCommand.CanExecute(caller, target);
} else {
return command.CanExecute(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;

Loading…
Cancel
Save