WPF LayoutTransform(Scale)抛出异常,因为Image的DesiredSize是NaN

时间:2015-04-01 07:59:41

标签: c# wpf layout measure scaletransform

我正在设置Image的ImageSource:

Stream imageStreamSource = new FileStream(_filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource,BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
BitmapSource bmSrc = decoder.Frames[0];
bmSrc.Freeze();
ImageSource = bmSrc;

Image在Scrollviewer中使用ScaleTransform(LayoutTransform)。
需要LayoutTransform来更新ScrollViewers内容大小。
我想将图像缩放到scrollviewer(bounds)的父级的大小:

double horizontalAspectRatio = gridBounds.Width / image.Width;
double verticalAspectRatio = gridBounds.Height / image.Height;

if (horizontalAspectRatio > verticalAspectRatio) {
     scaleTransformImage.ScaleX = scaleTransformImage.ScaleY = verticalAspectRatio;
     MessageBox.Show("to height");
} else {
     scaleTransformImage.ScaleX = scaleTransformImage.ScaleY = horizontalAspectRatio;
     MessageBox.Show("to width");
}

在执行此操作后,抛出InvalidOperationException,并且它表示测量图像的布局要求DesireSize不是NaN。
我试图像这样手动测量和排列图像:

image.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
image.Arrange(new Rect(0d, 0d, gridBounds.Width, gridBounds.Height));

但它似乎没有效果 我刚刚开始使用Transforms而且还没有很多知识......

1 个答案:

答案 0 :(得分:1)

只要您未明确设置图像控件的WidthHeight属性,其值将为NaN,并且宽高比计算将失败:

double horizontalAspectRatio = gridBounds.Width / image.Width;
double verticalAspectRatio = gridBounds.Height / image.Height;

您可以改为使用图片的ActualWidthActualHeight,或者如果尚未列出,则WidthHeight的{​​{1}}:

Source