【问题标题】:WPF - programmatically referencing image resource in codebehind of Window with no XAMLWPF - 在没有 XAML 的 Window 后面的代码中以编程方式引用图像资源
【发布时间】:2013-09-24 14:06:59
【问题描述】:

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

窗口会显示,但图像不会。在 VS 默认 MainWindow 类 (MainWindow.xaml.vb) 的 Loaded 事件中插入完全相同的图像加载代码时,图像会按预期显示。 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 类(它也继承 Window,但另外有一些关联的 XAML)的代码隐藏中使用时有效,但不能在 Window 的“基本”后代中使用,例如 MyWindow 类以上(仅在代码中定义)?

【问题讨论】:

  • 如果找不到您提供的 Uri 路径,您是否在输出窗口中看到任何错误?
  • 其实我是。现在。这很奇怪,因为我之前确实将 ImageFailed 事件附加到它以进行测试,但一无所获。问题是它找不到图像,因为它将 Uri 解释为绝对(即使我将其指定为相对)。解决方案是使用New Uri("pack://application:,,,/Assets/MyImage.png")
  • 你是真的吗?是的,我非常清楚我在说什么。你没有。这不是您的普通业务应用程序。而且我并不是在谈论“动态地链接到数据”中的“动态”。这是一个模块化开发框架,其中新功能作为插件添加(其中一些是新的用户界面组件)。 “动态”是指它是构建应用程序的工具。很像 .Net 本身的运行是为了让您可以使用您的 MVVM 范例。坐下。
  • 作为脚注 - 如果您能够使用 MVVM 执行此类操作,请告诉我:martinwardener.com/adzinoux
  • @d7samurai 好的。我的道具给你。我将编辑问题标题。

标签: wpf image inheritance window


【解决方案1】:

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

当替换为

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

它有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多