【问题标题】:Wpf Absolute vs. Relative Pack URIsWpf 绝对与相对包 URI
【发布时间】:2011-10-14 18:48:12
【问题描述】:

我的问题是:我读错了 MSDN 还是 MSDN 错了?我试图通过相对 URI 引用图像资源。

标题为 Pack URIs in WPF 的 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”中使用前导斜杠。

【问题讨论】:

  • 我的猜测是您的工作目录在您的项目中设置错误。我会先检查一下。
  • 如果我尝试将 png 作为文件访问,那么工作目录将很重要。我不是,它被标记为资源。我更新了问题以澄清这一点。谢谢。
  • 我在下面自我回答。对于我的项目,我选择简单地使用相对于标记的路径(即“../icons/folder.png”),因为这是 IMO 最简单的选择。

标签: c# .net wpf windows


【解决方案1】:

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

绝对与相对包 URI

...

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

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

请参阅下图,了解运行时的外观示例:

【讨论】:

  • 我试过了,但它不适用于前导斜杠。我必须使用“Icons/folder.png”让它工作。
  • 感谢您的更新。你能评论一下你的代码链接吗?我很好奇你是怎么做到的。此外,与您的回答相反,您似乎将 TestUC 和 TestUC2.xaml 留在了 WpfControlLibrary1 的 /Views 文件夹中。
  • 我正在修改我的答案,我认为.. 是必需的,因为您的UserControl 在运行时是如何使用的。
【解决方案2】:

答案是这样的:相对路径中的前导斜杠始终解析为主程序集,而不是标记所在的程序集。

要使其按照 MSDN 所述的方式工作,我必须将所有图标存储在主程序集中的“Icons/”文件夹中,而不是存储在自定义控件 dll 中。

如果您选择将 dll 程序集中的资源存储在“Icons/”文件夹中,则必须使用相对于您正在处理的标记的路径(即“../Icons/folder.png”)引用它们,或者您必须符合条件带有程序集名称的路径(即“/AssemblyName;component/Icons/folder.png”)

【讨论】:

    【解决方案3】:

    只需将 替换为您的应用程序的名称,这应该可以工作

    Source="/<ApplicationName>;component/Icons/folder.png"
    

    【讨论】:

    • 谢谢。我知道这会起作用,但我想知道为什么 MSDN 说我可以做“/Subfolder/Resource.file-ext”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多