【问题标题】:WPF - Image Control Actual SizeWPF - 图像控制实际大小
【发布时间】:2011-03-15 06:40:46
【问题描述】:

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

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

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

【问题讨论】:

    标签: wpf image controls actualwidth actualheight


    【解决方案1】:

    在我的脑海中,我认为您应该订阅图像控件上的 Load 事件,ActualHeight/Width 在该事件触发之前不会更新。

    【讨论】:

    • 更正 - Loading 事件不会触发。你需要追踪LayoutUpdated
    【解决方案2】:

    FrameworkElement.ActualHeight 的评论说,在房产获得真正价值之前可能会有一些滞后。

    此属性是计算值 基于其他高度输入,以及 布局系统。该值由 布局系统本身,基于 实际渲染过程,并且可能 因此稍微落后于集合 高度等属性的值 这是输入的基础 改变。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我发现的最佳解决方案是等到图像加载完毕。

        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
        

        我希望这对你有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-06
          • 2013-06-06
          • 2011-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-05
          相关资源
          最近更新 更多