4

我在我的 WindowsForms 应用程序中使用 MS Chart,我希望在图表上显示很多不同的标记。原则上,它是通过指定MarkerImageforSeries或来完成的DataPoint。问题是该MarkerImage属性是字符串类型,没有关于它的使用文档。根据 MS Chart 示例,它是图像文件的路径。

我设法通过将图像放入项目/图像文件夹中,为它们指定“复制到输出目录”,然后series.MarkerImage = "images/image.bmp";在代码中使用来使其工作。它原则上可以工作,但在运行时,当第一次在图表上显示标记图像时,应用程序会冻结一段时间。我认为这是因为加载新文件的磁盘访问时间。每次新图像首次出现在屏幕上时都会发生这种情况,这使得应用程序在所有图像都被缓存之前真的没有响应。

我正在寻找的是一些解决方案来改善这一点。充其量我宁愿将所有图像存储为嵌入式资源,这比使用应用程序发送额外的图像文件夹要好得多。根据(具有类似含义)的文档,该字符串实际上是一个 URL。LegendCell.Image我发现可以使用 ASP.NET 应用程序获取嵌入式资源的 URL Page.ClientScript.GetWebResourceUrl,但我的应用程序如果只是普通的 WindowsForms。是否可以在 Windows 窗体中为嵌入的资源获取某种 URL?

我已经在考虑实现我自己的 Series 或 DataPoint 后代来处理资源引用,但似乎不是正确的方法,因为我看不到与我可以覆盖的 Series 的实际渲染相关的任何内容......

我想到的另一个解决方案是在应用程序启动时自己预加载所有图像文件,但这似乎是一个 hack。如果我想将标记与单独的程序集 (.dll) 一起提供怎么办?

更新。我试过了:

  • 使用 File.ReadAllBytes 预加载图像。不会加速任何事情。
  • 使用数据 URI。失败并出现文本“不支持给定路径的格式”的异常。
4

1 回答 1

1

即使对您来说可能为时已晚,但这个答案可能会帮助像我这样今天遇到类似问题的人。

MSChart 控件提供了一个图像属性,它是命名图像的集合。这些图像是唯一标识符和可以从您的资源加载的图像的组合:

  1. 如果尚未完成 - 创建一个资源文件并将其添加到您的项目中
  2. 结合唯一标识符(例如 MyImage)将图像添加到该文件。确保将要嵌入的图像的持久性属性设置为“嵌入 .resx”
  3. 在您的代码中定义您添加到 Chart.Images 集合的 NamedImages。

    NamedImage namedImage1 = new NamedImage(" UniqueIdentifier ", Resources.MyImage); Chart.Images.Add(namedImage1);

在您的图表中,您现在可以在通常需要图标路径的地方使用UniqueIdentifier 。

这可以防止从磁盘加载图像,并且可能会加速您的应用程序,因为图像被缓存为资源。

此致

于 2015-02-23T14:58:26.860 回答