/// <summary> /// Layout all legned items. /// </summary> public virtual void MeasureSize(Rectangle parentClientRect) { var ds = this.Chart.DataSource; if (ds == null) { return; } int dataCount = ds.SerialCount; this.Children.Clear(); RGFloat maxSymbolWidth = 0, maxSymbolHeight = 0, maxLabelWidth = 0, maxLabelHeight = 0; #region Measure Sizes for (int index = 0; index < dataCount; index++) { var legendItem = new ChartLegendItem(this, index); var symbolSize = this.GetSymbolSize(index); if (maxSymbolWidth < symbolSize.Width) { maxSymbolWidth = symbolSize.Width; } if (maxSymbolHeight < symbolSize.Height) { maxSymbolHeight = symbolSize.Height; } legendItem.SymbolBounds = new Rectangle(new Point(0, 0), symbolSize); var labelSize = this.GetLabelSize(index); // should +6, don't know why labelSize.Width += 6; if (maxLabelWidth < labelSize.Width) { maxLabelWidth = labelSize.Width; } if (maxLabelHeight < labelSize.Height) { maxLabelHeight = labelSize.Height; } legendItem.LabelBounds = new Rectangle(new Point(0, 0), labelSize); this.Children.Add(legendItem); } #endregion // Measure Sizes #region Layout const RGFloat symbolLabelSpacing = 4; var itemWidth = maxSymbolWidth + symbolLabelSpacing + maxLabelWidth; var itemHeight = Math.Max(maxSymbolHeight, maxLabelHeight); var clientRect = parentClientRect; RGFloat x = 0, y = 0, right = 0, bottom = 0; for (int index = 0; index < dataCount; index++) { var legendItem = this.Children[index] as ChartLegendItem; if (legendItem != null) { legendItem.SetSymbolLocation(0, (itemHeight - legendItem.SymbolBounds.Height) / 2); legendItem.SetLabelLocation(maxSymbolWidth + symbolLabelSpacing, (itemHeight - legendItem.LabelBounds.Height) / 2); legendItem.Bounds = new Rectangle(x, y, itemWidth, itemHeight); if (right < legendItem.Right) { right = legendItem.Right; } if (bottom < legendItem.Bottom) { bottom = legendItem.Bottom; } } x += itemWidth; const RGFloat itemSpacing = 10; if (this.LegendPosition == LegendPosition.Left || this.LegendPosition == LegendPosition.Right) { x = 0; y += itemHeight + itemSpacing; } else { x += itemSpacing; if (x > clientRect.Width) { x = 0; y += itemHeight + itemSpacing; } } } #endregion // Layout this.layoutedSize = new Size(right + 10, bottom); }
/// <summary> /// Layout all legned items. /// </summary> public virtual void MeasureSize(DrawingContext dc, Rectangle parentClientRect) { var ds = Chart.DataSource; if (ds == null) { return; } int count = SymbolCount; Children.Clear(); RGFloat maxSymbolWidth = 0, maxSymbolHeight = 0, maxLabelWidth = 0, maxLabelHeight = 0; // Suppress the legend when it has no labels or just repeats the chart title if (count == 1 && string.IsNullOrEmpty(Chart.Title) && GetSymbolText(0) == Chart.GetDisplayTitle()) { return; } #region Measure Sizes for (int index = 0; index < count; index++) { string label = GetSymbolText(index); if (string.IsNullOrEmpty(label)) { continue; } var symbolSize = GetSymbolSize(index); if (maxSymbolWidth < symbolSize.Width) { maxSymbolWidth = symbolSize.Width; } if (maxSymbolHeight < symbolSize.Height) { maxSymbolHeight = symbolSize.Height; } var legendItem = new ChartLegendItem(Chart.DataSerialStyles[index], label) { FontName = FontName, FontSize = FontSize, FontStyles = FontStyles, SymbolBounds = new Rectangle(new Point(0, 0), symbolSize), }; var labelSize = PlatformUtility.MeasureText(dc, label, legendItem.FontName, legendItem.FontSize, legendItem.FontStyles); if (maxLabelWidth < labelSize.Width) { maxLabelWidth = labelSize.Width; } if (maxLabelHeight < labelSize.Height) { maxLabelHeight = labelSize.Height; } legendItem.LabelBounds = new Rectangle(new Point(0, 0), labelSize); Children.Add(legendItem); } #endregion // Measure Sizes #region Layout const RGFloat symbolLabelSpacing = 4; var itemWidth = maxSymbolWidth + symbolLabelSpacing + maxLabelWidth; var itemHeight = Math.Max(maxSymbolHeight, maxLabelHeight); var clientRect = parentClientRect; RGFloat x = 0, y = 0, right = 0, bottom = 0, overflow = 0; if (LegendPosition == LegendPosition.Top || LegendPosition == LegendPosition.Bottom) { overflow = clientRect.Width - itemWidth; } foreach (var item in Children) { if (item is ChartLegendItem legendItem) { legendItem.SetSymbolLocation(0, (itemHeight - legendItem.SymbolBounds.Height) / 2); legendItem.SetLabelLocation(maxSymbolWidth + symbolLabelSpacing, (itemHeight - legendItem.LabelBounds.Height) / 2); legendItem.Bounds = new Rectangle(x, y, itemWidth, itemHeight); if (right < legendItem.Right) { right = legendItem.Right; } if (bottom < legendItem.Bottom) { bottom = legendItem.Bottom; } } const RGFloat itemSpacing = 10; x += itemWidth + itemSpacing; if (x > overflow) { x = 0; y += itemHeight + itemSpacing; } } #endregion // Layout layoutedSize = new Size(right + 10, bottom); }