0

Silverlight ツールキットの横棒グラフに 3 つの系列を表示したいと考えています... 2 つの通常の棒系列と 1 つの積み上げ棒系列 (2 で構成されるSeriesDefinition)。最初の 2 つの通常のバー シリーズを追加すると、期待どおりに隣同士に表示されます。しかし、積み上げシリーズを追加すると、行全体の高さを占めます。2 種類のシリーズを組み合わせて、上から下に積み上げ、棒、棒として表示する方法はありますか?

私が現在設定している方法は次のとおりです。

<charts:Chart Title="Manufacturer Overview" LegendTitle="Legend" Style="{StaticResource ZChartNoBackground}">
<charts:Chart.Series>
    <charts:StackedBarSeries>
        <charts:SeriesDefinition Title="Oppotunities" 
              ItemsSource="{Binding Path=TotalValueInFunnelByVendor}" 
              IndependentValueBinding="{Binding IndependentValue}" 
              DependentValueBinding="{Binding DependentValue}">
        </charts:SeriesDefinition>
        <!--SAMPLE DATA UNTIL REAL DATA IS IN-->
        <charts:SeriesDefinition Title="Flow Business" 
              ItemsSource="{Binding Path=TotalValueInFunnelByVendor}" 
              IndependentValueBinding="{Binding IndependentValue}" 
              DependentValueBinding="{Binding DependentValue}">
        </charts:SeriesDefinition>
    </charts:StackedBarSeries>
    <charts:BarSeries Title="Sales to date" 
              ItemsSource="{Binding Path=SalesToDateByVendor}" 
              IndependentValueBinding="{Binding IndependentValue}" 
              DependentValueBinding="{Binding DependentValue}">
    </charts:BarSeries>
    <charts:BarSeries Title="Forecasted" 
              ItemsSource="{Binding Path=ForecastedSalesByVendor}" 
              IndependentValueBinding="{Binding IndependentValue}" 
              DependentValueBinding="{Binding DependentValue}">
    </charts:BarSeries>
</charts:Chart.Series>
</charts:Chart>

これがチャートのイメージです。GREEN と RED のバーは正しく配置されていますが、積み重ねられたバーは行の高さであり、他の 2 つのシリーズの「背面」にあることに注意してください。

チャートのスナップショット

4

1 に答える 1

0

そのため、いろいろ調べた結果、この動作は「仕様によるもの」またはバグであるという結論に達しました。のソースコードを見てみましたStackedBarSeriesStackedBarSeriesSeriesHost のシリーズ数でバーの高さを分割する "UpdateDataItemPlacement" メソッドを継承してコードを追加する新しいクラスを作成しました。

protected override void UpdateDataItemPlacement(IEnumerable<DefinitionSeries.DataItem> dataItems)
{
    /* A BUNCH OF CODE FROM TOOLKIT */

    double sum = IsStacked100 ?
       group.DataItems.Sum(di =>Math.Abs(ValueHelper.ToDouble(di.DataPoint.ActualDependentValue))) : 
       1;
    if (0 == sum)
    {
        sum = 1;
    }

    // MY ADDITION        
    var numSeries = this.SeriesHost.Series.Count;
    int index = this.SeriesHost.Series.IndexOf(this);
    // END ADDITION

    double ceiling = 0;
    double floor = 0;
    foreach (DataItem dataItem in group.DataItems)
    {
        DataPoint dataPoint = dataItem.DataPoint;
        double value = IsStacked100 ? (ValueHelper.ToDouble(dataPoint.ActualDependentValue) * (100 / sum)) : ValueHelper.ToDouble(dataPoint.ActualDependentValue);
        if (ValueHelper.CanGraph(value))
        {
            double valueCoordinate = ActualDependentAxis.GetPlotAreaCoordinate(value).Value;
            double fillerCoordinate = (0 <= value) ? ceiling : floor;

            double topCoordinate = 0, leftCoordinate = 0, height = 0, width = 0, deltaCoordinate = 0;
            if (AxisOrientation.Y == ActualDependentAxis.Orientation)
            {
                topCoordinate = plotAreaMaximumDependentCoordinate - Math.Max(valueCoordinate + fillerCoordinate, zeroCoordinate + fillerCoordinate);
                double bottomCoordinate = plotAreaMaximumDependentCoordinate - Math.Min(valueCoordinate + fillerCoordinate, zeroCoordinate + fillerCoordinate);
                deltaCoordinate = bottomCoordinate - topCoordinate;
                height = (0 < deltaCoordinate) ? deltaCoordinate + 1 : 0;
                leftCoordinate = categoryMinimumCoordinate;
                width = categoryMaximumCoordinate - categoryMinimumCoordinate + 1;

                // MY MODIFICATION
                //adjusting the width and offset to allow multiple columns to render beside each other instead of overtop
                width = width / numSeries;
                leftCoordinate = leftCoordinate + (width * index);
                //
            }
            else
            {
                leftCoordinate = Math.Min(valueCoordinate + fillerCoordinate, zeroCoordinate + fillerCoordinate);
                double rightCoordinate = Math.Max(valueCoordinate + fillerCoordinate, zeroCoordinate + fillerCoordinate);
                deltaCoordinate = rightCoordinate - leftCoordinate;
                width = (0 < deltaCoordinate) ? deltaCoordinate + 1 : 0;
                topCoordinate = categoryMinimumCoordinate;
                height = categoryMaximumCoordinate - categoryMinimumCoordinate + 1;

                //MY MODIFICATION
                //adjusting the height and offset to allow multiple columns to render beside each other instead of overtop
                height = height / numSeries;
                topCoordinate = topCoordinate + (height * index);
                //
            }

            // THE REST OF THE CODE FROM THE TOOLKIT
       }  
       else
       {
           dataPoint.Visibility = Visibility.Collapsed;
       }
   }
}
于 2012-09-05T18:15:59.253 に答える