【发布时间】: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