在WPF中手动布局图像

时间:2015-05-19 10:16:57

标签: wpf

我的应用程序在XAML窗口中有一些空间,必须显示图像。只要可用空间的大小发生变化,就会生成图像。这还没有完成。

我可以放置Image控件,但它会缩放其内容(禁止!)或自动调整大小到当前图像(永远不会告诉我可用空间)。

我已尝试过这个:

<Grid Name="ImageContainer" Grid.Row="1">
    <Image
        Width="{Binding ActualWidth, ElementName=ImageContainer}"
        Height="{Binding ActualHeight, ElementName=ImageContainer}"
        HorizontalAlignment="Center"
        VerticalAlignment="Center"
        Source="/Images/dummy_filler_icon.png"
        Stretch="None"
        SizeChanged="GraphImage_SizeChanged"/>
</Grid>

它也不起作用。 WidthHeight设置完全被忽略。 Image将始终与当前来源一样大。此外,我需要设置一个初始源,以便Image可以有任何大小。

所以我需要的是一种让XAML在Grid布局中布局固定空间的方法,然后告诉我它有多大的尺寸,以便我可以生成该位图图像并以某种方式将其带到屏幕上。只要该布局空间改变其大小,就必须生成并显示新图像。

这可以用WPF完成吗?

使用HTML / CSS我只需使用空的<div>元素(让我们在WPF中说出<Grid>),添加调整大小事件处理程序,查询当前大小,并将生成的位图作为其背景。但是你不能只在WPF中的任何地方传播图像,你需要一个Image控件。但WPF的图像控制对于这种简单的方法来说太顽固了。

此外,整个事情都在<DataTemplate>内,所以我无法从代码隐藏中访问命名元素。我只能通过事件处理程序的sender参数访问它们。我需要访问他们的DataContext,因为在生成的图片中使用了源数据。

1 个答案:

答案 0 :(得分:2)

您可以使用Rectangle而不是Image控件,并在SizeChanged处理程序中将其Fill属性设置为ImageBrush,并使用适当大小的ImageSource:

<Grid>
    <Rectangle SizeChanged="GraphImage_SizeChanged"/>
</Grid>

代码背后:

private void GraphImage_SizeChanged(object sender, SizeChangedEventArgs e)
{
    // create a bitmap with appropriate size
    var bitmap = new WriteableBitmap(
        (int)e.NewSize.Width, (int)e.NewSize.Height, 96, 96, PixelFormats.Rgb24, null);
    ...

    var rectangle = (Rectangle)sender;
    rectangle.Fill = new ImageBrush(bitmap);
}