WPF - 图像控件实际大小

3

我在WPF中遇到了一个问题,无法获取图像控件的ActualHeightActualWidth。当用户选择图片文件时,我希望根据图像控件的尺寸调整所选图像的大小。

我尝试在窗口初始化时获取Image.ActualHeightImage.ActualWidth,但发现图像控件的这两个属性都是'0'。

那么如何获取图像控件的尺寸呢?

4个回答

2

我想,你应该订阅图像控件的“Load”事件,因为只有在该事件触发后,ActualHeight/Width才会更新。


更正 - Loading 事件不会触发。您需要跟踪 LayoutUpdated - Den

2
FrameworkElement.ActualHeight的注释说明,在该属性获得实际值之前可能会有一些延迟。

此属性是根据其他高度输入和布局系统计算的值。该值由布局系统本身设置,基于实际的渲染过程,因此可能略滞后于作为输入更改基础的 Height 等属性的设置值。

您的控件的最终大小由 FrameworkElement.Arrange(-Override) 设置。您可以重写该方法并只调用基类实现。其返回值将是 Image 的实际大小。

0
控件的ActualSize在“测量”布局传递之后设置(“排列”布局传递设置其位置)。其他两个答案很有帮助;容器的“排列”布局传递仅在其子元素被测量后发生,并且您的图像控件的加载处理程序应在其第一次布局传递完成后调用。

0
我找到的最佳解决方案是等待图像加载完成后再进行操作。
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

希望这对你有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接