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