我的应用程序在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>
它也不起作用。 Width
和Height
设置完全被忽略。 Image
将始终与当前来源一样大。此外,我需要设置一个初始源,以便Image可以有任何大小。
所以我需要的是一种让XAML在Grid布局中布局固定空间的方法,然后告诉我它有多大的尺寸,以便我可以生成该位图图像并以某种方式将其带到屏幕上。只要该布局空间改变其大小,就必须生成并显示新图像。
这可以用WPF完成吗?
使用HTML / CSS我只需使用空的<div>
元素(让我们在WPF中说出<Grid>
),添加调整大小事件处理程序,查询当前大小,并将生成的位图作为其背景。但是你不能只在WPF中的任何地方传播图像,你需要一个Image控件。但WPF的图像控制对于这种简单的方法来说太顽固了。
此外,整个事情都在<DataTemplate>
内,所以我无法从代码隐藏中访问命名元素。我只能通过事件处理程序的sender
参数访问它们。我需要访问他们的DataContext
,因为在生成的图片中使用了源数据。
答案 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);
}