2015-04-01 5 views
1

я устанавливаю ImageSource образа, как это:WPF LayoutTransform (Масштаб) бросает исключение, потому что DesiredSize из изображения является NaN

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.
Я хочу, чтобы масштабировать изображение до размера родителя ScrollViewer (границы):

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)); 

Но это, кажется, не имеют эффекта.
Я только начинаю с Преобразованиями и не имею много знаний еще ....

+0

Вы установили ширину и высоту элемента управления изображения где-нибудь? Если нет, то их значения равны NaN. Вы должны использовать ActualWidth и ActualHeight в вычислениях соотношения сторон. – Clemens

+0

@ Clemens Кажется, что теперь работает, кроме ActualValues ​​(для шкалы calc) не установлены достаточно рано. Это значит, что я должен измерять и организовывать, не так ли? EDIT: ActualValues ​​являются 0d ... –

+0

Когда свойство Source уже установлено, возможно, вы также можете использовать 'image.Source.Width' и' image.Source.Height'. – Clemens

ответ

1

Пока вы не явно установить управление изображения в 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;