WPF - Фактический размер контроля изображения - PullRequest
2 голосов
/ 13 июля 2010

У меня проблема с получением ActualHeight и ActualWidth контроля изображения в WPF. Когда пользователь выбирает файл изображения, я хочу изменить размер выбранного изображения на основе размеров элемента управления изображением.

Я пытался получить Image.ActualHeight и Image.ActualWidth при инициализации окна, но обнаружил, что оба свойства элемента управления изображением равны '0'.

Итак, как получить размеры элемента управления изображением.

Ответы [ 4 ]

2 голосов
/ 13 июля 2010

замечания для FrameworkElement.ActualHeight говорят, что может быть некоторое отставание, прежде чем свойство получит свое реальное значение.

Это свойство является расчетным значением на основе других входов высоты, и макет системы. Значение устанавливается сама система макетов, основанная на фактический проход рендеринга, и может поэтому немного отстают от набора значение свойств, таких как высота которые являются основой ввода изменить.

Окончательный размер вашего элемента управления устанавливается FrameworkElement.Arrange (-Override) . Вы можете переопределить метод и просто вызвать реализацию базового класса. Его возвращаемое значение будет фактическим размером вашего изображения.

2 голосов
/ 13 июля 2010

От верха моей головы, я думаю, что вы должны подписаться на событие Load в элементе управления изображением, ActualHeight/Width не обновляются, пока не сработает это событие.

0 голосов
/ 09 декабря 2011

Лучшее решение, которое я нашел, это дождаться окончания загрузки изображения.

Private Sub Update_imgImage(tURI As Uri)
    imgImage.LayoutTransform = New ScaleTransform(scaleX:=1, scaleY:=1)
    Dim src As BitmapImage = New BitmapImage()
    src.BeginInit()
    src.UriSource = tURI
    src.CacheOption = BitmapCacheOption.OnLoad
    src.EndInit()
    imgImage.SetCurrentValue(Image.SourceProperty, src)
    AddHandler src.DownloadCompleted, AddressOf ImageDownloadCompleted
End Sub

Затем для ImageDownloadCompleted у меня есть следующее:

Sub ImageDownloadCompleted(sender As Object, e As System.EventArgs)
    Dim src As BitmapImage
    src = DirectCast(sender, BitmapImage)
    Dim scaleXY As Double
    If sender.Width = 0 Then Exit Sub
    'default width is 600 for my item, if changed, then resize
    If sender.Width <> 600 Then
        scaleXY = 500 / sender.Width
        imgImage.LayoutTransform = New ScaleTransform(scaleX:=scaleXY, scaleY:=scaleXY)
    Else
        imgImage.LayoutTransform = New ScaleTransform(scaleX:=1, scaleY:=1)
    End If
    RemoveHandler src.DownloadCompleted, AddressOf ImageDownloadCompleted
End Sub

Надеюсь, это сработает длявы.

0 голосов
/ 13 июля 2010

Элемент управления ActualSize устанавливается после этапа макета «Measure» (этап компоновки «Arrange» устанавливает его местоположение).Два других ответа полезны;этап компоновки «Arrange» контейнера происходит только после того, как были измерены его дочерние элементы, и обработчик загрузки вашего элемента управления изображением должен вызываться после завершения первого этапа компоновки.

...