【问题标题】:Using the correct pack:// URI Format使用正确的 pack:// URI 格式
【发布时间】:2014-04-19 15:00:20
【问题描述】:

我有一个 WPF 类库,其中包含一个包含图像的文件夹“图像”。 在 WPF 应用程序中,我不会使用

来引用该文件夹中的图像
<Image Name="image" Grid.Row="0" Source="pack://application:,,,/ImageService.dll;Component/Images/image.jpg"/>

图像被标记为“资源”,我也将它添加到类库项目的资源中。经过一番搜索,我发现我必须将dll复制到exe目录中。

在设计期间,图像可以正确显示。启动可执行文件后,图像的source 属性为空。输出窗口中没有错误消息和提示。

好像是pack uri的Format不正确,所以runtime指向了错误的地方。有没有办法指定相对于可执行文件的程序集名称,使用“....\AssemblyName.dll”或绝对文件系统根目录。

不幸的是,我无法通过代码分配图像源,因为所有内容都通过 XAMLWriter - XAMLReader 构造从 dll 到正在执行的程序集。

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    您不必将图像复制到输出目录。确保将 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'。
    • 但前提是 dll 与可执行文件位于同一文件夹中。我必须引用位于其他地方的 dll 中的图像。正在执行的程序集位于 [PROJECTFOLDER]\ImageConsumer\bin\debug 包含图像的程序集位于 [PROJECTFOLDER]\ImageService\bin\debug 所以我需要类似 '..\..\..\ImageService\bin\debug \ImageService.dll'。或绝对路径。有这样的可能吗?
    • 理想情况下,该程序集应复制到可执行路径。 ImageService 不是您解决方案的一部分吗?所有引用的程序集都会自动复制到输出路径。
    • 是的,在这种情况下,“ImageService”是解决方案的一部分(在当前阶段是文本 - exe)。通常,“ImageService”是对现有项目的扩展,它动态加载 dll,创建 xaml 代码并将其返回给主程序。这将加载并显示生成的 XAML 代码。我的扩展需要引用图像,主应用程序对此一无所知。所以我需要对 dll 中的图像进行“向后引用”。不幸的是,在dll中我不能依赖特定的固定位置。但可以参数化它。
    • 我认为 XAML 不可能做到这一点。尝试使用转换器,该转换器将使用一些计算返回路径并将转换器绑定到 XAML。您还可以阅读有关如何使用Pack URI 的更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2017-06-29
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多