2010-07-13 91 views
2

我在獲取WPF中的圖像控件的ActualHeightActualWidth時遇到問題。當用戶選擇圖像文件時,我想根據圖像控件的尺寸調整選定圖像的大小。WPF - 圖像控件實際大小

當窗口初始化時,我試圖獲得Image.ActualHeightImage.ActualWidth,但是我發現Image控件的兩個屬性均爲'0'。

那麼如何獲得圖像控件的尺寸。

回答

2

關閉我的頭頂,我認爲你應該訂閱圖像控件上的Load事件,ActualHeight/Width不會更新,直到該事件觸發。

+0

糾正 - 'Loading'事件不會觸發。你需要跟蹤'LayoutUpdated'。 – 2015-05-08 02:35:24

2

FrameworkElement.ActualHeight的評論說可能有一些滯後之前,財產有其實際價值。

此屬性是基於其他高度輸入的計算值 ,以及 佈局系統。該值由 佈局系統本身的基礎上,一個 實際渲染通道設置,並且因此可以 略微滯後如身高 性質是輸入 變化的基礎上的所述一組值 後面。

控件的最終尺寸由FrameworkElement.Arrange(-Override)設置。您可以重寫該方法並調用基類實現。它的返回值將是圖像的實際大小。

0

控件的實際大小在「測量」佈局過程(「排列」佈局過程設置其位置)後設置。另外兩個答案是有幫助的;容器的「Arrange」佈局過程只發生在其子項被測量後,並且圖像控件的裝載處理程序應在其第一個佈局過程完成後調用。

0

我發現的最佳解決方案是等待圖像加載完成後。

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 

我希望這對你的作品。