【发布时间】: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