/// <summary> /// Checks if seperators should be added for this host /// </summary> /// <returns></returns> private bool ShouldAddSeperators() { switch (MergeMenus.GetAddSeparator(this.HostElement)) { case AddSeparatorBehaviour.Add: return(true); case AddSeparatorBehaviour.DontAdd: return(false); default: // default is add, except for ToolBarTrays and MainMenus return((!(this.HostElement is ToolBarTray)) && (!(this.HostElement is Menu) || !(this.HostElement as Menu).IsMainMenu)); } }
/// <summary> /// Initialized event handler for hosts /// </summary> /// <param name="sender">Host</param> /// <param name="e">Event args</param> /// <remarks> /// Adds any known merge items to the host if not already happend. /// </remarks> private void HostElementInitialized(object sender, EventArgs e) { if (this.HostElement == null) { return; } var id = MergeMenus.GetId(sender as DependencyObject); foreach (var item in MergeMenus.UnmergedItems.ToList()) { if (String.CompareOrdinal(id, MergeMenus.GetHostId(item)) != 0) { continue; } if (this.MergeItem(item)) { MergeMenus.UnmergedItems.Remove(item); } } }
/// <summary> /// Merges the item into this host /// </summary> /// <param name="item">Item</param> internal bool MergeItem(DependencyObject item) { bool itemAdded = false; // get the priority of the item (if non is attached use highest priority) int priority = MergeMenus.GetPriorityDef(item, Int32.MaxValue); if (this.HostElement != null) { if (this.HostElement is ToolBarTray) { // Todo: special traetment for ToolBarTray hosts becuse a ToolBarTray is no ItemsControl. /*if (item is ToolBar && !(HostElement as ToolBarTray).ToolBars.Contains(item)) * { * (HostElement as ToolBarTray).ToolBars.Add(item as ToolBar); * }*/ itemAdded = true; } else { var items = ((ItemsControl)this.HostElement).Items; // if item is not already in host add it by priority // if (!items.Contains(item)) if (!CheckItem(items, item)) { // iterate from behind... for (int n = items.Count - 1; n >= 0; --n) { var d = items[n] as DependencyObject; if (d != null) { // ... and add it after 1st existing item with lower or equal priority if (MergeMenus.GetPriority(d) <= priority) { ++n; itemAdded = true; items.Insert(n, item); // add separators where necessary, but not on a main menu if (this.ShouldAddSeperators()) { // if before us is a non separator and it's priority is different to ours, then insert a separator if (n > 0 && !(items[n - 1] is Separator)) { int prioBefore = MergeMenus.GetPriority(items[n - 1] as DependencyObject); if (priority != prioBefore) { var separator = new Separator(); MergeMenus.SetPriority(separator, priority); items.Insert(n, separator); this.autoCreatedSeparators.Add(separator); ++n; } } // if after us is a non seperator then add a separator after us if (n < items.Count - 1 && !(items[n + 1] is Separator)) { int prioAfter = MergeMenus.GetPriority(items[n + 1] as DependencyObject); var separator = new Separator(); MergeMenus.SetPriority(separator, prioAfter); items.Insert(n + 1, separator); this.autoCreatedSeparators.Add(separator); } } break; } } } if (!itemAdded) { // if item is not added for any reason so far, simply add it items.Add(item); } this.mergedItems.Add(item); // register a VisibilityChanged notifier to hide seperators if necessary if (item is UIElement) { DependencyPropertyDescriptor.FromProperty(UIElement.VisibilityProperty, item.GetType()). AddValueChanged(item, this.ItemVisibilityChanged); } this.CheckSeparatorVisibility(true); } else { itemAdded = true; } } } return(itemAdded); }