From 535b4df471f9352911ea0211d557dc4355c3e298 Mon Sep 17 00:00:00 2001 From: jkuehner Date: Wed, 26 Nov 2014 22:28:53 +0100 Subject: [PATCH] Fixes ContextMenus when Designer is used inside of SD! --- .../WpfDesign.AddIn/Src/WpfViewContent.cs | 16 +++++++++- .../WpfDesign.Designer/Project/DesignPanel.cs | 29 +++++++++++++------ 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs index 1b2f56266f..7a9765cf85 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs @@ -26,6 +26,7 @@ using System.Reflection; using System.Threading; using System.Threading.Tasks; using System.Windows; +using System.Windows.Controls; using System.Windows.Input; using System.Windows.Markup; using System.Xml; @@ -127,7 +128,20 @@ namespace ICSharpCode.WpfDesign.AddIn settings.ReportErrors = UpdateTasks; designer.LoadDesigner(r, settings); - designer.ContextMenuOpening += (sender, e) => MenuService.ShowContextMenu(e.OriginalSource as UIElement, designer, "/AddIns/WpfDesign/Designer/ContextMenu"); + designer.DesignPanel.ContextMenuHandler = (contextMenu) => { + var newContextmenu = new ContextMenu(); + var sdContextMenuItems = MenuService.CreateMenuItems(newContextmenu, designer, "/AddIns/WpfDesign/Designer/ContextMenu", "ContextMenu"); + foreach(var entry in sdContextMenuItems) + newContextmenu.Items.Add(entry); + newContextmenu.Items.Add(new Separator()); + + var items = contextMenu.Items.Cast().ToList(); + contextMenu.Items.Clear(); + foreach(var entry in items) + newContextmenu.Items.Add(entry); + + designer.DesignPanel.ContextMenu = newContextmenu; + }; if (outline != null && designer.DesignContext != null && designer.DesignContext.RootItem != null) { outline.Root = OutlineNode.Create(designer.DesignContext.RootItem); diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs index d13f23dcc8..5a02dfb314 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs @@ -32,6 +32,7 @@ using System.Windows.Threading; using ICSharpCode.WpfDesign.Adorners; using ICSharpCode.WpfDesign.Designer.Controls; +using ICSharpCode.WpfDesign.Designer.UIExtensions; using ICSharpCode.WpfDesign.Designer.Xaml; namespace ICSharpCode.WpfDesign.Designer @@ -461,6 +462,8 @@ namespace ICSharpCode.WpfDesign.Designer private Dictionary>> contextMenusAndEntries = new Dictionary>>(); + public Action ContextMenuHandler { get; set; } + public void AddContextMenu(ContextMenu contextMenu) { contextMenusAndEntries.Add(contextMenu, new Tuple>(contextMenusAndEntries.Count, new List(contextMenu.Items.Cast()))); @@ -484,24 +487,32 @@ namespace ICSharpCode.WpfDesign.Designer private void UpdateContextMenu() { - if (contextMenusAndEntries.Count == 0) + if (this.ContextMenu != null) + { + this.ContextMenu.Items.Clear(); this.ContextMenu = null; - - if (this.ContextMenu == null) - this.ContextMenu = new ContextMenu(); + } + + var contextMenu = new ContextMenu(); - this.ContextMenu.Items.Clear(); - foreach (var entries in contextMenusAndEntries.Values.OrderBy(x => x.Item1).Select(x => x.Item2)) { - if (this.ContextMenu.Items.Count > 0) - this.ContextMenu.Items.Add(new Separator()); + if (contextMenu.Items.Count > 0) + contextMenu.Items.Add(new Separator()); foreach (var entry in entries) { - ContextMenu.Items.Add(entry); + var ctl = ((FrameworkElement)entry).TryFindParent(); + if (ctl != null) + ctl.Items.Remove(entry); + contextMenu.Items.Add(entry); } } + + if (ContextMenuHandler != null) + ContextMenuHandler(contextMenu); + else + this.ContextMenu = contextMenu; } #endregion