我是WPF的新手,我正在尝试使用Controls.Image。当表单扩展时,我将它设置为拉伸。我试图在运行时生成Drawing.Bitmap以显示在WPF中的Controls.Image。当我生成Drawing.Bitmap时,我只想创建一个与屏幕上的Image控件一样大的(不要浪费cpu周期)。要创建图像,我有以下代码。 Bitmap bImage = new Bitmap((int)imgInput.Width, (int)imgInput.Height);
imgInput是Controls.Image,bImage显然是Drawing.Bitmap。但是imgInput.Width和Height在运行时显示为0,尽管它们绝对不是在设计时。如果我不尝试动态拉伸图像以使用窗口展开,则没有按预期显示的问题。那么我该如何实际获得图像呢。还有人比在内存中创建Drawing.Bitmap并将其转换为WPF的ImageSource有更好的方法吗?我没有从URI或类似的东西加载图像,我必须在内存中创建它。
我通过以下代码绑定图像
imgInput.Source = loadBitmap(bImage);
}
[DllImport("gdi32")]
static extern int DeleteObject(IntPtr o);
public static BitmapSource loadBitmap(System.Drawing.Bitmap source)
{
BitmapSource bs = null;
IntPtr ip = source.GetHbitmap();
try
{
bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(ip,
IntPtr.Zero, Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
finally
{
DeleteObject(ip);
}
return bs;
}
答案 0 :(得分:3)
从位图创建图像看起来不错。
XAML图像将根据位图本身的宽度/高度以及“可用”空间来重新调整大小。 WPF使用双通道布局系统 - 在第一轮中,每个控件被询问它需要多少空间,在第二轮中每个控件被分配一个宽度/高度。
在结合的位图,如果没有你的图像控制的祖先有一个固定/最大宽度无法检索图像的高度,仅仅是因为没有设置呢。
的一种方法将被设定基于通过结合一个祖先的图像的宽度/高度,再次,这将需要在容器上的一些组的宽度/高度。
网格容器的示例:
<Image Source="sample.png"
Width="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Grid}},Path=ActualWidth}"
Height="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Grid}},Path=ActualHeight}" />
另外要仔细选择你的容器 - 一个StackPanel
,即总是与它的孩子成长(垂直如果方向是水平的,反之亦然),除非你指定一个固定的或最大宽度/高度。其他容器的行为也不同,即UniformGrid
会使所有子容器的大小相等。我会尝试一个只有一行的Grid。
答案 1 :(得分:0)
要获取Height
的{{1}}和Width
,您需要将代码更改为
Source
Bitmap bImage = new Bitmap((int)imgInput.Source.Width, (int)imgInput.Source.Height);
和imgInput.Width
给出控件的高度和宽度,
imgInput.Height
和imgInput.Source.Width
给出了来源的高度和宽度