3

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

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

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

4

4 回答 4

2

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

于 2010-07-13T11:25:42.733 回答
2

FrameworkElement.ActualHeight的注释说在属性具有其实际价值之前可能会有一些滞后。

此属性是基于其他高度输入和布局系统的计算值。该值由布局系统本身根据实际渲染过程设置,因此可能会稍微落后于作为输入更改基础的属性(例如高度)的设置值。

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

于 2010-07-13T11:36:27.670 回答
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

我希望这对你有用。

于 2011-12-09T19:09:45.637 回答
0

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

于 2010-07-13T12:33:16.800 回答