コード例 #1
0
        /// <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));
            }
        }
コード例 #2
0
        /// <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);
                }
            }
        }
コード例 #3
0
        /// <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);
        }