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

标签 c# charts annotations mschart

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

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

到目前为止,我尝试的是创建一个注释并将其放置在 AnchorX/Y 上,将所有允许标志设置为 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/

相关文章:

c# - IIS MIME 类型的元数据库路径

c# - 如何将 MEF(托管可扩展性框架)配置为仅加载已签名的程序集

java - 使用 Apache POI 在 Excel 中创建条形图

javascript - chart.js 线图 : Fill area above line as opposed to below and to the right

通过带注释的查询进行 Django 聚合

c# - 连接两个 List<T>,其中每个列表中的字段值相等

charts - 将 Tradingview 主题颜色更改为深黑色

java - Java 基类的 Hibernate 注解

java - Spring框架注解问题

c# - 将上下文菜单从 App.xaml 附加到 Setter 值