WPF使用相对路径从程序集中的任何位置访问资源

时间:2017-05-04 10:59:18

标签: c# wpf relative-path

在我的应用程序中,我正在创建大量自定义控件,然后我在不同的窗口中使用它们。我的项目结构看起来像这样:

  • 控件(文件夹)
    • MemberList(class)
  • 资源(文件夹)
  • Windows(文件夹)
    • Window1.xaml
    • Window2.xaml
    • 辅助窗口(文件夹)
      • Window3.xaml

我正在创建存储在Controls文件夹中的类(控件)。如果我想在控件中使用图像,我会这样访问它:

new Uri("../Resources/my_image.png", UriKind.Relative)

有时候,我想在多个窗口中使用相同的控件,有时这些窗口存储在不同的文件夹中。如果我使用存储在另一个文件夹中的Window3中的控件,则不会显示图像。

如果我将Uri更改为:(在路径中添加另一个“go back”命令)

new Uri("../../Resources/my_image.png", UriKind.Relative)

图像正在Window3中显示,但它不会显示在Window1或Window2中。

有没有办法创建相对于主可执行文件的路径,而不是相对于显示控件的窗口?

编辑: 我忘了提一个重要的部分。因为在启动这个应用程序时我只是学习如何使用WPF,我搞砸了一件事。我的资源文件夹不在包含主可执行文件的文件夹中。

我的文件结构如下:

    • 调试
      • MyApplication.exe
  • 资源

我试图使用每个人建议的路径:

 new Uri("pack://application:,,,/../../my_image.png", UriKind.RelativeOrAbsolute)

但我得到例外:

  

找不到资源'my_image.png'。

我可以尝试重新定位Resources文件夹,但它会搞乱所有其他路径。有没有办法在“pack”uri的文件夹结构中“回”?如果没有,重新定位文件夹的最佳方法是什么,以便所有路径都不会搞砸?

4 个答案:

答案 0 :(得分:3)

使用“pack”uri ...所以你会使用:

pack://application:,,,/Resources/my_image.png

所以这样:

new Uri("pack://application:,,,/Resources/my_image.png");

从任何Windows / Controls中引用您的“图像”。

如果您有其他“项目”/“程序集”......您希望能够引用该资源,请使用:

pack://application:,,,/AssemblyNameContainingResource;component/Resources/my_image.png

当您在Resource文件夹中添加图片时......请务必使用Resource作为Build Action

enter image description here

答案 1 :(得分:2)

使用Pack Uri Scheme

  

资源文件包URI - 本地程序集

     

编译到本地的资源文件的包URI   程序集使用以下权限和路径:

Authority: application:///.

Path: The name of the resource file, including its path relative to the root of the local assembly project folder.
     

以下示例显示了XAML资源文件的包URI   位于本地程序集的项目文件夹的根目录中:

     

包://应用:,,, / ResourceFile.xaml

     

以下示例显示了XAML资源文件的包URI   位于本地程序集的项目文件夹的子文件夹中:

     

包://应用:,,, /子文件夹/ ResourceFile.xaml

答案 2 :(得分:1)

简答:使用包URI表示法。

示例:

您的URI看起来类似于:pack://application:,,,/Resources/my_image.png,无论您在XAML中的哪个位置使用它。

<强>文档

MSDN - Pack URIs in WPF

答案 3 :(得分:0)

要访问SubModuelA的资源文件而不是已启动的项目时,在SubModuelA的子视图中,例如SubModuleA的子模块中。 例如,资源文件的目录为StartApp / SubModuelA / Resource / Data / JsonData.json, 在SubModuelA的viewmodel中,其路径为 字符串jsonFile =“ ../../../ SubModuleA / Resource / Data / JsonData.json”

我已经对此进行了验证并将数据写入jsonFile