无法在xaml中引用具有相对路径的图像源

use*_*076 20 c# wpf

我创建了一个ClassLibrary项目,并添加了一个Window类型的xaml.我写了一个控制台应用程序并显示了这个wpf窗口.

问题是我必须在这个窗口中显示一个Icon.

如果我使用以下代码,则无效

<Image Source="../Images/Folder-icon.png"></Image>
Run Code Online (Sandbox Code Playgroud)

当我给出一些硬编码路径时

<Image Source="E:\MyApp\Images\Folder-icon.png"></Image>
Run Code Online (Sandbox Code Playgroud)

有用.

为什么我必须提供硬编码路径值?有什么解决方案吗?

希望我提供足够的信息.请帮助我解决这个问题超过2小时.

Roh*_*ats 30

如果Images文件夹添加到其使用的同一项目中,这应该适合您:

<Image Source="/Images/Folder-icon.png"/>
Run Code Online (Sandbox Code Playgroud)

或者特别使用Pack Uri:

<Image Source="pack://application:,,,/Images/Folder-icon.png"/>
Run Code Online (Sandbox Code Playgroud)

如果图像驻留在与XAML所在的当前项目不同的项目中,则必须使用更详细的Pack URI定义,您必须在其中指定添加图像的程序集名称.

<Image Source="pack://application:,,,/Assembly;component/Images/Folder-icon.png"/>
Run Code Online (Sandbox Code Playgroud)

使用添加图像的实际装配名称替换装配.


还要确保Build Action设置Resource为文件Folder-icon.png.


更新:

Pack URI的更详细定义也适用于样本.试试这个:

<Image Source="pack://application:,,,/ClassLibrary1;component/Folder-icon.png"/>
Run Code Online (Sandbox Code Playgroud)

  • &lt;Image Source="/Images/Folder-icon.png"/&gt; 不起作用 (5认同)
  • Build Action设置为Resource for image file? (3认同)

min*_*ins 12

此类问题的答案通常令人困惑,因为没有正确解释解决方案起作用的原则/先决条件。当前选择的答案也是这种情况。因此,了解以下几点是件好事:

  • 管理和引用添加到项目中的文件/资源​​的不同方法。
  • 如何在标记中指定作为Content.
  • 非必需使用包 URI 而不是简单的 URL

需要考虑的事项:

1. 如何声明要添加到项目中的文件/资源​​的类型。

这是通过使用 VS 中的解决方案资源管理器向项目添加适当的文件夹和文件来完成的,例如在子文件夹中Images

在此处输入图片说明


并为每个添加的文件指定属性(在下面的右侧):

在此处输入图片说明


Build Action被设置为ContentCopy To Output Directory设置为Copy if newer。当您不希望将文件嵌入到程序集中时,应通过这种方式添加文件。

  • 作为参考,内容选项是在 WPF 中访问文件的可能选项之一。其他选项包括 Resource(嵌入在当前程序集中,或在同一应用程序的另一个程序集中)和 Site of Origin 以访问与当前应用程序无关的文件:

    在此处输入图片说明
    来源

内容类型文件仅通过它们存储的相对路径链接到可执行文件(程序集)。相对 URL 存储在程序集元数据中。这些文件应在执行时找到,但无需重新编译程序集即可更改/更新它们。

副本是否有更新的值意味着编译器将复制原始文件,以在组装建设过程中,正确的地方的护理,使相对路径被保留,例如,如果一个文件位于子文件夹中Images的项目,例如MyProject/ImagesMyProject/bin/Debug/Images在调试模式下编译应用程序时将创建副本。内置的程序集MyProject/bin/Debug,相对路径是一样的。

2. 如何在标记中指定内容文件 URL。

这是最简单的部分,通常也是唯一解释的部分。但它只有在上一步正确完成时才有效。

要使用内容文件,只需使用相对路径(相对于程序集)的标记快捷方式:(<Image Source="Images/Lighthouse.jpg"/>没有前导/)。

文件未声明为内容类型的其他情况(例如,必须作为资源嵌入到程序集中的图像,或必须从网络加载的文件)涉及语法变体,其中简单的 URL 被包 URI替换.

3. 非必需/过度使用包 URI。

由于 URI 方案可用于引用任何内容,因此通常建议包 URI 解决方案也引用声明为Content. 对于我们的示例,等效的包 URI 将是:(pack://application:,,,/Images/Lighthouse.jpg注意前导/)。

然而,URL 快捷方式更合适,并且对于在设计时已知相对于程序集的位置的独立文件来说更不容易出错。

更详细的视图请参见:

WPF 应用程序资源、内容和数据文件