WPF - 图像控制实际大小

时间:2010-07-13 11:23:14

标签: wpf image controls actualwidth actualheight

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

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

那么如何获得图像控件的尺寸。

4 个答案:

答案 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

我希望这适合你。