使用正确的pack:// URI格式

4

我有一个WPF类库,里面包含一个名为“Images”的文件夹,其中有一张图片。 在一个WPF应用程序中,我想使用以下方式引用该文件夹中的图片:

<Image Name="image" Grid.Row="0" Source="pack://application:,,,/ImageService.dll;Component/Images/image.jpg"/>

图像标记为“资源”,并将其添加到类库项目的资源中。经过一番搜索,我发现我必须将dll复制到exe目录中。
在设计时,图像显示正确。启动可执行文件后,图像的“source”属性为空。没有错误消息,输出窗口也没有提示。
似乎pack uri的格式不正确,因此运行时引用了错误的位置。是否有一种方法可以相对于可执行文件指定程序集名称,使用“....\AssemblyName.dll”或相对于文件系统根绝对路径?
不幸的是,我无法通过代码分配imagesource,因为所有内容都通过XAMLWriter-XAMLReader结构从dll传递到执行程序集。
1个回答

9
您不必将图像复制到输出目录。请确保将 Build Action 标记为 Resource,并将 Copy to Output Directory 设置为 false
此外,如果 XAML 和图像位于同一程序集中,则可以在打包 URI 中跳过程序集名称。如果它们位于不同的程序集中,则只需提供程序集名称(从路径中删除 dll)。
<Image Source="pack://application:,,,/ImageService;Component/Images/image.jpg"/>

谢谢!从路径中删除dll起作用了。 但是只有当dll与可执行文件在同一个文件夹中时才有效。我必须引用dll中的图像,该图像位于其他位置。执行程序集位于[PROJECTFOLDER]\ImageConsumer\bin\debug包含图像的程序集位于[PROJECTFOLDER]\ImageService\bin\debug因此,我需要类似于'......\ImageService\bin\debug\ImageService.dll'的东西。 - Matthias Fuchs
但只有当dll与可执行文件位于同一文件夹中时才会发生这种情况。我必须在dll中引用图像,而该图像位于其他地方。执行程序集位于[PROJECTFOLDER]\ImageConsumer\bin\debug,包含图像的程序集位于[PROJECTFOLDER]\ImageService\bin\debug。所以我需要类似'......\ImageService\bin\debug\ImageService.dll'的路径。或者一个绝对路径。这样的方式是否可能? - Matthias Fuchs
理想情况下,汇编应该被复制到可执行路径。ImageService 不是你的解决方案的一部分吗?所有引用的汇编都会自动复制到输出路径。 - Rohit Vats
是的,在这种情况下,“ImageService”是解决方案的一部分(目前是文本-exe)。通常,“ImageService”是现有项目的扩展,它动态加载dll,创建xaml代码并将其返回给主程序。然后加载和显示生成的XAML代码。我的扩展需要引用图像,但主应用程序对此一无所知。因此,我需要进行“反向引用”,以引用存储在dll中的图像。不幸的是,在dll中,我不能依赖于特定的固定位置,但可以进行参数化。 - Matthias Fuchs
我认为从XAML中实现这个不可能。尝试使用转换器,它将使用一些计算返回路径,并将转换器绑定到XAML。此外,您可以阅读有关如何使用Pack URI的更多信息。 - Rohit Vats
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接