0

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

但是如果我使用此代码更改第 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;

        }
4

1 回答 1

0

好吧,我对 OxyPlot 如何以及是否可以实现这一点很感兴趣,我认为它可以......这是我使用的代码,这是一个屏幕截图:

截屏

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 并从我的视图中绑定到绘图模型:

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

但是一旦(如果?)你决定使用 OxyPlot 并导入它,你就可以弄清楚如何对 WinForms 做同样的事情。

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

于 2013-11-01T10:42:54.640 回答