我在獲取WPF中的圖像控件的ActualHeight
和ActualWidth
時遇到問題。當用戶選擇圖像文件時,我想根據圖像控件的尺寸調整選定圖像的大小。WPF - 圖像控件實際大小
當窗口初始化時,我試圖獲得Image.ActualHeight
和Image.ActualWidth
,但是我發現Image控件的兩個屬性均爲'0'。
那麼如何獲得圖像控件的尺寸。
我在獲取WPF中的圖像控件的ActualHeight
和ActualWidth
時遇到問題。當用戶選擇圖像文件時,我想根據圖像控件的尺寸調整選定圖像的大小。WPF - 圖像控件實際大小
當窗口初始化時,我試圖獲得Image.ActualHeight
和Image.ActualWidth
,但是我發現Image控件的兩個屬性均爲'0'。
那麼如何獲得圖像控件的尺寸。
關閉我的頭頂,我認爲你應該訂閱圖像控件上的Load事件,ActualHeight/Width
不會更新,直到該事件觸發。
FrameworkElement.ActualHeight的評論說可能有一些滯後之前,財產有其實際價值。
此屬性是基於其他高度輸入的計算值 ,以及 佈局系統。該值由 佈局系統本身的基礎上,一個 實際渲染通道設置,並且因此可以 略微滯後如身高 性質是輸入 變化的基礎上的所述一組值 後面。
控件的最終尺寸由FrameworkElement.Arrange(-Override)設置。您可以重寫該方法並調用基類實現。它的返回值將是圖像的實際大小。
控件的實際大小在「測量」佈局過程(「排列」佈局過程設置其位置)後設置。另外兩個答案是有幫助的;容器的「Arrange」佈局過程只發生在其子項被測量後,並且圖像控件的裝載處理程序應在其第一個佈局過程完成後調用。
我發現的最佳解決方案是等待圖像加載完成後。
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
我希望這對你的作品。
糾正 - 'Loading'事件不會觸發。你需要跟蹤'LayoutUpdated'。 – 2015-05-08 02:35:24