【问题标题】:MSChart drag chart in order to scroll chartMSChart 拖动图表以滚动图表
【发布时间】:2016-06-16 07:26:12
【问题描述】:

有什么方法可以单击 MSChart 并将其向左/向右拖动,以便向右/向左滚动图表。 这个想法是拖动图表而不是拖动图表的滚动条。 我之所以不简单地使用滚动条是因为我被要求添加此功能(老板和他们的要求..)。 顺便说一句,我正在使用 C# 和 winforms。 希望我足够清楚。 谢谢!!

【问题讨论】:

    标签: c# winforms charts mschart


    【解决方案1】:

    是的,这是可能的。

    一个问题是您不能使用正常的缩放/滚动机制,因为它本身可以通过拖动图表来工作。

    而是通过它并编写两个鼠标事件并使用Axis.PixelPositionToValue 函数来访问数据值。

    首先我们存储点击位置的数据值:

    double mDown = double.NaN;
    
    private void chart1_MouseDown(object sender, MouseEventArgs e)
    {
        Axis ax = chart1.ChartAreas[0].AxisX;
        mDown = ax.PixelPositionToValue(e.Location.X);
    }
    

    然后我们计算Axis.Minimum移动了多远的旧范围并适应MinimumMaximum

    private void chart1_MouseMove(object sender, MouseEventArgs e)
    {
        if (!e.Button.HasFlag(MouseButtons.Left)) return;
        Axis ax = chart1.ChartAreas[0].AxisX;
        double range = ax.Maximum - ax.Minimum;
        double xv = ax.PixelPositionToValue(e.Location.X);
        ax.Minimum -= xv - mDown;
        ax.Maximum = ax.Minimum + range;
    }
    

    您需要添加一些检查以防止向左或向右拖得太远..

    请注意,代码假定您已设置MinimumMaximum

    另外请注意,您需要控制 x 轴标签的格式,这样它们就不会因为有很多小数位而使图表跳来跳去。

    或者,根据您的数据,您可能希望将步长设置为某个值的倍数,适合您的时间间隔,或者在我的情况下简单地设置为 ints

    ax.Minimum -= (int)(xv - mDown) ;
    

    如果您需要让滚动条可见,您仍然可以使用上面的代码;但是你需要替换这个

    ax.Minimum -= (int)(xv - mDown);
    ax.Maximum = ax.Minimum + range;
    

    通过这个:

    double oldPos = ax.ScaleView.Position;
    ax.ScaleView.Position -= (xv - mDown);
    

    但是这确实会干扰正常的scolling。您可以插入检查以确保您没有像这样点击滚动条:

    RectangleF ipar = InnerPlotPositionClientRectangle(chart1, chart1.ChartAreas[0]);
    if (ipar.Contains(e.Location))
    {
      ..
      ..
    

    ..但它仍然在这里起作用。所以或者似乎效果最好。

    InnerPlotPositionClientRectangle 定义为 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      相关资源
      最近更新 更多