有什么方法可以点击MSChart并向左/向右拖动,以便向右/向左滚动图表。 我们的想法是拖动图表而不是拖动图表的滚动条。 我不是简单地使用滚动条的原因是因为我被要求添加此功能(老板和他们的要求..)。 顺便说一下,我正在使用C#和winforms。 希望我足够清楚。 谢谢!
答案 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
移动和调整Minimum
和Maximum
的距离:
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;
}
您需要添加一些检查以防止向左或向右拖动太多..
请注意,代码假定您已设置Minimum
和Maximum
!
另请注意,您需要控制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。