1

System.Windows.Window次のように継承するクラスを考えてみましょう。

Public Class MyWindow
    Inherits Window

    Private _root As Grid

    Public Sub New()
        MyBase.New()

        _root = New Grid
        Me.AddChild(_root)

    End Sub

    Private Sub Me_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

        Dim image As New Image
        Dim bitmapImage As New BitmapImage(New Uri("Assets/MyImage.png", UriKind.Relative))
        image.Source = bitmapImage
        image.Width = 100
        image.Height = 100
        image.Stretch = Stretch.Fill

        _root.Children.Add(image)

    End Sub

End Class

次のモジュールをスタートアップ オブジェクトとして持つ WPF Windows アプリケーションの一部にします。

Module MyModule

    Sub main()

        Dim myApplication As New Application
        myApplication.Run(New MyWindow)

    End Sub

End Module

ウィンドウは表示されますが、画像は表示されません。LoadedVS の既定MainWindowのクラス (MainWindow.xaml.vb)のイベントでまったく同じ画像読み込みコードを挿入すると、画像が期待どおりに表示されます。MyImage.pngどちらの場合も、「ビルド アクション」が「リソース」に設定されています。ここで何が欠けていますか?

編集

コードビハインドでのそのような参照は、Pack URI スキームを使用して指定する必要があることを知ったので、Uriコードを次のように置き換えます。

New Uri("pack://application:,,,/Assets/MyImage.png")

それを機能させます。問題は、相対Uriが「絶対ファイル システム」として解釈され (指定されているにもかかわらずUriKind.Relative)、イメージの場所が に解決されることでしたC:\Assets\MyImage.png

しかし、それは根底にある質問の答えにはなりません。

New Uri("Assets/MyImage.png", UriKind.Relative)

標準MainWindowクラス (これも を継承しますが、さらに XAML が関連付けられています) のコードビハインドで使用すると機能しますが、上記のクラスのようなWindow「ベアボーン」の子孫(コードのみで定義) では機能しませんか?WindowMyWindow

4

1 に答える 1