2

我正在尝试在Image控件中显示图像的固定部分。SourceBitmapImage来自磁盘或 Web 资源,并且是异步加载的。

我尝试使用CroppedImage

<UserControl.Resources>
    <CroppedBitmap x:Key="croppedImage" Source="{Binding Image}" SourceRect="20 46 273 202"/>
</UserControl.Resources>
...
<Image x:Name="TemplateImage" Height="202" Width="273" HorizontalAlignment="Left" Source="{StaticResource croppedImage}"/>

这会XamlParseException在尝试创建CroppedBitmap.
我也在后面的代码中试过这个(C#)

new CroppedBitmap(Image, new System.Windows.Int32Rect(20, 46, 273, 202))

从网络资源加载时给我一个ArgumentException,说明该值超出预期范围。我想这是由于图像尚未加载,因此没有大小。

有没有办法做到这一点(不一定用 a CroppedImage),而不必预加载图像?

顺便说一句:将BitmapImage直接作为源提供给Image控件可以正常工作,但这当然不会进行裁剪。

4

2 回答 2

2

您可以使用带有 ImageBrush Fill 的 Rectangle 来代替 Image 控件,并根据需要设置 Viewbox:

<UserControl.Resources>
    <ImageBrush x:Key="croppedImage" ImageSource="{Binding Image}"
                ViewboxUnits="Absolute" Viewbox="20,46,273,202"/>
</UserControl.Resources>
...
<Rectangle Height="202" Width="273" Fill="{StaticResource croppedImage}"/>
于 2013-10-25T21:24:19.333 回答
0

您可以做的是创建一个只是空白位图的虚拟源:

var src = BitmapImage.Create(
                        500, // set to be big enough so it can be cropped
                        500, // set to be big enough so it can be cropped
                        96,
                        96,
                        System.Windows.Media.PixelFormats.Indexed1,
                        new BitmapPalette(new List<System.Windows.Media.Color> { System.Windows.Media.Colors.Transparent }),
                        new byte[] { 0, 0, 0, 0 },
                        1);

将绑定为 CroppedBitmap 源的 Image 属性设置为此虚拟对象。然后,当实际图像加载时,您只需将这个虚拟对象替换为真实图像。当您将Image属性设置为新源时,绑定系统应该负责更新它。

于 2013-10-25T21:12:21.097 回答