/// <summary> /// Updates the value margins after all data points are updated. /// </summary> protected override void OnAfterUpdateDataPoints() { IValueMarginProvider provider = this; { var consumer = ActualDependentRangeAxis as IValueMarginConsumer; if (consumer != null) { consumer.ValueMarginsChanged(provider, GetValueMargins(consumer)); } } { var consumer = ActualIndependentAxis as IValueMarginConsumer; if (consumer != null) { consumer.ValueMarginsChanged(provider, GetValueMargins(consumer)); } } base.OnAfterUpdateDataPoints(); }
/// <summary> /// Updates the layout of the axis to accommodate a sequence of value /// margins. /// </summary> /// <param name="provider">A value margin provider.</param> /// <param name="valueMargins">A sequence of value margins.</param> void IValueMarginConsumer.ValueMarginsChanged(IValueMarginProvider provider, IEnumerable <ValueMargin> valueMargins) { Action action = () => { if (this.Orientation != AxisOrientation.None) { // Determine if any of the value margins are outside the axis // area. If so update range. bool updateRange = valueMargins .Select( valueMargin => { double coordinate = GetPlotAreaCoordinate(valueMargin.Value).Value; return(new Range <double>(coordinate - valueMargin.LowMargin, coordinate + valueMargin.HighMargin)); }) .Where(range => range.Minimum <0 || range.Maximum> this.ActualLength) .Any(); if (updateRange) { UpdateActualRange(); } } }; // Repeat this after layout pass. if (this.ActualLength == 0) { #pragma warning disable 4014 this.Dispatcher.RunAsync(CoreDispatcherPriority.High, new DispatchedHandler(action)); #pragma warning restore 4014 } else { action(); } }
/// <summary> /// Updates the layout of the axis to accommodate a sequence of value /// margins. /// </summary> /// <param name="provider">A value margin provider.</param> /// <param name="valueMargins">A sequence of value margins.</param> void IValueMarginConsumer.ValueMarginsChanged(IValueMarginProvider provider, IEnumerable<ValueMargin> valueMargins) { Action action = () => { if (this.Orientation != AxisOrientation.None) { // Determine if any of the value margins are outside the axis // area. If so update range. bool updateRange = valueMargins .Select( valueMargin => { double coordinate = GetPlotAreaCoordinate(valueMargin.Value).Value; return new Range<double>(coordinate - valueMargin.LowMargin, coordinate + valueMargin.HighMargin); }) .Where(range => range.Minimum < 0 || range.Maximum > this.ActualLength) .Any(); if (updateRange) { UpdateActualRange(); } } }; // Repeat this after layout pass. if (this.ActualLength == 0) { this.Dispatcher.BeginInvoke(action); } else { action(); } }