2010-07-13 7 views
2

WPF에서 이미지 컨트롤의 ActualHeightActualWidth을 가져 오는 데 문제가 있습니다. 사용자가 이미지 파일을 선택하면 이미지 컨트롤의 크기에 따라 선택한 이미지의 크기를 조정하려고합니다.WPF - 이미지 컨트롤 실제 크기

윈도우가 초기화 될 때 Image.ActualHeightImage.ActualWidth을 얻으려고했지만 이미지 컨트롤의 두 속성이 모두 '0'인 것으로 나타났습니다.

그래서 이미지 컨트롤의 크기를 가져 오는 방법.

답변

2

내 머리 꼭대기에서 이미지 컨트롤의 Load 이벤트에 가입해야한다고 생각합니다. ActualHeight/Width은 해당 이벤트가 발생할 때까지 업데이트되지 않습니다.

+0

수정 - 'Loading'이벤트가 트리거되지 않습니다. 'LayoutUpdated'를 추적해야합니다. –

2

FrameworkElement.ActualHeight에 대한 설명에서 속성이 실제 가치를 갖기 전에 지연이있을 수 있다고 말합니다.

이 속성은 다른 높이의 입력에 기초하여 계산 된 값 및 레이아웃 시스템이다. 이 값은 실제 렌더링 패스에 기초 레이아웃 시스템 자체에 의해 설정되며, 따라서 입력 변경의 기초와 같은 높이 같은 속성 집합 값 뒤에 약간 지연된다.

최종 컨트롤 크기는 FrameworkElement.Arrange(-Override)입니다. 메서드를 재정의하고 기본 클래스 구현을 호출 할 수 있습니다. 반환 값은 이미지의 실제 크기가됩니다.

0

컨트롤의 ActualSize은 "측정"레이아웃 통과 ("정렬"레이아웃 통과가 위치 설정) 후에 설정됩니다. 다른 두 가지 대답이 도움이됩니다. 컨테이너의 "Arrange"레이아웃 단계는 자식이 측정 된 후에 만 ​​발생하며 이미지 컨트롤의로드 핸들러는 첫 번째 레이아웃 단계가 완료된 후에 호출해야합니다.

0

내가 찾은 최선의 해결책은 이미지가로드 될 때까지 기다리는 것입니다.

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 

나는이 당신을 위해 일하는 희망 :

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 위해 나는 다음 있습니다.