Exemple #1
0
        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));
            }
        }
Exemple #2
0
        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();
        }