2010-07-13 93 views
2

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

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

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

回答

2

关闭我的头顶,我认为你应该订阅图像控件上的Load事件,ActualHeight/Width不会更新,直到该事件触发。

+0

纠正 - 'Loading'事件不会触发。你需要跟踪'LayoutUpdated'。 – 2015-05-08 02:35:24

2

FrameworkElement.ActualHeight的评论说可能有一些滞后之前,财产有其实际价值。

此属性是基于其他高度输入的计算值 ,以及 布局系统。该值由 布局系统本身的基础上,一个 实际渲染通道设置,并且因此可以 略微滞后如身高 性质是输入 变化的基础上的所述一组值 后面。

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

0

控件的实际大小在“测量”布局过程(“排列”布局过程设置其位置)后设置。另外两个答案是有帮助的;容器的“Arrange”布局过程只发生在其子项被测量后,并且图像控件的装载处理程序应在其第一个布局过程完成后调用。

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 

我希望这对你的作品。