Wpf 在设计时包uri有效,但在运行时无效?

Wpf 在设计时包uri有效,但在运行时无效?,wpf,image,pack-uri,Wpf,Image,Pack Uri,我正在将按钮的内容设置为图像。它看起来像这样: <Button> <Image Source="pack://application:,,,/NavigationImages/nav_up_left.png" /> </Button> 在我的项目中,我有一个名为NavigationImages的子文件夹,其中有图像文件nav_up_left.png 当我查看设计器时,图像会出现,但是在运行时,我收到一个IOException错误,表示它无法找到资源

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

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

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

当我查看设计器时,图像会出现,但是在运行时,我收到一个IOException错误,表示它无法找到资源

生成操作设置为“资源”

实际上,这在一个项目中效果很好。但是当我把它复制到另一个项目上时,它失败了。这似乎是一个难以置信的简单问题,但我发现自己被难住了,准备开始拔头发@_@


您的想法和建议将不胜感激

小崽子,我知道了……有点

我将xaml代码从一个输出类型为Windows应用程序的项目复制到另一个输出类型为类库的项目

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

因此,不是
“pack://application:,,,/NavigationImages/nav\u up\u left.png“
我把它改成了
”/ProjectName;component/NavigationImages/nav\u up\u left.png“
,现在它工作得很好

我不是100%清楚为什么这是有效的,而不是前者。我已经通读了这本书,但也许我误解了什么

如果有人能给我一个很好的解释,为什么我以前的答案在一个带有输出类型类库的项目中不起作用,我将不检查这个答案


我可能错过了一些非常简单的东西@_@

另一个解决方案是:


图像生成操作设置为“资源”并重建后,导航到
对象的属性。“属性”窗口将提供。。。文件资源浏览器,选择图像后,将正确填写
Source=“…”
属性。

只是为了了解您的情况。第二个包是uri。那个有效的。用于位于程序集中而不是主机应用程序中的资源。听上去,宿主应用程序正在从相关类库加载此资源

您可以在此处看到包uri方案的差异:

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

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


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

我只是在很长一段时间内一直在为同样的问题而挣扎,我认为原稿中出现的部分错误是缺少了“组件”一词。一、 比如说,有

myBitmapImage.UriSource = new Uri(@"pack://application:,,,/MyApp;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”

困惑…你把它改成你所说的还是“pack://application:,,,/ProjectName;组件/NavigationImages/nav\u up\u left.png?,您好。我已经有一段时间没有遇到这个问题了,但我很确定我已经将它更改为“/ProjectName;component/NavigationImages/nav_up_left.png”,我刚刚测试过这个。这两个选项都适用(与pack://application:我也有同样的问题,使用“pack:…”URI时也有同样的症状。在某个时候,我删除了资源并尝试再次添加它。这次我使用VS2012属性窗格从源下拉列表中选择图像资源。它会自动引用您的最终建议,而且效果很好!所以我同意。。。有时VS2012没有正确地连接包URI。+1我认为这可能是最接近于错误原因的解释:-)
String appUri = @"pack://application:,,,/" + 
                  System.Reflection.Assembly.GetEntryAssembly().GetName().Name + ";";
String path = appUri + "component/images/mona2.jpg";
myBitmapImage.UriSource = new Uri(path);