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

2023-12-13

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

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

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

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


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

Update:有两种方法可以进行锚定:

  • 通过使用 '职位', 是。 “值”的百分比,即数据值。

这是第一类的例子:

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

除非您需要以某种方式重新调整轴的大小,例如更改轴的最小值和/或最大值,否则这种方法效果很好。

  • 如果您需要锚定数据值.

首先我们需要关联Annotation to the Axes并且还设置了IsSizeAlwaysRelative to 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;  
    }
}

请注意我现在如何可以缩放最大值,并且仍然可以调整图表的大小,并且注释与数据点保持一致......:

enter image description here

Update:将线路限制为ChartArea将其添加到定义中MouseDown event:

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

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

.. && chart1.ClientRectangle.Contains(e.Location)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让用户在 MSChart 上创建注释? 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • 在geom_point中为ggplot2中的负值和正值设置不同的颜色

    给定一个数据框如下 df lt data frame city c bj sh gz sz price c 12 7 5 6 pct c 2 3 5 4 4 stringsAsFactors FALSE Out city price pct
  • 新的 Ember 应用程序出现黑屏

    我是 ember 新手 正在做一个入门教程构建一个简单的应用程序 当我创建一个新应用程序并启动服务器时 我尝试访问本地主机页面 http 本地主机 4200 在我的浏览器中但页面是空白的 浏览器窗口标题是我的应用程序名称 但没有应有的 欢迎
  • 如何删除匹配的标签但保留 JQuery 内容

    我有这样的 HTML div div class a content1 div content 2 div class a b content 3 b div div 我想删除 class a 的 div 但保留它们的内容 我最初的尝试是
  • 使用合并排序计算反转[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我用Python编写了一个合并排序程序 它运行得很好 但我修改了它来计算所涉及的反转次数 现在它给了我一个错误 这是我的代码 def merge list left righ
  • 调用未定义函数 session_start()

    我正在尝试使用 php 启动会话 但总是收到此错误 Fatal error Call to undefined function session start in www test test php on line 2 我的代码 复制表格h
  • Selenium moveByOffset 不执行任何操作

    我在 Linux Xubuntu 13 10 上使用 Firefox 28 0 运行最新的 selenium 2 41 我试图让 FirefoxDriver 将鼠标移到页面上 在我的测试中 我使用了有线网页 它有很多悬停激活的菜单 但是mo
  • Java中的逻辑运算符优先级

    我对此并不满意 http docs oracle com javase specs jls se7 html jls 15 html jls 15 22 它明确规定了以下内容 如果操作数表达式没有副作用 则每个运算符都是可交换的 and 这
  • VB.net Excel.worksheet().cells().Value

    尝试在 Excel 工作表中写入信息 但有一些奇怪的问题 我在谷歌上查看了信息 但没有结果 所以请帮忙 我添加引用Microsoft excel 14 0对象库 并导入 Microsoft Office interop 我需要从特定单元格获
  • 我可以使用哪些方法通过 Spotify 应用程序进行地理定位?

    Spotify Apps API 不允许 HTML5 地理定位 显然记录的 Location api 调用不起作用 正在从文档中删除 我可以使用哪些方法来对用户进行地理定位 查找网站访问者地理位置的解决方案及其建议http freegeoi
  • 变换后的宽度/高度

    应用后如何检索宽度和高度属性transform rotate 45deg 比如 旋转后 11x11 的正方形变成 17x17 Chrome 结果 但 javascript 仍然返回原始宽度 高度 10x10 我如何获得这个 17x17 您可
  • Powershell Golf:下一个工作日

    如何使用 powershell 查找下一个工作日 好吧 我的手机允许我设置哪些日子是工作日 但 Windows NET 不允许 所以我假设是周一到周五 注意 由于问题包括 高尔夫 我正在打高尔夫球 即尝试为脚本使用尽可能少的字节 结果代码不
  • lapply 适用于数组还是单个元素?

    我对 lapply 是否适用于列表或向量有点困惑 请参阅下面的两个示例 这里 均值函数应用于数字数组 即 1 到 5 x list a 1 5 b rnorm 10 x a 1 1 2 3 4 5 b 1 0 57544290 0 5103
  • C 从管道块读取直到子进程终止

    父进程创建 N 个子进程 每个子进程都用 exec 替换自己 父进程和 exec 之间通过一系列管道进行通信 int pipelinefd N 2 The exec使用以下命令写入管道 char msg 50 sprintf msg tse
  • 让 Google Play Services 4.0.30 与 Android Studio 0.4.2 和 Gradle 0.7 配合使用

    使用 Android Studio 让 Google Play Services 运行的解决方案似乎并不缺乏 我已经尝试过其中的大多数 经过多次试验和多次错误后 我得出的结论是 为了使这些解决方案中的许多解决方案发挥作用 您必须像这些解决方
  • Python igraph:获取有向图中所有可能的路径

    我正在使用 igraph Python 希望获取有向图中两个节点之间的所有可能路径 我知道这个功能get all shortest paths 这是最短路径 但找不到通用路径 Update 我的主要目标是获取这些路径中的所有节点 以便我可以
  • Java 集的“包含任何”之类的东西?

    我有两套相同类型的 A 和 B 我必须查找 A 是否包含集合 B 中的任何元素 在不迭代集合的情况下做到这一点的最佳方法是什么 Set 库有contains object and containsAll collection 但不是cont
  • 将sequelize cli 与typescript 结合使用

    我正在尝试将sequelize 与typescript 一起使用 但不知道如何操作 我安装了一个名为sequelize cli typescript 的软件包 但它不适用于sequelize v6 我知道最好使用迁移来执行我的数据库 我怎样
  • 如何使用 JAXB 自定义 XML 导出

    出于测试目的 我使用 JAXB 从对象生成 XML 这工作正常 代码如下 package com mns mnsutilities jaxb model import java util List import javax xml bind
  • GIT - 合并后分支未关闭

    我们对使用 GIT 还很缺乏经验 实际上我们喜欢分支的想法 但不知何故 来自一个用户的所有合并都不会关闭分支 您可以在此处查看图片 http i54 tinypic com 297i14 png 有一条灰色和蓝色的线直接向前 即使在合并之后
  • 如何让用户在 MSChart 上创建注释?

    如何在运行中创建注释以及如何启用最终用户放置Annotation BeginPlacement 我尝试以多种方式做到这一点 但无法使其发挥作用 在调用 BeginPlacement 后 它应该实时呈现自身 关于这个主题的文档几乎没有 而且大