代码之家  ›  专栏  ›  技术社区  ›  Andrew Shepherd

绘制列之间没有空格的列图

  •  4
  • Andrew Shepherd  · 技术社区  · 16 年前

    创建柱状图时,可以应用许多组件(参见下面的示例XAML)。有人知道你是否可以在其中一个元素上设置一个属性,它指的是列之间的空白宽度吗?

                    <charting:Chart Height="600" Width="Auto" HorizontalAlignment="Stretch" Name="MyChart"
                        Title="Column Graph" LegendTitle="Legend">
    
                        <charting:ColumnSeries 
                            Name="theColumnSeries"
                            Title="Series A"
                            IndependentValueBinding="{Binding Path=Name}"                
                            DependentValueBinding="{Binding Path=Population}"
                            Margin="0"
                            >
                        </charting:ColumnSeries>
    
                        <charting:Chart.Axes>
                            <charting:LinearAxis 
                                Orientation="Y" 
                                Minimum="200000" 
                                Maximum="2500000" 
                                ShowGridLines="True" />
                            <charting:CategoryAxis
                                Name="chartCategoryAxis"
                                />
                        </charting:Chart.Axes>
                    </charting:Chart>
    
    2 回复  |  直到 16 年前
        1
  •  7
  •   Andrew Shepherd    16 年前

    通过阅读代码,我可以在方法中看到 ,有以下代码行:

        double segmentWidth = coordinateRangeWidth * 0.8;
    

    所以这是一个非常明确的“否”,您不能通过设置公共属性来改变列之间的间距。

    我要尝试的解决方案是编写一个继承自 柱形图 ,和重写 更新的数据点 .


    好的,我去工作了。如果有人感兴趣,我已经附上historogramseries类的完整代码。

    public class HistogramSeries : ColumnSeries, ISeries
    {
        protected override void UpdateDataPoint(DataPoint dataPoint)
        {
            // That set the height and width.
            base.UpdateDataPoint(dataPoint);
            // Now we override the part about setting the width
            object category = dataPoint.ActualIndependentValue;
            var coordinateRange = GetCategoryRange(category);
            double minimum = (double)coordinateRange.Minimum.Value;
            double maximum = (double)coordinateRange.Maximum.Value;
            double coordinateRangeWidth = (maximum - minimum);
            const int WIDTH_MULTIPLIER = 1; // Harcoded to 0.8 in the parent. Could make this a dependency property
            double segmentWidth = coordinateRangeWidth * WIDTH_MULTIPLIER;
            var columnSeries = SeriesHost.Series.OfType<ColumnSeries>().Where(series => series.ActualIndependentAxis == ActualIndependentAxis);
            int numberOfSeries = columnSeries.Count();
            double columnWidth = segmentWidth / numberOfSeries;
            int seriesIndex = columnSeries.IndexOf(this);
            double offset = seriesIndex * Math.Round(columnWidth) + coordinateRangeWidth * 0.1;
            double dataPointX = minimum + offset;
            double left = Math.Round(dataPointX);
            double width = Math.Round(columnWidth);
            Canvas.SetLeft(dataPoint, left);
            dataPoint.Width = width;
        }
        #region ISeries Members
        System.Collections.ObjectModel.ObservableCollection<object> ISeries.LegendItems
        {
            get { return base.LegendItems; }
        }
        #endregion
        #region IRequireSeriesHost Members
        ISeriesHost IRequireSeriesHost.SeriesHost
        {
            get { return base.SeriesHost;}
            set { base.SeriesHost = value; }
        }
        #endregion
    }
    // Copied from the DataVisualization library
    // (It was an internal class)
    static class MyEnumerableFunctions
    {
        public static int IndexOf(this IEnumerable that, object value)
        {
            int index = 0;
            foreach (object item in that)
            {
                if (object.ReferenceEquals(value, item) || value.Equals(item))
                {
                    return index;
                }
                index++;
            }
            return -1;
        }
    }
    
        2
  •  0
  •   Sunkay    10 年前

    Imports System.Windows.Controls.DataVisualization.Charting
    
    
    Public Class HistogramSeries
        Inherits ColumnSeries
    
        Protected Overrides Sub UpdateDataPoint(dataPoint As DataPoint)
            MyBase.UpdateDataPoint(dataPoint)
    
        ' Now we override the part about setting the width
            Dim category As Object = dataPoint.ActualIndependentValue
            Dim coordinateRange = GetCategoryRange(category)
            Dim minimum As Double = CDbl(coordinateRange.Minimum.Value)
            Dim maximum As Double = CDbl(coordinateRange.Maximum.Value)
            Dim coordinateRangeWidth As Double = (maximum - minimum)
            Const WIDTH_MULTIPLIER As Integer = 1 ' Harcoded to 0.8 in the parent. Could make this a dependency property
            Dim segmentWidth As Double = coordinateRangeWidth * WIDTH_MULTIPLIER
            Dim columnS As System.Collections.Generic.IEnumerable(Of ColumnSeries) = SeriesHost.Series.OfType(Of ColumnSeries)().Where(Function(series) series.ActualIndependentAxis Is ActualIndependentAxis)
            Dim numberOfSeries As Integer = columnS.Count
            Dim columnWidth As Double = segmentWidth / numberOfSeries
            Dim seriesIndex As Integer = columnS.ToList.IndexOf(Me)
            Dim offset As Double = seriesIndex * Math.Round(columnWidth) + coordinateRangeWidth * 0.1
            Dim dataPointX As Double = minimum + offset
            Dim left As Double = Math.Round(dataPointX)
            Dim width As Double = Math.Round(columnWidth)
            Canvas.SetLeft(dataPoint, left)
            dataPoint.Width = width
        End Sub
    
    End Class