【问题标题】:Not able to reference Image source with relative path in xaml无法在 xaml 中使用相对路径引用图像源
【发布时间】:2014-09-14 16:32:35
【问题描述】:

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

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

如果我使用以下代码,它不起作用

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

当我给出一些硬编码路径时

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

它有效。

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

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

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    如果将 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"/>
    

    Assembly 替换为添加图像的实际程序集名称。


    同时确保 Folder-icon.png 文件的 Build Action 设置为 Resource


    更新

    Pack URI 的更详细定义也适用于示例。试试这个:

    <Image Source="pack://application:,,,/ClassLibrary1;component/Folder-icon.png"/>
    

    【讨论】:

    • 构建操作设置为图像文件的资源?
    • 如果你能帮助我,我可以发送示例应用程序
    • 你能在新的应用程序中试试这个,看看是否可行,因为它绝对适用于上述所有点。
    • 我试过新的应用程序,如果你想要我可以发给你
    • 不起作用
    【解决方案2】:

    此类问题的答案通常令人困惑,因为没有正确解释解决方案起作用的原则/先决条件。当前选择的答案也是如此。所以要注意这一点是件好事:

    • 管理和引用添加到项目中的文件/资源​​的不同方法。
    • 如何在标记中指定以Content 管理的文件的 URL。
    • 包 URI 而非简单 URL 的非必需使用

    需要考虑的事项:

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

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




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




    Build Action 设置为ContentCopy To Output Directory 设置为Copy if newer。当您不希望将文件嵌入到程序集中时,这就是应该添加文件的方式。

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


      Source

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

    Copy if Newer 值意味着编译器将在程序集构建过程中将原始文件复制到正确的位置,以便保留相对路径,例如如果文件位于项目的子文件夹 Images 中,例如MyProject/Images 然后在调试模式下编译应用程序时,将在MyProject/bin/Debug/Images 中创建一个副本。 MyProject/bin/Debug中正在构建的程序集,相对路径是一样的。

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

    这是简单的部分,通常也是唯一解释的部分。但它只有在上一步正确完成的情况下才有效。

    要使用内容文件,只需使用相对路径(相对于程序集)的标记快捷方式:&lt;Image Source="Images/Lighthouse.jpg"/&gt;(没有前导 /)。

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

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

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

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

    如需更详细的视图,请参阅:

    WPF Application Resource, Content, and Data Files

    【讨论】:

      【解决方案3】:

      我得到了这个工作:

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

      2. 包含图片的文件夹名称:Images

      3. imgae 文件名称:Asdf.png

      4. 将文件夹和图像文件包含到 WpfControls 项目中

      5. 图像文件的 Build Action 设置为 Resource

      6. Image标签中的Source属性设置为:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-29
        • 2012-01-10
        • 2015-09-20
        • 2012-04-30
        • 2017-06-19
        • 1970-01-01
        • 2011-09-13
        相关资源
        最近更新 更多