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

C# 改进MS图表控件的自定义标记图像性能,c#,mschart,microsoft-chart-controls,C#,Mschart,Microsoft Chart Controls,我在WindowsForms应用程序中使用MS Chart,我希望在图表上显示许多不同的标记。原则上,它是通过为系列或数据点指定一个标记图像来完成的。问题在于MarkerImage属性是字符串类型,其用法为。根据MS图表示例,它是图像文件的路径 我通过将图像放入project/images文件夹,为它们指定“复制到输出目录”,然后使用series.MarkerImage=“images/image.bmp”,成功地实现了这一点在代码中。它在原理上可以工作,但在运行时,当第一次在图表上显示标记图像

我在WindowsForms应用程序中使用MS Chart,我希望在图表上显示许多不同的标记。原则上,它是通过为
系列
数据点
指定一个
标记图像
来完成的。问题在于
MarkerImage
属性是字符串类型,其用法为。根据MS图表示例,它是图像文件的路径

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

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

我已经在考虑实现我自己的系列或数据点子代来处理资源引用,但这似乎不是一个正确的方法,因为我看不到任何与系列的实际渲染相关的、我可以覆盖的内容

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

更新。我尝试了:

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

尽管对你来说可能太晚了,但这个答案可能会帮助像我这样的人,他们现在也有类似的问题

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

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

    NamedImage namedImage1=新的NamedImage(“UniqueIdentifier”,Resources.MyImage); Chart.Images.Add(namedImage1)

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

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


    最诚挚的问候

    谢谢你的回答,但我现在无法检查它是否真的有效。我正在做的项目太过时了。我不明白你怎么设置MarkerImage?如果我尝试使用
    seriesWind.Points[cnt].MarkerImage=“UniqueIdentifier”
    它表示此资源已定义。我仍在寻找解决方案。