如何在运行中创建注释以及如何使用 Annotation.BeginPlacement()
启用最终用户放置?我尝试以多种方式做到这一点,但无法使其发挥作用。在调用 BeginPlacement() 后,它应该实时呈现自身。
关于这个主题的文档很少甚至没有 - 而且大部分都没有 - 所以我无法找到解决这个问题的任何帮助。
到目前为止,我尝试的是创建一个注释并将其放置在 AnchorX/Y 上,将所有允许标志设置为 true 并在鼠标移动时调用 BeginPlacement(),但在放置注释时看不到注释,也看不到注释。它会相应地就位吗?例如,LineAnnotation 从正确的位置开始,但不在我离开的位置结束。当我移动它使其从 ChartAreas {0,0} 开始时,它将到达终点。
我想知道何时以及如何使用这些工具?我想做的,是让用户在图表上绘制注释,并在分析图表时将其用作工具。
最佳答案
您需要计算正确的位置。请记住,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
。然后我们可以计算 anchor 和大小值:
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)
关于c# - 如何让用户在 MSChart 上创建注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39912060/