コード例 #1
0
        // Update items size and positions
        private void Update(Size constraint)
        {
            List <RibbonContextualTabGroup> visibleGroups = new List <RibbonContextualTabGroup>();

            for (int i = 0; i < Items.Count; i++)
            {
                if (Items[i] is RibbonContextualTabGroup)
                {
                    RibbonContextualTabGroup group = Items[i] as RibbonContextualTabGroup;
                    if ((group.Visibility == Visibility.Visible) && (group.Items.Count > 0))
                    {
                        visibleGroups.Add(group);
                    }
                }
            }

            Size infinity = new Size(double.PositiveInfinity, double.PositiveInfinity);

            if ((visibleGroups.Count == 0) || ((visibleGroups[0].Items[0].Parent as RibbonTabControl).CanScroll))
            {
                // Collapse itemRect
                itemsRect = new Rect(0, 0, 0, 0);
                // Set quick launch toolbar and header position and size
                quickAccessToolbarHolder.Measure(infinity);
                if (constraint.Width > quickAccessToolbarHolder.DesiredSize.Width + 50)
                {
                    quickAccessToolbarRect = new Rect(0, 0, quickAccessToolbarHolder.DesiredSize.Width, quickAccessToolbarHolder.DesiredSize.Height);
                    headerHolder.Measure(infinity);
                    double allTextWidth = constraint.Width - quickAccessToolbarHolder.DesiredSize.Width;
                    if (HeaderAlignment == HorizontalAlignment.Left)
                    {
                        headerRect = new Rect(quickAccessToolbarHolder.DesiredSize.Width, 0, Math.Min(allTextWidth, headerHolder.DesiredSize.Width), constraint.Height);
                    }
                    else if (HeaderAlignment == HorizontalAlignment.Center)
                    {
                        headerRect = new Rect(quickAccessToolbarHolder.DesiredSize.Width + Math.Max(0, allTextWidth / 2 - headerHolder.DesiredSize.Width / 2), 0, Math.Min(allTextWidth, headerHolder.DesiredSize.Width), constraint.Height);
                    }
                    else if (HeaderAlignment == HorizontalAlignment.Right)
                    {
                        headerRect = new Rect(quickAccessToolbarHolder.DesiredSize.Width + Math.Max(0, allTextWidth - headerHolder.DesiredSize.Width), 0, Math.Min(allTextWidth, headerHolder.DesiredSize.Width), constraint.Height);
                    }
                    else if (HeaderAlignment == HorizontalAlignment.Stretch)
                    {
                        headerRect = new Rect(quickAccessToolbarHolder.DesiredSize.Width, 0, allTextWidth, constraint.Height);
                    }
                }
                else
                {
                    quickAccessToolbarRect = new Rect(0, 0, Math.Max(0, constraint.Width - 50), quickAccessToolbarHolder.DesiredSize.Height);
                    headerRect             = new Rect(Math.Max(0, constraint.Width - 50), 0, 50, constraint.Height);
                }
            }
            else
            {
                // Set items container size and position
                RibbonTabItem firstItem = visibleGroups[0].Items[0];
                RibbonTabItem lastItem  = visibleGroups[visibleGroups.Count - 1].Items[visibleGroups[visibleGroups.Count - 1].Items.Count - 1];

                double startX = firstItem.TranslatePoint(new Point(0, 0), this).X;
                double endX   = lastItem.TranslatePoint(new Point(lastItem.DesiredSize.Width, 0), this).X;

                itemsRect = new Rect(startX, 0, Math.Max(0, Math.Min(endX, constraint.Width) - startX), constraint.Height);
                // Set quick launch toolbar position and size
                quickAccessToolbarHolder.Measure(infinity);
                double quickAccessToolbarWidth = quickAccessToolbarHolder.DesiredSize.Width;
                if (startX < 0)
                {
                    quickAccessToolbarRect = new Rect(0, 0, Math.Min(quickAccessToolbarWidth, 0), quickAccessToolbarHolder.DesiredSize.Height);
                }
                else
                {
                    quickAccessToolbarRect = new Rect(0, 0, Math.Min(quickAccessToolbarWidth, startX), quickAccessToolbarHolder.DesiredSize.Height);
                }

                // Set header
                headerHolder.Measure(infinity);
                if (HeaderAlignment == HorizontalAlignment.Left)
                {
                    if (startX - quickAccessToolbarWidth > 150)
                    {
                        double allTextWidth = startX - quickAccessToolbarWidth;
                        headerRect = new Rect(quickAccessToolbarRect.Width, 0, Math.Min(allTextWidth, headerHolder.DesiredSize.Width), constraint.Height);
                    }
                    else
                    {
                        double allTextWidth = Math.Max(0, constraint.Width - endX);
                        headerRect = new Rect(Math.Min(endX, constraint.Width), 0, Math.Min(allTextWidth, headerHolder.DesiredSize.Width), constraint.Height);
                    }
                }
                else if (HeaderAlignment == HorizontalAlignment.Center)
                {
                    if (((startX - quickAccessToolbarWidth < 150) && (startX - quickAccessToolbarWidth > 0) && (startX - quickAccessToolbarWidth < constraint.Width - endX)) || (endX < constraint.Width / 2))
                    {
                        double allTextWidth = Math.Max(0, constraint.Width - endX);
                        headerRect = new Rect(Math.Min(Math.Max(endX, constraint.Width / 2 - headerHolder.DesiredSize.Width / 2), constraint.Width), 0, Math.Min(allTextWidth, headerHolder.DesiredSize.Width), constraint.Height);
                    }
                    else
                    {
                        double allTextWidth = Math.Max(0, startX - quickAccessToolbarWidth);
                        headerRect = new Rect(quickAccessToolbarHolder.DesiredSize.Width + Math.Max(0, allTextWidth / 2 - headerHolder.DesiredSize.Width / 2), 0, Math.Min(allTextWidth, headerHolder.DesiredSize.Width), constraint.Height);
                    }
                }
                else if (HeaderAlignment == HorizontalAlignment.Right)
                {
                    if (startX - quickAccessToolbarWidth > 150)
                    {
                        double allTextWidth = Math.Max(0, startX - quickAccessToolbarWidth);
                        headerRect = new Rect(quickAccessToolbarHolder.DesiredSize.Width + Math.Max(0, allTextWidth - headerHolder.DesiredSize.Width), 0, Math.Min(allTextWidth, headerHolder.DesiredSize.Width), constraint.Height);
                    }
                    else
                    {
                        double allTextWidth = Math.Max(0, constraint.Width - endX);
                        headerRect = new Rect(Math.Min(Math.Max(endX, constraint.Width - headerHolder.DesiredSize.Width), constraint.Width), 0, Math.Min(allTextWidth, headerHolder.DesiredSize.Width), constraint.Height);
                    }
                }
                else if (HeaderAlignment == HorizontalAlignment.Stretch)
                {
                    if (startX - quickAccessToolbarWidth > 150)
                    {
                        double allTextWidth = startX - quickAccessToolbarWidth;
                        headerRect = new Rect(quickAccessToolbarRect.Width, 0, allTextWidth, constraint.Height);
                    }
                    else
                    {
                        double allTextWidth = Math.Max(0, constraint.Width - endX);
                        headerRect = new Rect(Math.Min(endX, constraint.Width), 0, allTextWidth, constraint.Height);
                    }
                }
            }
        }