考虑一个继承自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