【发布时间】:2010-05-21 10:06:44
【问题描述】:
我最近一直在使用 WPF 制作图表的项目。在此,我必须在符号旁边显示文本,以说明与文本相关的信息。
为了绘制符号,我最初使用了一些我制作的 png 图像。在我的图表中,这些图像看起来很模糊,放大后看起来更糟。为了改进这一点,我决定使用矢量而不是光栅图像格式。以下是我用来从文件路径获取光栅图像的方法:
protected Image GetSymbolImage(string symbolPath, int symbolHeight)
{
Image symbol = new Image();
symbol.Height = symbolHeight;
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.UriSource = new Uri(symbolPath);
bitmapImage.DecodePixelHeight = symbolHeight;
bitmapImage.EndInit();
symbol.Source = bitmapImage;
return symbol;
}
很遗憾,它不能识别矢量图像格式。因此,我使用了类似以下的方法,其中“路径”是 .xaml 格式的矢量图像的文件路径:
public static Canvas LoadXamlCanvas(string path)
{
//if a file exists at the specified path
if (File.Exists(path))
{
//store the text in the file
string text = File.ReadAllText(path);
//produce a canvas from the text
StringReader stringReader = new StringReader(text);
XmlReader xmlReader = XmlReader.Create(stringReader);
Canvas c = (Canvas)XamlReader.Load(xmlReader);
//return the canvas
return c;
}
return null;
}
这很有效,但在重复调用时会严重影响性能。
我发现文本到画布转换所需的逻辑(见上文)是性能问题的主要原因,因此嵌入 .xaml 图像并不能单独解决性能问题。
我尝试仅在应用程序的初始加载时使用此方法,并将生成的画布存储在字典中,以后可以更快地访问,但后来我意识到在字典中使用画布时,我必须制作它们的副本.我在网上找到的所有与制作副本相关的逻辑都使用了 XamlWriter 和 XamlReader,这又会带来性能问题。
我使用的解决方案是将每个 .xaml 图像的内容复制到其自己的用户控件中,然后在适当的情况下使用这些用户控件。这意味着我现在显示矢量图形并且性能要好得多。
但是,这个解决方案对我来说似乎很笨拙。我是 WPF 的新手,想知道是否有一些内置方式可以在整个应用程序中存储和重用 xaml?
对于这个问题的长度表示歉意。我认为记录我的尝试可能会对遇到类似问题的人有所帮助。
谢谢。
【问题讨论】: