改进MS图表控件的自定义标记图像性能



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

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

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

我已经在考虑实现我自己的系列或DataPoint子代来处理资源引用,但这似乎不是一种正确的方式,因为我看不到任何与我可以覆盖的系列的实际呈现相关的内容。。。

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

更新我试过:

  • 使用文件预加载图像。ReadAllBytes。不会加快任何速度
  • 使用数据URI。失败,出现异常,文本为"不支持给定路径的格式">

尽管对你来说可能为时已晚,但这个答案可能会帮助像我这样现在有类似问题的人。

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

  1. 如果还没有完成-创建一个资源文件并将其添加到您的项目中
  2. 将图像与唯一标识符(例如MyImage)组合添加到该文件中。确保将要嵌入的图像的Persistence属性设置为"Embedded in.resx">
  3. 在代码中定义添加到图表中的NamedImages。图像采集。

    NamedImagenamedImage1=新的NamedImage(">UniqueIdentifier",Resources.MyImage);图表图像。添加(namedImage1);

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

这样可以防止从磁盘加载图像,并且可能会在图像作为资源缓存时加快应用程序的速度。

向致以最良好的问候

最新更新