如何在c#

时间:2016-03-17 05:06:34

标签: c# winforms

  

我在我的c#应用程序中使用图表控件。使用计时器每1秒更新图表中的值。同时我启用了图表的滚动条,因此滚动条会在值添加时继续调整。实际上我的要求是,如果我拖动滚动条并保持在任何一点它只需要在该特定点冻结。当我在特定点拖动并按住滚动条时,它不应该调整。如何做?请参考以下代码,

int x1=10, x2=10, y1=10, y2=10; //globally declared
private void button1_Click(object sender, EventArgs e)  //chart preparation in button click
    {
        chart1.Series.Clear();                         
        series1.MarkerStyle = MarkerStyle.Circle;
        series1.MarkerColor = Color.BlueViolet;
        series1.MarkerSize = 7;
        series1.Color = System.Drawing.Color.Green;                
        series1.IsXValueIndexed = true;              
        series1.YAxisType = AxisType.Primary;
        series1.ChartType = SeriesChartType.Line;
        this.chart1.Series.Add(series1);

        series2.MarkerStyle = MarkerStyle.Circle;
        series2.MarkerColor = Color.Orange;
        series2.MarkerSize = 7;
        series2.Color = System.Drawing.Color.Purple;              
        series2.IsXValueIndexed = true;               
            series2.YAxisType = AxisType.Secondary;
        series2.ChartType = SeriesChartType.Line;
        this.chart1.Series.Add(series2);

        chart1.ChartAreas[0].CursorX.AutoScroll = true;
        chart1.ChartAreas[0].CursorY.AutoScroll = true;

        chart1.ChartAreas[0].AxisX.ScrollBar.Size = 15;
        chart1.ChartAreas[0].AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.All;
        chart1.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = false;
        chart1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;

        chart1.ChartAreas[0].AxisX.ScaleView.Zoomable = true;

        chart1.Series[0].Points.AddXY(x1, y1);
        chart1.Series[1].Points.AddXY(x2, y2);
        chart1.ChartAreas[0].AxisX.ScaleView.Position = chart1.ChartAreas[0].AxisX.Minimum;// scrollPosition;
        chart1.ChartAreas[0].AxisX.ScaleView.Zoom(chart1.ChartAreas[0].AxisX.Maximum - nCheck, chart1.ChartAreas[0].AxisX.Maximum);

        x1 += 1;
        x2 += 1;
        nlength++;

        if (nlength == 25)
        {
            nCheck = 30;
            chart1.Update();
        }
        else if (nlength == 50)
            nCheck = 50;

        timer1.Start();
    }
   public void createGraph() //called in timer
    {
        chart1.Series[0].Points.AddXY(x1, y1);
        chart1.Series[1].Points.AddXY(x2, y2);
        chart1.ChartAreas[0].AxisX.ScaleView.Position = chart1.ChartAreas[0].AxisX.Minimum;// scrollPosition;
        chart1.ChartAreas[0].AxisX.ScaleView.Zoom(chart1.ChartAreas[0].AxisX.Maximum - nCheck, chart1.ChartAreas[0].AxisX.Maximum);

        x1 += 1;
        x2 += 1;
        nlength++;

        if (nlength == 25)
        {
            nCheck = 30;
            chart1.Update();
        }                
        else if(nlength == 50)
            nCheck = 50;
    }

    private void chart1_AxisScrollBarClicked(object sender, ScrollBarEventArgs e)
    {
        chart1.ChartAreas[0].CursorX.AutoScroll = false;
        chart1.ChartAreas[0].CursorY.AutoScroll = false; //here i need to update some code i think so ...                    
    }

1 个答案:

答案 0 :(得分:0)

只要没有设置轴的最小值和最大值,它就会根据数据自动调整。这是一个示例,其中用户选择的开始将 x 轴的范围固定到当前视图,并将选择应用为缩放,并在选择完成后再次释放轴范围。

double SelectionStartX=0, SelectionEndX=0;
Chart.SelectionRangeChanging += (object sender, CursorEventArgs e) =>
{
    //Record selection to be applied as zoom in SelectionRangeChanged event 
    SelectionStartX = e.ChartArea.CursorX.SelectionStart;
    SelectionEndX = e.ChartArea.CursorX.SelectionEnd;

    //Stop motion - Fix x-axis range to width of view
    e.Axis.Maximum = e.Axis.ScaleView.ViewMaximum;
    e.Axis.Minimum = e.Axis.ScaleView.ViewMinimum;
};

Chart.SelectionRangeChanged += (object sender, CursorEventArgs e) =>
{

    //Reset previous zooming and apply only last user selected range
    if (e.Axis.ScaleView.IsZoomed)
    {
        e.Axis.ScaleView.ZoomReset();
        e.Axis.ScaleView.Zoom(SelectionStartX, SelectionEndX);
    }

    //Continue motion - Make chart adaptive to data range
    e.Axis.Minimum = double.NaN;
    e.Axis.Maximum = double.NaN;

};