为什么 CroppedBitmap 会产生不可见的图像?

Why does CroppedBitmap result in an invisible image?

我正在尝试使用 CroppedBitmap 在 WPF 图像元素上显示 PNG 文件的一部分。

作为测试,我有以下代码:

BitmapImage StandardTilesetImage = new BitmapImage();
StandardTilesetImage.BeginInit();
StandardTilesetImage.CacheOption = BitmapCacheOption.OnLoad;
StandardTilesetImage.UriSource = new Uri(pngFilePath, UriKind.Relative);
StandardTilesetImage.EndInit();

// TestImage is an Image object defined in XAML
TestImage.Source = StandardTilesetImage;

这会产生预期的结果 - 图像正确显示:

作为参考,pngFilePath 是一个指向绝对位置 (c:/etc/etc/StandardTilesetIcons.png) 的字符串,它是一个 512x512 PNG:

如果我修改上面的代码以裁剪一部分 PNG(例如绘制左上角的 64x64 区域),则 TestImage 将不再显示任何内容。

BitmapImage StandardTilesetImage = new BitmapImage();
StandardTilesetImage.BeginInit();
StandardTilesetImage.CacheOption = BitmapCacheOption.OnLoad;
StandardTilesetImage.UriSource = new Uri(pngFilePath, UriKind.Relative);
StandardTilesetImage.EndInit();

CroppedBitmap croppedBitmap = new CroppedBitmap();
croppedBitmap.SourceRect = new Int32Rect(0,0,64, 64);
croppedBitmap.Source = StandardTilesetImage;
TestImage.Source = croppedBitmap;

我希望在我的 TestImage 对象中看到一部分 PNG。为什么什么都没有显示?

和BitmapImage一样,CroppedBitmap实现了ISupportInitialize接口,这意味着当你通过默认构造函数创建一个实例时,你必须先调用BeginInit()EndInit()方法并在设置其任何属性后。

或者,使用适当的构造函数和 类:

提供的参数
BitmapImage standardTilesetImage = new BitmapImage(
    new Uri(pngFilePath, UriKind.RelativeOrAbsolute));

CroppedBitmap croppedBitmap = new CroppedBitmap(
    standardTilesetImage, new Int32Rect(0,0,64, 64));

TestImage.Source = croppedBitmap;