// 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); } } } }