为什么图像大小为NaN(wpf),如何通过鼠标滚轮调整大小?

3

我希望加载一张图片并将其放入视口中。图片正确显示,但是当我想获取它的宽度和高度时,它们都是NaN。

这是我的图片加载代码:

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. 我知道如果Viewbox的宽度和高度初始化为一个数字,比如100和100,它会起作用,我只想知道如何获取图像的原始大小。

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


尝试使用 ActualWidthActualHeight 属性。 - Sheridan
它返回的是0而不是NaN,无论是宽度还是高度。 - Moses Aprico
msdn 上使用方式不同。也许你必须使用 BitmapImage(而不仅仅是 Image)来获取大小。 - Sinatr
2个回答

5

你能详细解释一下“完全加载”是什么意思吗?如果图片成功显示,那不就是“完全加载”了吗? - Moses Aprico
1
当您设置Image.Source属性时,框架必须完成一些工作,将实际源加载到内存中并使其可供显示。请参见WPF中图像的动态加载问题的答案,以了解我所说的内容的示例。我想不出您无法获得尺寸值的其他原因,除非您的图像实际上没有尺寸。 - Sheridan
嗯,所以出现了“延迟”,是因为它们被处理在不同的线程上了? - Moses Aprico
2
本质上是的。在WPF中,使用Width和Height属性的方式并不是推荐的做法。对于位图,最简单的方法可能是查看png文件的实际尺寸(请参见下面的答案)。Width和Height包含所需的宽度和高度,或者如果未设置,则为double.NaN。ActualWidth和ActualHeight仅在UI呈现后才有效,这并不是在设置Source属性后立即发生的情况。 - Markus

0

图片的原始尺寸只能以像素为单位获取,而您的WPF控件是以设备无关像素为度量单位,因此您需要在必要时将像素转换为设备无关像素并进行相应的转换。

话虽如此,要获得PNG文件的宽度和高度,您可以将其加载到BitmapImage中,而不是Image,并查询BitmapImage的PixelWidth和PixelHeight属性。

同样,请注意,这是您代码中唯一需要处理像素的地方,所有的Width和Height属性(包括ActualWidth和ActualHeight,在控件完全呈现后才设置)都以设备无关像素为单位进行测量。这可能会误导您,因为在许多情况下,这恰好是1:1的转换,但这并不保证是这种情况。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接