WPF LayoutTransform (Scale) генерирует исключение, потому что DesiredSize of Image равен NaN

Я устанавливаю 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;

Изображение использует ScaleTransform (LayoutTransform) в Scrollviewer.
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 и еще не обладаю большими знаниями....

1 ответ

Решение

До тех пор, пока вы явно не установили элемент управления Image Width а также Height свойства, их значения будут NaNи вычисление соотношения сторон не удастся:

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

Вы можете вместо этого использовать изображения ActualWidth а также ActualHeightили, если он еще не выложен, Width а также Height его Source:

double horizontalAspectRatio = gridBounds.Width / image.Source.Width;
double verticalAspectRatio = gridBounds.Height / image.Source.Height;
Другие вопросы по тегам