我在 WPF中获取ActualHeight
和图像控制时遇到问题。ActualWidth
当用户选择图像文件时,我想根据图像控件的尺寸调整所选图像的大小。
我试图获取窗口初始化的Image.ActualHeight
时间Image.ActualWidth
,但我发现 Image 控件的两个属性都是“0”。
那么如何获取图像控件的尺寸。
我在 WPF中获取ActualHeight
和图像控制时遇到问题。ActualWidth
当用户选择图像文件时,我想根据图像控件的尺寸调整所选图像的大小。
我试图获取窗口初始化的Image.ActualHeight
时间Image.ActualWidth
,但我发现 Image 控件的两个属性都是“0”。
那么如何获取图像控件的尺寸。
在我的脑海中,我认为您应该订阅图像控件上的 Load 事件,ActualHeight/Width
直到该事件触发才会更新。
FrameworkElement.ActualHeight的注释说在属性具有其实际价值之前可能会有一些滞后。
此属性是基于其他高度输入和布局系统的计算值。该值由布局系统本身根据实际渲染过程设置,因此可能会稍微落后于作为输入更改基础的属性(例如高度)的设置值。
控件的最终大小由FrameworkElement.Arrange(-Override)设置。您可以覆盖该方法并只调用基类实现。它的返回值将是您的图像的实际大小。
我找到的最佳解决方案是等到图像加载后。
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
我希望这对你有用。
控件的ActualSize在“Measure”布局传递之后设置(“Arrange”布局传递设置其位置)。其他两个答案很有帮助;容器的“排列”布局传递仅在测量其子级之后发生,并且应在其第一个布局传递完成后调用图像控件的加载处理程序。