Wpf绝对与相对包URI

时间:2011-10-14 18:48:12

标签: c# .net wpf windows

我的问题是:我是否读错了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”中获得前导斜杠。

3 个答案:

答案 0 :(得分:13)

当作为单独的程序集运行时,相对包URI必须以../开头或没有前导反斜杠的原因是因为使用了相对URI,from MSDN (emphasis mine)

  

绝对与相对包URI

     

...

     

如果使用前导反斜杠,则相对包URI引用将被视为相对于应用程序的根

因此,如果您希望图像保持相对于引用的程序集,只需省略前导斜杠或在子文件夹中使用../

有关如何查看运行时的示例,请参见下图:

Absolute vs. Relative Pack URIs

答案 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"