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
ウィンドウは表示されますが、画像は表示されません。Loaded
VS の既定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
「ベアボーン」の子孫(コードのみで定義) では機能しませんか?Window
MyWindow