【问题标题】:Smooth scroling in chart with datetime x axis使用日期时间 x 轴在图表中平滑滚动
【发布时间】:2016-09-22 15:26:07
【问题描述】:

我在图表中绘制了这个简单的图表。 X 轴上的值为DateTime 值。

public partial class Form1 : Form
{

    List<double> valuelist = new List<double>();
    List<DateTime> timelist = new List<DateTime>();

    public Form1()
    {
        InitializeComponent();

        // fill the lists with values
        for (int i = 0; i < 2000; i++)
        {
            double value = Math.Sin(i/20.0);
            valuelist.Add(value);
            timelist.Add(DateTime.Now.AddMinutes(i + 2));
        }

        // add the Values to the chart
        for (int i = 0; i < valuelist.Count; i++)
        {
            this.chart1.Series[0].Points.AddXY(timelist[i], valuelist[i]);
        }

        this.chart1.ChartAreas[0].AxisX.LabelStyle.Format = "dd.MM-hh:mm";

    }

    private void Form1_Load(object sender, EventArgs e)
    {

        chart1.Series[0].XValueType = ChartValueType.DateTime;


        chart1.ChartAreas[0].AxisX.Maximum = timelist.Max().ToOADate();
        chart1.ChartAreas[0].AxisX.Minimum = timelist.Min().ToOADate();


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

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


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

        DateTime intervall = timelist.Min().AddHours(3);


        chart1.ChartAreas[0].AxisX.ScaleView.Zoom(chart1.ChartAreas[0].AxisX.Minimum, intervall.ToOADate());


        // disable zoom-reset button 
        chart1.ChartAreas[0].AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.SmallScroll;

        // set scrollbar small change to blockSize 
        chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollSize = intervall.ToOADate();
    }

}

我的问题是我无法让滚动条平滑移动。当我仅绘制 Y 值并仅对 AxisX.MaximumAxisX.MinimumAxisX.ScaleView.ZoomAxisX.ScaleView.SmallScrollSize 使用 double 值时,它就像一个魅力。但是,一旦我将 DateTime 用于 X 值,我就只能逐步滚动。有人知道如何超越吗?我感觉这段代码是障碍:

// set scrollbar small change to blockSize (e.g. 100)
chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollSize = intervall.ToOADate();

编辑:

X 轴的间隔是自动的,范围由 chart1.ChartAreas[0].AxisX.ScaleView.Zoom 的 ZoomLevel 设置。这是一张图片:

编辑 2:

X 轴的值是模拟每分钟采样 1 个值的日期时间值:

timelist.Add(DateTime.Now.AddMinutes(i + 2));

因为值很多,我没有设置间隔。 代码以这种方式发布,因此可以按原样复制并立即运行以进行尝试。

【问题讨论】:

    标签: c# datetime scroll charts axis


    【解决方案1】:

    你的滚动间隔是错误的。

    它不应该是数据的开始,而是滚动时要执行的步骤。

    您似乎想滚动 3 小时?

    这是你要做的:

    chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollSizeType = DateTimeIntervalType.Hours;
    chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollSize = 3;
    

    如果您想使用 DateTime.ToOADate double 来实现相同的效果,您需要从 DataTime 数据类型(0aka 'dawn of time' aka 1899-12-30)的第一天开始,然后加 3 小时:

     DateTime interval = DateTime.FromOADate(0).AddHours(3);
     chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollSizeType = DateTimeIntervalType.Number;
     chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollSize = interval.ToOADate();
    

    为了允许顺利拖动电梯,这可能比设置SmallScrollSize 更好:

    chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollMinSizeType  =DateTimeIntervalType.Minutes;
    chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollMinSize = 60;
    

    使用你的单位和数字!这只有在您不设置SmallScrollMinSize时才有效。

    【讨论】:

    • 谢谢你,但不幸的是同样的结果。我无法拖动滚动按钮并在图表中平滑滑动,只能逐步进行。
    • 我实际上想要流畅地滚动,当我不搞乱 x 轴值中的日期时间时,这很有效。缩放窗口由chart1.ChartAreas[0].AxisX.ScaleView.Zoom 设置,应该在这个区间内滑动
    • 您需要告诉我们更多关于图表中的值的信息!拖动电梯只能移动至少一个像素 * 比例。你确定步骤吗?它们可能是您的数据点,也可能是跳跃轴标签。如果不知道更多,真的很难说,尤其是。没有看到图像。你设置了 Axis.Interval???
    • 我也有类似的想法。但我不知道如何绕过这个步骤。我编辑了我的帖子。代码可以按原样复制和编译。它会运行并自我展示。数据完全由代码生成
    • 好。发布的代码中仍有一些德国名字 ;-) - 尝试用此 chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollMinSizeType = DateTimeIntervalType.Minutes; chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollMinSize = 60; 替换 SmallScrollSize 设置
    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 2014-11-06
    • 2017-03-26
    • 1970-01-01
    • 2020-10-19
    • 2016-04-01
    • 1970-01-01
    相关资源
    最近更新 更多