1

我正在像这样设置图像的 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 内容大小。
我想将图像缩放到滚动查看器父级的大小(边界):

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,还没有很多知识....

4

1 回答 1

1

只要您没有明确设置 Image 控件的WidthHeight属性,它们的值就会是NaN,并且纵横比计算将失败:

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

您可以改为使用图像的ActualWidthand ActualHeight,或者如果尚未布局,则使用其的Widthand :HeightSource

double horizontalAspectRatio = gridBounds.Width / image.Source.Width;
double verticalAspectRatio = gridBounds.Height / image.Source.Height;
于 2015-04-01T09:31:50.257 回答