protected override void UpdateDataItemPlacement(IEnumerable <DefinitionSeries.DataItem> dataItems) { base.UpdateDataItemPlacement(dataItems); double width = this.SeriesArea.ActualWidth / IndependentValueGroups.Count(); double min = 32767; double max = 0; List <string> series = new List <string>(); foreach (DefinitionSeries.DataItem dataItem in dataItems) { if (dataItem.DataPoint.Width < min) { min = dataItem.DataPoint.Width; } if (dataItem.DataPoint.Width > max) { max = dataItem.DataPoint.Width; } if (!series.Contains(dataItem.SeriesDefinition.ActualTitle.ToString())) { series.Add(dataItem.SeriesDefinition.ActualTitle.ToString()); } } foreach (DefinitionSeries.DataItem dataItem in dataItems) { double orgWidth = dataItem.DataPoint.Width; double delta = width - dataItem.DataPoint.Width - 1; dataItem.DataPoint.Width = width; Canvas.SetLeft(dataItem.Container, Canvas.GetLeft(dataItem.Container) - delta); if (orgWidth == max) { Canvas.SetLeft(dataItem.Container, Canvas.GetLeft(dataItem.Container) - 1); if (series.Count > 1) { dataItem.DataPoint.Width = dataItem.DataPoint.Width + 1; } } dataItem.DataPoint.Width = dataItem.DataPoint.Width + 1; } if (series.Count > 1) { int z = dataItems.Count(); foreach (DefinitionSeries.DataItem dataItem in dataItems) { Canvas.SetZIndex(dataItem.Container, z); z--; dataItem.DataPoint.Width = dataItem.DataPoint.Width - 1; } } }
protected override void UpdateDataItemPlacement(IEnumerable <DefinitionSeries.DataItem> dataItems) { base.UpdateDataItemPlacement(dataItems); double width = this.SeriesArea.ActualWidth / IndependentValueGroups.Count(); foreach (DefinitionSeries.DataItem dataItem in dataItems) { double delta = width - dataItem.DataPoint.Width; dataItem.DataPoint.Width = width; Canvas.SetLeft(dataItem.Container, Canvas.GetLeft(dataItem.Container) - delta); } }
protected override Range <IComparable> IRangeProviderGetRange(IRangeConsumer rangeConsumer) { if (rangeConsumer == ActualDependentAxis) { var dependentValuesByIndependentValue = IndependentValueDependentValues.Select(e => e.ToArray()).ToArray(); var mostNegative = dependentValuesByIndependentValue .Select(g => g.Where(v => v < 0) .Sum()) .Where(v => v < 0) .ToArray(); var leastNegative = dependentValuesByIndependentValue .Select(g => g.Where(v => v <= 0) .DefaultIfEmpty(1.0) .First()) .Where(v => v <= 0) .ToArray(); var mostPositive = dependentValuesByIndependentValue .Select(g => g.Where(v => 0 < v) .Sum()) .Where(v => 0 < v) .ToArray(); var leastPositive = dependentValuesByIndependentValue .Select(g => g.Where(v => 0 <= v) .DefaultIfEmpty(-1.0) .First()) .Where(v => 0 <= v) .ToArray(); // Compute minimum double minimum = 0; if (mostNegative.Any()) { minimum = mostNegative.Min(); } else if (leastPositive.Any()) { minimum = leastPositive.Min(); } // Compute maximum double maximum = 0; if (mostPositive.Any()) { maximum = mostPositive.Max(); } else if (leastNegative.Any()) { maximum = leastNegative.Max(); } if (IsStacked100) { minimum = Math.Min(minimum, 0); maximum = Math.Max(maximum, 0); } return(new Range <IComparable>(minimum, maximum)); } else if (rangeConsumer == ActualIndependentAxis) { // Using a non-ICategoryAxis for the independent axis // Need to specifically adjust for slot size of bars/columns so they don't overlap // Note: Calculation for slotSize is not perfect, but it's quick, close, and errs on the safe side Range <IComparable> range = base.IRangeProviderGetRange(rangeConsumer); int count = Math.Max(IndependentValueGroups.Count(), 1); if (ActualIndependentAxis.CanPlot(0.0)) { double minimum = ValueHelper.ToDouble(range.Minimum); double maximum = ValueHelper.ToDouble(range.Maximum); double slotSize = (maximum - minimum) / count; return(new Range <IComparable>(minimum - slotSize, maximum + slotSize)); } else { DateTime minimum = ValueHelper.ToDateTime(range.Minimum); DateTime maximum = ValueHelper.ToDateTime(range.Maximum); TimeSpan slotSize = TimeSpan.FromTicks((maximum - minimum).Ticks / count); return(new Range <IComparable>(minimum - slotSize, maximum + slotSize)); } } else { return(base.IRangeProviderGetRange(rangeConsumer)); } }