C#Chart使用CustomLabels和滚动条

时间:2013-11-01 01:42:00

标签: c# charts mschart

我不明白。如果我不使用自定义标签,图表将使用默认标签。然后,如果我移动滚动条,图表大小将无法调整。图表视图保持原始大小。

但如果我使用此代码更改第0行的标签。(其他行没有此问题)

chart1.ChartAreas[0].AxisY2.CustomLabels.Add((i) , 
    (i+1), (ntemp * 10).ToString(), 0, LabelMarkStyle.SideMark);

移动滚动条,图表视图的大小会有所不同。图表会闪烁,我不想要它。

提前致谢。

这是示例

            Random rand = new Random();
            chart1.Series.Clear();

            var series = chart1.Series.Add("My Series");
            series.ChartType = SeriesChartType.RangeBar;
            series.Color = Color.Black;

            series.YAxisType = AxisType.Secondary;

            for (int i = 10; i > 2; i--)
                series.Points.AddXY(i, (rand.Next(3600, 7200)), (rand.Next(30000, 80000)));
            var chartArea = chart1.ChartAreas[series.ChartArea];

            chartArea.BorderDashStyle = ChartDashStyle.Solid; //最外圍的框框
            chartArea.BorderWidth = 10;

            chartArea.AxisY.Enabled = AxisEnabled.False;

            chartArea.AxisY2.Enabled = AxisEnabled.True;

            chartArea.AxisY2.LabelStyle.IntervalType = DateTimeIntervalType.Number;

            chartArea.AxisY2.Interval = 3600;
            chartArea.AxisY2.Minimum = 0;
            chartArea.AxisY2.Maximum = 86400;
            chartArea.AxisY2.ScaleView.Zoom(0, 3600 * 4);

            for (int i = 0; i <= 24 * 6; i++)
            {

                int ntemp = i % 6;
                if (ntemp != 0)
                {
                    /*Problem Here !!*/
                    //chart1.ChartAreas[0].AxisY2.CustomLabels.Add((i) * 600, (i + 1) * 600, (ntemp * 10).ToString(), 0, LabelMarkStyle.Box);
                }
            }

            chartArea.CursorY.AutoScroll = true;
            chartArea.AxisY2.ScaleView.Zoomable = true;
            chartArea.AxisY2.ScrollBar.ButtonStyle = ScrollBarButtonStyles.SmallScroll;
            chartArea.AxisY2.ScrollBar.IsPositionedInside = false;

        }

1 个答案:

答案 0 :(得分:0)

好吧,我对OxyPlot是如何以及如何实现感到好奇,我认为它可以...... 这是我用过的代码,这是一个截图:

Screenshot

var model = new PlotModel("IntervalBarSeries") { LegendPlacement =  LegendPlacement.Outside };

var temp_serie = new IntervalBarSeries 
{ 
    Title = "IntervalBarSeries 1", 
    FillColor = OxyColors.Black
};

var categoryAxis = new CategoryAxis
{
    Position = AxisPosition.Left,
    IsZoomEnabled = false,  // No zoom on this axis
    IsPanEnabled = false,   // Right mouse move won't affect this axis
    MajorGridlineStyle = LineStyle.Solid
    ,StartPosition = 1, EndPosition = 0 // This will reverse the order

};

var valueAxis = new LinearAxis(AxisPosition.Top)
{
    MinimumPadding = 0.1, MaximumPadding = 0.1, 
    IsZoomEnabled = true, 
    MajorGridlineStyle = LineStyle.Solid,
    MajorStep = 3600,
    AbsoluteMinimum = 0
};

for (int i = 10; i > 2; i--)
{
temp_serie.Items.Add(new IntervalBarItem { 
    Start = rand.Next(3600, 7200), 
    End = rand.Next(30000, 80000) 
});

categoryAxis.Labels.Add("Activity "+i);
}

model.Series.Add(temp_serie);   
model.Axes.Add(categoryAxis);
model.Axes.Add(valueAxis);

MyPlotModel = model;

现在,我正在使用MVVM,只是从我的View中绑定到情节模型:

<oxy:Plot Model="{Binding MyPlotModel}"/>

但你可以弄清楚如何用WinForms做一次(如果?)你决定使用OxyPlot并导入它。

我假设你正在做一些与时间有关的工作,但你的代码显然没有这么说......你可以玩顶部标题,也许设置如何显示数字(ATM)没有缩放,它们相互重叠。用滚动条缩放解决了这个问题,但那只是因为我将刻度尺寸设置为3600 ...)