冻结IValueConverter中的位图图像
本文关键字:位图 图像 IValueConverter 冻结 | 更新日期: 2023-09-27 17:58:31
我有一个使用位图转换器的应用程序。转换器将在应用程序执行期间处理成百上千的图像。
轻微扭曲:如果转换器抛出异常(出于某种原因),我需要转换器返回一个通用错误图像(例如,红色的"x"),该图像将显示在图像本身的位置。这将向用户传达出问题。图像作为嵌入资源打包到程序集中。
我的策略是为转换器创建一个静态构造函数,如下所示。。。
private static readonly BitmapImage ErrorBitmapImage;
static ImageConverter()
{
var assembly = Assembly.GetCallingAssembly();
var name = assembly.GetManifestResourceNames().FirstOrDefault(q => q.Contains("MC900432546.PNG"));
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 30;
using (var stream = assembly.GetManifestResourceStream(name))
{
bi.StreamSource = stream;
}
bi.EndInit();
bi.Freeze();
ErrorBitmapImage = bi;
ErrorBitmapImage.Freeze();
}
请注意,构造函数冻结了一个对象两次,这引发了一个异常,即冻结的对象不能被冻结。否则,代码将按预期工作。这里对两个冻结进行了编码,以使问题更清楚,我知道其中一个必须删除。
需要删除对冻结的一个(或可能同时删除两个)调用。两种选择我都试过了,但没有发现区别。在开始批量测试之前,我想得到答案(如果有的话)。应该删除哪个冻结?还是两者兼而有之?
冻结不会像您的情况那样加班更改的资源是个好主意。这些可以使某些资源操作更快。然而,这些冻结呼叫之间没有区别。