gpt4 book ai didi

c# - 如何让用户在 MSChart 上创建注释?

转载 作者:行者123 更新时间:2023-11-30 23:20:04 24 4
gpt4 key购买 nike

如何在运行时创建注释以及如何使用 Annotation.BeginPlacement() 启用最终用户放置?我试过以多种方式做到这一点,但无法让它发挥作用。在调用 BeginPlacement() 后,它应该实时呈现自己。

关于这个主题的文档很少甚至没有——而且几乎没有——所以我无法找到解决这个问题的任何帮助。

到目前为止,我尝试过的是创建一个注释并使用 AnchorX/Y 放置它,将所有 Allow- 标志设置为 true 并在鼠标移动时调用 BeginPlacement(),但在放置时看不到注释,也看不到注释它会相应地进入它的位置吗?例如,LineAnnotation 从正确的位置开始,但不会在我离开它的地方结束。当我移动它时,它从我的 ChartAreas {0,0} 开始,它将到达终点。

我想知道的是,何时以及如何使用这些工具?我想做的是让用户在图表上绘制注释并在分析图表时用作工具。

最佳答案

您需要计算正确的位置。请记住,MouseMove 不会为您提供位置(百分比)或值(数据),而是像素。您可以使用各种轴函数来转换它们。正式它们只在 xxxPaint 事件中工作,但在鼠标事件中它们也能正常工作。

更新:锚定有两种方式:

  • 使用“位置”(即百分比)或“值”(即数据值)。

这是第一种的例子:

enter image description here

    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
}
}

这很好用,除非您需要以某种方式重新缩放轴,例如更改轴的最小值和/或最大值。

  • 如果您需要锚定数据值

首先,我们需要将 AnnotationAxes 相关联,并将 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;
}
}

请注意我现在如何缩放最大值并仍然调整图表的大小,并且注释保留在数据点中..:

enter image description here

更新:要将行限制在 ChartArea 中,将其添加到 MouseDown 事件的定义中:

 laNew.ClipToChartArea = chart1.ChartAreas[0].Name;

要防止异常离开图表,请将其添加到 MouseMove.. 中的条件中:

.. && chart1.ClientRectangle.Contains(e.Location)

关于c# - 如何让用户在 MSChart 上创建注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39912060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com