MSChart拖动图表以滚动图表

时间:2016-06-16 07:26:12

标签: c# winforms charts mschart

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

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。

一个问题是你无法使用普通的缩放/滚动机制,因为它本身可以通过拖动图表来工作。

相反传递它并编写两个mouseevents并使用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);

然而,确实会干扰正常的诽谤。您可以插入检查以确保没有像这样点击滚动条:

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

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

InnerPlotPositionClientRectangle定义为here