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

C# 为什么图像大小为NaN(wpf)以及如何通过鼠标滚轮调整大小?,c#,wpf,image,canvas,viewbox,C#,Wpf,Image,Canvas,Viewbox,我想加载一个图像并将其放入一个视图框中。图像显示正确,但是,当我要得到它的宽度和高度时,它都是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.C

我想加载一个图像并将其放入一个视图框中。图像显示正确,但是,当我要得到它的宽度和高度时,它都是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);
我想要获取图像宽度和高度的原因是,我可以在应用程序内部稍后通过viewbox resize调整图像大小

你知道如何获得图像尺寸吗

这就是我将如何通过鼠标滚轮调整它的大小

    private void cnv_MouseWheel(object sender, MouseWheelEventArgs e)
    {
        if (vb != null)
        {
            vb.Width += Mouse.MouseWheelDeltaForOneLine;
            vb.Height += Mouse.MouseWheelDeltaForOneLine;
        }
    }
它返回错误并说vb.Width不是有效值

总结起来的问题:

如何获得wpf中的图像宽度/高度? 如何调整viewbox的大小,这也会导致通过鼠标滚轮调整图像大小?例如,如果向上滚动控制盘,则宽度和高度增加1,如果向下滚动控制盘,则宽度和高度减少1。 多谢各位

附加视口vb;图像img;是一个全局变量,我只是缩短了脚本。 另外,我知道如果Viewbox的宽度和高度由一个数字初始化,比如说100和100,它会工作,我只想知道如何获得图像的原始大小

编辑: 可以通过检测e.Delta>0或e.Delta<0来检测其是否向上或向下滚动来实现调整大小 来源:

图像对象在该阶段似乎没有完全加载。我相信您可以使用的宽度和高度属性。在这个阶段应该是满负荷的

对于其他用户,也可以从FrameworkElement类继承的Image类的ActualWidth和ActualHeight属性中找到所需的值,而不是更常见的宽度和高度属性

在该阶段,图像对象似乎没有完全加载。我相信您可以使用的宽度和高度属性。在这个阶段应该是满负荷的

对于其他用户,也可以从FrameworkElement类继承的Image类的ActualWidth和ActualHeight属性中找到所需的值,而不是更常见的宽度和高度属性


图像原始大小只能以像素为单位获得,而WPF控件是以设备无关像素为单位测量的,因此您必须从像素到设备无关像素进行转换,并在必要时进行转换

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

同样,请注意,这是代码中处理像素的唯一位置,所有宽度和高度属性(包括ActualWidth和ActualHeight)仅在控件完全渲染后设置,都是以设备无关的像素度量的。这可能会产生误导,因为在很多情况下,这恰好是1:1的转换,但不能保证是这样


更多信息可在此处找到:

图像原始大小只能以像素为单位获得,而WPF控件是以设备独立像素为单位测量的,因此您必须从像素到设备独立像素进行转换,并在必要时进行转换

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

同样,请注意,这是代码中处理像素的唯一位置,所有宽度和高度属性(包括ActualWidth和ActualHeight)仅在控件完全渲染后设置,都是以设备无关的像素度量的。这可能会产生误导,因为在很多情况下,这恰好是1:1的转换,但不能保证是这样


可以在此处找到更多信息:

尝试改用ActualWidth和ActualHeight属性。它在宽度和高度上都返回0,而不是NaN。在宽度和高度上的用法不同。可能您必须使用BitmapImage而不仅仅是Image来获取大小。请尝试改用ActualWidth和ActualHeight属性。它在宽度和高度上都返回0,而不是NaN。在宽度和高度上的用法不同。也许您必须使用BitmapImage而不仅仅是Image来获取大小。您能详细说明一下完全加载是什么意思吗?如果图像已成功显示,则它是否已完全加载?当您设置image.Source属性时,框架必须完成一些工作才能将实际源加载到内存中并使其可供显示。请参阅问题的答案,以了解我正在谈论的这类事情的示例。我想不出你没有得到维度值的任何其他原因,除了你的图像实际上没有维度。所以,有一个延迟,因为它们是在不同的线程上处理的?本质上,是的。以您使用的方式使用宽度和高度属性
它们不是WPF中推荐的做事方式。对于位图,最简单的方法可能是查看png文件的实际尺寸,请参见下面的答案。宽度和高度包含所需的宽度和高度或double.NaN如果未设置,则实际宽度和实际高度仅在呈现UI后有效,而在设置源属性后则无效。您能否详细说明完全加载是什么意思?如果图像已成功显示,则它是否已完全加载?当您设置image.Source属性时,框架必须完成一些工作才能将实际源加载到内存中并使其可供显示。请参阅问题的答案,以了解我正在谈论的这类事情的示例。我想不出你没有得到维度值的任何其他原因,除了你的图像实际上没有维度。所以,有一个延迟,因为它们是在不同的线程上处理的?本质上,是的。以使用宽度和高度属性的方式使用它们不是WPF中推荐的操作方式。对于位图,最简单的方法可能是查看png文件的实际尺寸,请参见下面的答案。宽度和高度包含所需的宽度和高度或double.NaN如果未设置,则ActualWidth和ActualHeight仅在呈现UI后有效,而在设置源属性后则无效。