2014-06-20 43 views
0

我有一个Stretch属性设置为Uniform的Image类(System.Windows.Controls.Image)的对象。我知道图像控件的大小,当然还有源图像的大小,但我正在寻找一种简单的方法来获取可见图像的实际大小。从Image类获取实际图像大小的简单方法。

这将更容易通过示例来解释。我的图像控件大小绑定到主窗口大小,如果它的大小是1920 x 1080,并且源图像的大小是500 x 500,则会看到大小为1080 x 1080的图像。是否有一种简单的方法可以获得此大小?

+0

你试过['ActualHeight'(HTTP:// MSDN。 microsoft.com/en-us/library/system.windows.frameworkelement.actualheight(v=vs.110).aspx)和['ActualWidth'](http://msdn.microsoft.com/zh-cn/library/ system.windows.frameworkelement.actualwidth(v = vs.110).aspx)属性? – chridam

回答

1

您不应该将Image控件的大小绑定到窗口大小。相反,使用Grid作为容器。它会自动调整图像子元素的大小。然后ActualWidthActualHeight性能直接返回控制的实际尺寸:

<Grid> 
    <Image Source="..." SizeChanged="Image_SizeChanged"/> 
</Grid> 

在代码中获取的属性后面:

private void Image_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    var image = (Image)sender; 
    Trace.TraceInformation("Size = {0} x {1}", image.ActualWidth, image.ActualHeight); 
} 
+0

我会试试这个,但是我很担心,因为我不需要Image控件的大小,我需要可见图像的大小。这个解决方案是否会缩放图像控件,并且它是图像源来填充网格? – straku

+0

这正是Grid所做的。 – Clemens

+0

通过编写“绑定”我并不是说我将高度和宽度属性绑定到主窗口大小。在布局顶部有网格,图像位于其内部,垂直和水平对齐设置为拉伸。我不知道为什么我加载图像后得到ActualHeight = ActualWidth = 0.0。有任何想法吗? – straku

1

您需要计算比例因子。这将取决于图像尺寸和控件尺寸之间的关系。

首先,分别计算水平和垂直缩放因素:

double hscale = (double)image.Width/imageControl.Width; 
double vscale = (double)image.Height/imageControl.Height; 

所以,如果你通过hscale乘以图像的宽度,其结果必然是控制的宽度。现在

,因为要保持纵横比,你需要选择最小的两个是你的缩放系数:

double scaleFactor = Math.Min(hscale, vscale); 

然后你就可以计算图像,这将是大小显示:

displayedWidth = image.Width * scaleFactor; 
displayedHeight = image.Height * scaleFactor;