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

时间:2012-12-09 08:26:27

标签: c# mschart microsoft-chart-controls

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

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

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

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

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

更新。我试过了:

  • 使用File.ReadAllBytes预加载图像。不加速任何事情。
  • 使用documentation。文本异常失败“不支持给定路径的格式。”

1 个答案:

答案 0 :(得分:1)

尽管对你来说可能为时已晚,但这个答案可能会帮助像我这样的人,他们会在同一天遇到类似的问题。

MSChart Control提供了一个Images-Property,它是NamedImages的集合。这些图像是唯一标识符和可以从您的资源加载的图像的组合:

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

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

  4. 在图表中,您现在可以使用 UniqueIdentifier ,其中通常会显示图标的路径。

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

    最好的问候