如何在运行中创建注释?如何使用Annotation.BeginPlacement()
启用最终用户展示位置?我试图以多种方式做到这一点,但无法让它发挥作用。它应该在调用BeginPlacement()之后实时呈现。
关于这个主题的文档几乎没有 - 而且大部分都没有 - 所以我无法找到任何帮助解决这个问题。
到目前为止我尝试过的是创建一个注释并将其放置在AnchorX / Y中,将所有Allow-flags设置为true并在鼠标移动时调用BeginPlacement(),但在放置时也看不到注释。它会相应地进入它的位置吗?例如,LineAnnotation从正确的位置开始,但不会在我离开的位置结束。当我移动它以便从我的ChartAreas {0,0}开始时,它将达到终点。
我想知道的是,何时以及如何使用这些工具?我想要做的是让用户在图表上绘制注释并在分析图表时用作工具。
答案 0 :(得分:2)
您需要计算正确的位置。请记住,MouseMove不会为您提供位置(百分比)或值(数据),而是像素。您可以使用各种轴功能对它们进行变换。正式地说,他们只在xxxPaint事件中工作,但在鼠标事件期间,它们也可以正常工作。
更新:有两种方法可以进行锚定:
以下是第一类的例子:
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)