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

窗口会显示,但图像不会。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的“准系统”后代中使用?WindowMyWindow

4

1 回答 1

0

显然,Uri 被解释为绝对 - 即使我将其指定为 UriKind.Relative。

更换时

Dim bitmapImage As New BitmapImage(New Uri("pack://application:,,,/Assets/MyImage.png"))

有用。

于 2013-09-24T14:33:54.733 回答