【问题标题】:Freezing a bitmap image in a IValueConverter在 IValueConverter 中冻结位图图像
【发布时间】:2014-04-15 16:13:39
【问题描述】:

我有一个使用位图转换器的应用程序。转换器将在应用执行期间处理成百上千张图片。

轻微扭曲:如果转换器抛出异常(出于某种原因),我需要转换器返回一个通用错误图像(例如红色“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();
    }

观察到构造函数冻结了一个对象两次,这会引发一个被冻结的对象不能被冻结的异常。否则代码按预期工作。为了让问题更清楚,这里对两个冻结进行了编码,我知道必须删除一个。

需要删除对 Freeze 的一个(或可能两个)调用。我已经尝试了这两种选择,但无法检测到差异。我想在开始批量测试之前得到答案(如果有的话)。应该删除哪个冻结?或两者?

【问题讨论】:

  • 你在同一个对象实例上调用 Freeze 两次,所以没关系...
  • 不管怎样,你为什么在 ErrorBitmapImage 上调用 Freeze,因为你已经在 bi 上调用了它,这是同一个对象?
  • @ThomasLevesque,问题已编辑。
  • 我不确定您更改了什么,但我的评论仍然有效...您删除哪个无关紧要,调用完全相同。我会删除第二个,因为在将 bi 分配给 ErrorBitmapImage 之前完全初始化 bi 更有意义,但它实际上并没有改变任何东西。
  • 好,需要冻结吗?

标签: c# wpf bitmap static ivalueconverter


【解决方案1】:

冻结不会像您的情况那样超时更改的资源是个好主意。这些可以使一些资源操作更快。但是,这些 Freeze 调用之间没有区别。

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 2018-11-08
    • 2013-10-22
    • 2018-05-24
    • 2018-11-23
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多