如何创建上的运行的注释,你如何让最终用户位置与Annotation.BeginPlacement()
?我试着这样做多种方式,但不能让它的工作。它应使自己在实时BeginPlacement()被调用后。
关于这个问题的单证是几乎没有 - 而且大多没有 - 所以我没能找到这个问题的任何帮助。
我到目前为止已经试过,是创建一个注释,并用AnchorX / Y放置,都允许 - 标志设置为true,并呼吁BeginPlacement(当鼠标移动),但无法看到注释,同时将它也不会去在它的相应位置。例如,LineAnnotation开始在正确的位置,但并没有结束,我离开它。当我这样从我的ChartAreas {0,0}开始移动,它会撞到终点。
我想知道的,是何时以及如何使用可用这些工具?我所要做的,就是让用户画一个图上的注释和工具分析图表时使用。
你需要计算合适的岗位。请记住,鼠标移动不会给你位置(百分比)或值(数据),但像素。您可以使用各种轴功能改造他们。据官方统计,他们只在xxxPaint活动中起作用,但在鼠标事件他们也工作得很好。
更新:有两种方法可以做到锚固:
这里是第1类的一个示例:
LineAnnotation laNew = null;
private void chart1_MouseDown(object sender, MouseEventArgs e)
{
if (cbx_drawAnnotation.Checked)
{
Axis ax = chart1.ChartAreas[0].AxisX;
Axis ay = chart1.ChartAreas[0].AxisY;
laNew = new LineAnnotation();
chart1.Annotations.Add(laNew);
double vx = ax.ValueToPosition(ax.PixelPositionToValue(e.X));
double vy = ay.ValueToPosition(ay.PixelPositionToValue(e.Y));
laNew.X = vx;
laNew.Y = vy;
}
}
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button.HasFlag(MouseButtons.Left) && cbx_drawAnnotation.Checked)
{
Axis ax = chart1.ChartAreas[0].AxisX;
Axis ay = chart1.ChartAreas[0].AxisY;
double vx = ax.ValueToPosition(ax.PixelPositionToValue(e.X))- laNew.X;
double vy = ay.ValueToPosition(ay.PixelPositionToValue(e.Y)) - laNew.Y;
laNew.Width = Math.Min(100, vx);
laNew.Height = Math.Min(100, vy);
laNew.LineColor = rb_green.Checked ? Color.Green : Color.Red;
laNew.AllowMoving = true; // optional
}
}
除非你需要重新调节轴以某种方式,如改变轴最小值和/或最大值这工作得很好。
首先,我们需要对有关向Annotation
的Axes
并设置IsSizeAlwaysRelative
到false
。然后,我们可以计算出锚和大小值:
private void chart1_MouseDown(object sender, MouseEventArgs e)
{
if (cbx_drawAnnotation.Checked)
{
Axis ax = chart1.ChartAreas[0].AxisX;
Axis ay = chart1.ChartAreas[0].AxisY;
laNew = new LineAnnotation();
chart1.Annotations.Add(laNew);
laNew.IsSizeAlwaysRelative = false;
laNew.AxisX = ax;
laNew.AxisY = ay;
laNew.AnchorX = ax.PixelPositionToValue(e.X);
laNew.AnchorY = ay.PixelPositionToValue(e.Y);
laNew.LineColor = rb_green.Checked ? Color.Green : Color.Red;
laNew.AllowMoving = true;
}
}
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button.HasFlag(MouseButtons.Left) && cbx_drawAnnotation.Checked)
{
Axis ax = chart1.ChartAreas[0].AxisX;
Axis ay = chart1.ChartAreas[0].AxisY;
laNew.Width = ax.PixelPositionToValue(e.X) - laNew.AnchorX; // values
laNew.Height = ay.PixelPositionToValue(e.Y) - laNew.AnchorY;
}
}
注意:我怎么现在可以扩展最大,也仍然调整图表和注释留在数据点..:
更新:要限制行至ChartArea
它添加到在MouseDown
事件的定义:
laNew.ClipToChartArea = chart1.ChartAreas[0].Name;
为了防止异常离开图表,它添加到在MouseMove
条件..:
.. && chart1.ClientRectangle.Contains(e.Location)