我在WPF中遇到了一个问题,无法获取图像控件的ActualHeight
和ActualWidth
。当用户选择图片文件时,我希望根据图像控件的尺寸调整所选图像的大小。
我尝试在窗口初始化时获取Image.ActualHeight
和Image.ActualWidth
,但发现图像控件的这两个属性都是'0'。
那么如何获取图像控件的尺寸呢?
我在WPF中遇到了一个问题,无法获取图像控件的ActualHeight
和ActualWidth
。当用户选择图片文件时,我希望根据图像控件的尺寸调整所选图像的大小。
我尝试在窗口初始化时获取Image.ActualHeight
和Image.ActualWidth
,但发现图像控件的这两个属性都是'0'。
那么如何获取图像控件的尺寸呢?
我想,你应该订阅图像控件的“Load”事件,因为只有在该事件触发后,ActualHeight/Width
才会更新。
您的控件的最终大小由 FrameworkElement.Arrange(-Override) 设置。您可以重写该方法并只调用基类实现。其返回值将是 Image 的实际大小。此属性是根据其他高度输入和布局系统计算的值。该值由布局系统本身设置,基于实际的渲染过程,因此可能略滞后于作为输入更改基础的 Height 等属性的设置值。
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
。 - Den