我的问题是:我是否读错了MSDN或MSDN是否错误?我正在尝试通过相对URI引用图像资源。
标题为 WPF中的包URI 的MSDN页面明确指出:
“本地程序集子文件夹中的资源文件”= “ /Subfolder/ResourceFile.xaml ”
表2中的:标记中的相对URI(此处为 http://msdn.microsoft.com/en-gb/library/aa970069.aspx)。
因此,我在Vs2010(v10.0.40219.1 SP1Rel)中创建了新的WPF / .NET 4.0项目进行测试。
Startup Project: TryUri
App.xaml
MainWindow.xaml
Custom Ctrl Project: TryUri.CCL
Icons/folder.png <-- Marked As Resource!
Views/TestUC.xaml
在TestUC.xaml中:
<Canvas>
<Border>
<Image Source="/Icons/folder.png" Height="Auto" Width="Auto" />
</Border>
</Canvas>
在MainWindow.xaml:
// xmlns:uc="clr-namespace:TryUri.CCL.Views;assembly=TryUri.CCL"
<uc:TestUC />
结果:图像未显示!!
当我将路径更改为“../Icons/folder.png”确实有效。
如果我将Icons / folder.png复制到TryUri.CCL / Views /文件夹中,那么“Icons / folder.png”就可以了。
但是,我永远不会像MSDN所说的那样在“/Icons/folder.png”中获得前导斜杠。
答案 0 :(得分:13)
当作为单独的程序集运行时,相对包URI必须以../
开头或没有前导反斜杠的原因是因为使用了相对URI,from MSDN (emphasis mine):
绝对与相对包URI
...
如果使用前导反斜杠,则相对包URI引用将被视为相对于应用程序的根。
因此,如果您希望图像保持相对于引用的程序集,只需省略前导斜杠或在子文件夹中使用../
。
有关如何查看运行时的示例,请参见下图:
答案 1 :(得分:7)
答案如下:相对路径中的前导斜杠始终解析为主程序集,而不是标记所在的程序集。
为了让它按照MSDN说明的方式工作,我必须将所有图标存储在主程序集中的“Icons /”文件夹中,而不是存储在自定义控件dll中。
如果您选择将dll程序集中的资源存储在“Icons /”文件夹中,则必须使用相对于您正在处理的标记的路径引用它们(即“../Icons/folder.png
”)或者您必须使用程序集名称限定路径(即“/AssemblyName;component/Icons/folder.png
”)
答案 2 :(得分:4)
只需替换&lt;应用程序名&GT;使用您的应用程序的名称,这应该工作
Source="/<ApplicationName>;component/Icons/folder.png"