【发布时间】:2016-06-16 07:26:12
【问题描述】:
有什么方法可以单击 MSChart 并将其向左/向右拖动,以便向右/向左滚动图表。 这个想法是拖动图表而不是拖动图表的滚动条。 我之所以不简单地使用滚动条是因为我被要求添加此功能(老板和他们的要求..)。 顺便说一句,我正在使用 C# 和 winforms。 希望我足够清楚。 谢谢!!
【问题讨论】:
标签: c# winforms charts mschart
有什么方法可以单击 MSChart 并将其向左/向右拖动,以便向右/向左滚动图表。 这个想法是拖动图表而不是拖动图表的滚动条。 我之所以不简单地使用滚动条是因为我被要求添加此功能(老板和他们的要求..)。 顺便说一句,我正在使用 C# 和 winforms。 希望我足够清楚。 谢谢!!
【问题讨论】:
标签: c# winforms charts mschart
是的,这是可能的。
一个问题是您不能使用正常的缩放/滚动机制,因为它本身可以通过拖动图表来工作。
而是通过它并编写两个鼠标事件并使用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);
但是这确实会干扰正常的scolling。您可以插入检查以确保您没有像这样点击滚动条:
RectangleF ipar = InnerPlotPositionClientRectangle(chart1, chart1.ChartAreas[0]);
if (ipar.Contains(e.Location))
{
..
..
..但它仍然在这里起作用。所以或者似乎效果最好。
InnerPlotPositionClientRectangle 定义为 here。
【讨论】: