WPF でのイメージ コントロールの取得ActualHeight
と取得に問題があります。ActualWidth
ユーザーが画像ファイルを選択すると、画像コントロールのサイズに基づいて選択した画像のサイズを変更したいと考えています。
Image.ActualHeight
ウィンドウの初期化時にとを取得しようとしImage.ActualWidth
ましたが、イメージ コントロールの両方のプロパティが '0' であることがわかりました。
では、画像コントロールの寸法を取得する方法。
WPF でのイメージ コントロールの取得ActualHeight
と取得に問題があります。ActualWidth
ユーザーが画像ファイルを選択すると、画像コントロールのサイズに基づいて選択した画像のサイズを変更したいと考えています。
Image.ActualHeight
ウィンドウの初期化時にとを取得しようとしImage.ActualWidth
ましたが、イメージ コントロールの両方のプロパティが '0' であることがわかりました。
では、画像コントロールの寸法を取得する方法。
私の頭の上から、画像コントロールの Load イベントをサブスクライブする必要があると思いますActualHeight/Width
。そのイベントが発生するまで更新されません。
FrameworkElement.ActualHeightのコメントには、プロパティが実際の値を取得するまでに多少の遅れが生じる可能性があることが示されています。
このプロパティは、他の高さの入力とレイアウト システムに基づいて計算された値です。この値は、実際のレンダリング パスに基づいてレイアウト システム自体によって設定されるため、入力変更の基になる Height などのプロパティの設定値よりもわずかに遅れる場合があります。
コントロールの最終的なサイズはFrameworkElement.Arrange(-Override)によって設定されます。メソッドをオーバーライドして、基本クラスの実装を呼び出すだけです。その戻り値は、画像の実際のサイズになります。
コントロールのActualSizeは、「Measure」レイアウトパスの後に設定されます(「Arrange」レイアウトパスがその場所を設定します)。他の2つの答えは役に立ちます。コンテナの「アレンジ」レイアウトパスは、その子が測定された後にのみ発生します。イメージコントロールのロードハンドラは、最初のレイアウトパスが完了した後に呼び出す必要があります。
私が見つけた最善の解決策は、イメージが読み込まれるまで待つことです。
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
これがうまくいくことを願っています。