C# 无法使用xaml中的相对路径引用图像源

C# 无法使用xaml中的相对路径引用图像源,c#,wpf,C#,Wpf,我创建了一个类库项目,并添加了一个窗口类型的xaml。 我编写了一个控制台应用程序并显示了这个wpf窗口 问题是我必须在此窗口中显示一个图标 如果我使用下面的代码,它是不工作的 <Image Source="../Images/Folder-icon.png"></Image> 当我给出一些硬编码的路径,比如 <Image Source="E:\MyApp\Images\Folder-icon.png"></Image> 它起作用了 为

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

问题是我必须在此窗口中显示一个图标

如果我使用下面的代码,它是不工作的

<Image Source="../Images/Folder-icon.png"></Image>

当我给出一些硬编码的路径,比如

<Image Source="E:\MyApp\Images\Folder-icon.png"></Image>

它起作用了

为什么我必须给出一个硬编码的路径值?有什么解决办法吗


希望我提供了足够的信息。请帮助我解决此问题已超过2个小时。

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

<Image Source="/Images/Folder-icon.png"/>

这些问题的答案往往令人困惑,因为没有正确解释解决方案的原则/先决条件。当前选择的答案也是如此。因此,要意识到这是一件好事:

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

需要考虑的事项:

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

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





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




生成操作
被设置为
内容
复制到输出目录
被设置为
复制(如果更新的话)
。这是当您不希望将文件嵌入程序集中时应如何添加文件的方法

  • 作为参考,内容选项是访问WPF中文件的可能选项之一。其他选项包括用于访问与当前应用程序没有关系的文件的资源(嵌入当前程序集或同一应用程序的另一个程序集中)和源站点:


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

“如果较新,则复制”值意味着编译器将在部件生成过程中负责将原始文件复制到正确的位置,以便保留相对路径,例如,如果文件位于项目的子文件夹
Images
,例如,
MyProject/Images
然后在调试模式下编译应用程序时,将在
MyProject/bin/Debug/Images
中创建副本。在
MyProject/bin/Debug
中生成的程序集的相对路径相同

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

这是最简单的部分,通常是唯一解释的部分。但只有在正确完成前一步后,它才能工作。

要使用内容文件,只需使用相对路径的标记快捷方式(相对于程序集):
(没有前导的
/

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

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

由于URI方案可以用于引用任何内容,因此包URI解决方案也可以引用声明为
内容的文件。对于我们的示例,等效的包URI是:
pack://application:,,,/Images/Lighthouse.jpg
(注意前面的
/

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

有关更详细的视图,请参见:

我是通过以下方式实现的:

  • 我的WPF用户控件项目的名称:WpfControls

  • 包含图像的文件夹的名称:Images

  • imgae文件名:Asdf.png

  • 将文件夹和图像文件包括到WpfControls项目中

  • 映像文件的生成操作设置为资源

  • 图像标记中的源属性设置为:


    生成操作已设置为图像文件的资源?如果您能帮助我,我可以发送示例应用程序。您可以在新应用程序中尝试此操作,并查看是否有效,因为它确实适用于上述所有点。我已尝试使用新应用程序,如果您愿意,我可以发送给您当然,共享您的应用程序。
    <Image Source="pack://application:,,,/Images/Folder-icon.png"/>
    
    <Image Source="pack://application:,,,/Assembly;component/Images/Folder-icon.png"/>
    
    <Image Source="pack://application:,,,/ClassLibrary1;component/Folder-icon.png"/>