我在获取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