2014-05-21 182 views
0

我想加载一个图像并将其放入视图框。 图像显示正确,但是,当我要得到它的宽度和高度时,它都是NaN。为什么图像大小是NaN(wpf)以及如何通过鼠标滚轮调整大小?

这是我的图片加载代码:

Image img = new Image(); 
img.Source = (ImageSource)new ImageSourceConverter().ConvertFromString("1.png"); 

Viewbox vb = new Viewbox(); 

vb.Width = img.Width; 
vb.Height = img.Height; 

vb.Child = img; 

cnv.Children.Add(vb); 

我想要得到的图像的宽度和高度,所以我可以调整它的大小(通过视框中调整大小)后在应用程序内部的原因。

任何想法如何获得图像的维度?

这是我要如何调整其大小(通过鼠标滚轮)

private void cnv_MouseWheel(object sender, MouseWheelEventArgs e) 
    { 
     if (vb != null) 
     { 
      vb.Width += Mouse.MouseWheelDeltaForOneLine; 
      vb.Height += Mouse.MouseWheelDeltaForOneLine; 
     } 
    } 

并返回错误,并表示vb.Width不是有效的值。

问题,总结这件事:

  1. 如何获得在WPF图像的宽度/高度?
  2. 如何通过鼠标滚轮调整视图框的大小(这也会导致图像大小调整)?例如,如果我向上滚动轮,宽度和高度加1,如果我向下滚动轮,宽度和高度由1

降低谢谢

P.S. Viewbox vb;Image img;是一个全局变量,我只是缩短了脚本。 P.S.S. 我知道如果视图框的宽度和高度由一个数字初始化,可以说100和100,它会工作,我只是想知道如何获得图像的原始大小。

编辑: 调整大小可以通过检测是否它上下滚动时通过检测e.Delta > 0e.Delta < 0 (来源:http://social.msdn.microsoft.com/Forums/vstudio/en-US/170c4fd0-1441-4d83-903d-594af75f8fb4/detect-mouse-scroll)来实现

+0

尝试使用'ActualWidth'和'ActualHeight'属性,而不是。 – Sheridan

+0

它在宽度和高度而不是NaN上都返回0。 –

+0

[msdn](http://msdn.microsoft.com/zh-cn/library/system.windows.controls.image.source.aspx)上的用法不同。也许你必须使用'BitmapImage'(而不是'Image')来获得大小。 – Sinatr

回答

2

它好像在Image对象没有完全在该阶段加载。我相信您可以改用ImageSource classWidthHeight属性。这个阶段应该完全加载。

ImageSource.Width Property
ImageSource.Height Property

对其他用户,你也可以有可能找到,而不是你从Image类(从FrameworkElement类继承)的ActualWidthActualHeight性能所需的值更常见的WidthHeight属性。

FrameworkElement.ActualHeight Property
FrameworkElement.ActualWidth Property

+0

您能详细说明“完全加载”是什么意思吗?是不是,如果图像成功显示,那么它是“完全加载”? –

+0

当您设置一个'Image.Source'属性时,框架必须完成一些工作来将实际源加载到内存中并使其可用于显示。请参阅[动态加载图像在WPF]的答案(http://stackoverflow.com/questions/569561/dynamic-loading-of-images-in-wpf)问题的一个例子,我在说什么。我想不出任何其他原因,你没有得到尺寸值,除了你的图像实际上没有尺寸。 – Sheridan

+0

嗯。所以,有一个“延迟”,因为他们得到处理,让说一个不同的线程? –

0

只能在像素,而你的WPF控件在与设备无关的像素为单位,所以你将不得不作出从像素与设备无关的像素转换中获得的原始图象的尺寸和必要时返回。

也就是说,要获取png文件的宽度和高度,可以将其加载到BitmapImage而不是Image中,并查询BitmapImage的PixelWidth和PixelHeight属性。

再一次,请注意,这是您的代码中将要处理像素的唯一位置,所有宽度和高度属性(包括ActualWidth和ActualHeight,仅在完全呈现控件后才设置)被测量在设备独立像素中。这可能会引起误解,因为在很多情况下,这只是一种1:1的转换,但不能保证是这种情况。

更多信息可以在这里找到:http://msdn.microsoft.com/en-us/library/windows/desktop/ff684173%28v=vs.85%29.aspx

相关问题