我创建了一个ClassLibrary项目,并添加了一个Window类型的xaml。 我写了一个控制台应用程序并显示了这个wpf窗口。
问题是我必须在此窗口中显示一个图标。
如果我使用以下代码,则无效
<Image Source="../Images/Folder-icon.png"></Image>
当我提供一些像
这样的硬编码路径时<Image Source="E:\MyApp\Images\Folder-icon.png"></Image>
它有效。
为什么我必须提供硬编码路径值?有没有解决方案?
希望我提供足够的信息。请帮助我解决这个问题超过2个小时。
答案 0 :(得分:28)
如果Images文件夹添加到其使用的同一项目中,这应该适合您:
<Image Source="/Images/Folder-icon.png"/>
或具体使用Pack Uri:
<Image Source="pack://application:,,,/Images/Folder-icon.png"/>
如果图像位于与XAML所在的当前项目不同的项目中,则必须使用更详细的Pack URI定义,您必须在其中指定添加图像的程序集名称。
<Image Source="pack://application:,,,/Assembly;component/Images/Folder-icon.png"/>
将程序集替换为添加图像的实际程序集名称。
还要确保 Build Action
设置为文件 Folder-icon.png 的 Resource
。
<强>更新强>:
Pack URI的更详细定义也适用于样本。试试这个:
<Image Source="pack://application:,,,/ClassLibrary1;component/Folder-icon.png"/>
答案 1 :(得分:0)
此类问题的答案通常令人困惑,因为未正确说明解决方案的原理/前提条件。当前选择的答案也是如此。
有两点要考虑:
1。如何声明要添加到项目中的文件/资源的类型。
这是通过使用VS中的解决方案资源管理器将适当的文件夹和文件添加到项目中来完成的,例如在子文件夹Images
中:
并为每个添加的文件指定属性(在下面的右侧):
Build Action
设置为Content
,而Copy To Output Directory
设置为Copy if newer
。当您不希望将文件嵌入到程序集中时,应采用这种方式添加文件。
内容类型文件仅通过存储的相对路径链接到可执行文件(程序集)。相对URL存储在程序集元数据中。这些文件有望在执行时找到,但是可以在不重新编译程序集的情况下对其进行更改/更新。
如果更新则复制值表示在编译程序集的过程中,编译器将负责将原始文件复制到正确的位置,以便保留相对路径,例如。如果文件位于项目的子文件夹Images
中,例如MyProject/Images
,然后在调试模式下编译应用程序时,将在MyProject/bin/Debug/Images
中创建一个副本。正在MyProject/bin/Debug
中构建的程序集,相对路径相同。
2。如何在标记中指定内容文件URL。
这是简单的部分,通常是唯一的解释部分。但是,只有在正确完成上一步后,它才起作用。
要使用内容文件,只需使用相对路径(相对于程序集)的标记快捷方式:<Image Source="Images/Lighthouse.jpg"/>
(没有前导/
)。
在其他情况下,文件未声明为内容类型(例如,必须作为资源嵌入到程序集中的图像,或者必须从网络加载的文件)涉及语法变化,其中简单的URL替换为pack URI。
请注意,打包URI解决方案是often proposed来引用声明为Content的文件,因为URI可以引用所有内容。但是,URL shorcut更适合在设计时就知道相对于程序集的位置的独立文件。
有关详细信息,请参见:
答案 2 :(得分:0)
我的工作依据是:
我的WPF用户控件项目的名称:WpfControls
包含图像的文件夹的名称:图片
imgae文件的名称:Asdf.png
将文件夹和图像文件包含到WpfControls项目中
图像文件的 Build Action 设置为资源
图片标签中的 Source 属性设置为: