在设计时包uri是有效的,但不是在运行时?

时间:2011-07-26 20:16:54

标签: wpf image pack-uri

我正在将Button的内容设置为图像。它看起来像这样:

<Button>
   <Image Source="pack://application:,,,/NavigationImages/nav_up_left.png" />
</Button>

在我的项目中,我有一个名为NavigationImages的子文件夹,在该文件夹中是图像文件nav_up_left.png。

当我查看Designer时,图像出现,但是在运行时我收到IOException错误,说它找不到资源。

Build Action设置为Resource。

实际上,这在一个项目中运作良好。但是当我将它复制到另一个项目上时,它失败了。这似乎是一个非常简单的问题,但我发现自己很难过,准备开始拔头发了。 @ _ @

您的意见和建议将不胜感激!

4 个答案:

答案 0 :(得分:10)

Whelp,我想通了......有点儿。

我将xaml代码从输出类型为Windows Application的一个项目复制到另一个输出类型为Class Library的项目。

我当时没有想到它,但显然当输出类型是类库时,包URI需要更改。

所以我没有"pack://application:,,,/NavigationImages/nav_up_left.png"而是将其更改为"/ProjectName;component/NavigationImages/nav_up_left.png",现在它的工作正常。

我不是100%清楚为什么这是有效的而不是前者。我读过MSDN documentation on pack URIs in WPF,但也许我误解了一些东西。

如果有人可以给我一个很好的解释,为什么我以前拥有的东西在输出类型为Class Library的项目中不起作用,我将不加考虑这个答案。

我可能错过了一些非常简单的事情。 @ _ @

答案 1 :(得分:3)

我刚刚在同一个问题上挣扎了很长一段时间,我认为原版中出现问题的部分原因是缺少“组件”这个词。例如,我有

myBitmapImage.UriSource = new Uri(@"pack://application:,,,/MyApp;images/mona2.jpg");

但是

... = new Uri(@"pack://application:,,,/MyApp;component/images/mona2.jpg");

单词“component”不是路径名的一部分,尽管它的外观 - 它是一个必须存在的字符串文字。为什么?我想,有人认为这是个好主意。

对于那些与另一部分事情挣扎的人来说,“MyApp”呢?这是大会的名称。右键单击项目名称,选择“属性...”,然后在“应用程序”选项卡下,您将看到“程序集名称:”字段。

如果你不想搜索它(或担心它可能会改变,破坏你的代码),你可以这样做:

String appUri = @"pack://application:,,,/" + 
                  System.Reflection.Assembly.GetEntryAssembly().GetName().Name + ";";
String path = appUri + "component/images/mona2.jpg";
myBitmapImage.UriSource = new Uri(path);

不是很漂亮的代码,我承认 - 它可以明显缩短 - 但它会让你到达你需要去的地方,我希望。请记住将图像文件中的“Build”属性设置为“Resource”!

答案 2 :(得分:2)

只是为你的情况发生了什么。第二包uri。有效的那个。适用于位于主机应用程序以外的程序集中的资源。通过它的声音,主机应用程序从相关的类库加载此资源?

您可以在此处查看打包方案的不同之处: MSDN Pack URI Scheme

当从主程序集引用资源并引用另一个程序集中的资源时,uri会略有变化。

此外,pack:// application:,,,包括所谓的“权限”,省略它基本上使它成为相对路径,两者在假定应用程序权限的大多数情况下都是有效的。

编辑:基本上是因为/Subfolder/Resource.xaml(.jpg等)和/Assembly ;component/Resource.xaml非常相似,后者告诉解析器/加载器它正在查看引用的程序集,而不是主要应用程序的组装。 (我想这有助于加快搜索速度。)

答案 3 :(得分:1)

另一个解决方案:

将您的图片 Build Action 设置为&#39;资源&#39;并且您已重建,导航到<Image />对象的属性。属性窗口将提供 ... 文件资源浏览器,选择您的图像时,Source="..."的{​​{1}}属性将被正确填写。