冻结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();
    }

请注意,构造函数冻结了一个对象两次,这引发了一个异常,即冻结的对象不能被冻结。否则,代码将按预期工作。这里对两个冻结进行了编码,以使问题更清楚,我知道其中一个必须删除。

需要删除对冻结的一个(或可能同时删除两个)调用。两种选择我都试过了,但没有发现区别。在开始批量测试之前,我想得到答案(如果有的话)。应该删除哪个冻结?还是两者兼而有之?

冻结IValueConverter中的位图图像

冻结不会像您的情况那样加班更改的资源是个好主意。这些可以使某些资源操作更快。然而,这些冻结呼叫之间没有区别。