protected override Size MeasureOverride(Size constraint) { var pen = new Pen(Foreground, 1); Size tickText; int tickCount; if (Labels != null) { var label = Labels.Count > 0 ? Labels.Cast<string>().Aggregate((a, b) => a.Length > b.Length ? a : b) : string.Empty; var text = new FormattedText(label, CultureInfo.CurrentUICulture, FlowDirection.LeftToRight, new Typeface("Sans Serif"), 10, pen.Brush); tickText = new Size(text.Width, text.Height); tickCount = Labels.Count; } else { var tickText1 = new FormattedText(FormatTick(_actualMaximum), CultureInfo.CurrentUICulture, FlowDirection.LeftToRight, new Typeface("Sans Serif"), 10, pen.Brush); var tickText2 = new FormattedText(FormatTick(_actualMinimum), CultureInfo.CurrentUICulture, FlowDirection.LeftToRight, new Typeface("Sans Serif"), 10, pen.Brush); tickText = new Size(Math.Max(tickText1.Width, tickText2.Width), Math.Max(tickText1.Height, tickText2.Height)); tickCount = 4; } if (Orientation == AxisOrientation.Horizontal) { if (Labels != null && tickCount * (tickText.Width + 5) > constraint.Width) { _longTicks = true; _axisOffset = tickText.Width * 0.8; return new Size(Math.Min(constraint.Width, (tickText.Width * 0.8 + 5) * tickCount), Math.Min(5 + tickText.Width * 0.8, constraint.Height)); } else { _longTicks = false; _axisOffset = 0; return new Size(Math.Min(constraint.Width, (tickText.Width + 5) * tickCount), Math.Min(5 + tickText.Height, constraint.Height)); } } else { return new Size(Math.Min(constraint.Width, tickText.Width + 10), Math.Min(constraint.Height, (tickText.Height + 5) * tickCount)); } }
internal void Scale() { if (double.IsNaN(Minimum) || double.IsNaN(Maximum)) { try { if (Labels != null) { var first = Labels.Cast<object>().FirstOrDefault(); var last = Labels.Cast<object>().LastOrDefault(); if (first != null && last != null) { _actualMinimum = 0; _actualMaximum = GetItemValue(last); } else { _actualMinimum = double.IsNaN(Minimum) ? 0 : Minimum; _actualMaximum = double.IsNaN(Maximum) ? 1 : Maximum; } } else { var count = 0; var activeSeries = Series .Select(r => r as CartesianSeries) .Where(s => s != null && s.Data != null && (Orientation == AxisOrientation.Horizontal ? s.AxisX == this : s.AxisY == this)); var limits = activeSeries .SelectMany(s => s.Data.Select(p => Orientation == AxisOrientation.Horizontal ? GetItemValue(p.X) : GetItemValue(p.Y))) .Aggregate( new Tuple<double, double>(double.MaxValue, double.MinValue), (l, i) => { var minimum = l.Item1; var maximum = l.Item2; if (i < minimum) { minimum = i; } if (i > maximum) { maximum = i; } count += 1; return new Tuple<double, double>(minimum, maximum); }); if (count > 0) { var margin = (limits.Item2 - limits.Item1) * AutoScaleMargin; _actualMinimum = double.IsNaN(Minimum) ? limits.Item1 - margin : Minimum; _actualMaximum = double.IsNaN(Maximum) ? limits.Item2 + margin : Maximum; } else { _actualMinimum = double.IsNaN(Minimum) ? 0 : Minimum; _actualMaximum = double.IsNaN(Maximum) ? 1 : Maximum; } } } catch { _actualMinimum = 0; _actualMaximum = 1; } } else { _actualMinimum = Minimum; _actualMaximum = Maximum; } InvalidateMeasure(); RaiseUpdated(); }