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

Ash*_*non 11 wpf image pack-uri

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

<Button>
   <Image Source="pack://application:,,,/NavigationImages/nav_up_left.png" />
</Button>
Run Code Online (Sandbox Code Playgroud)

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

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

Build Action设置为Resource.

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

非常感谢您的想法和建议!

Ash*_*non 10

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

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

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

因此,"pack://application:,,,/NavigationImages/nav_up_left.png"我没有改变它"/ProjectName;component/NavigationImages/nav_up_left.png",现在它的工作正常.

我不是100%清楚为什么这是有效的而不是前者.我已经阅读了WPF中有关包URIMSDN文档,但也许我误解了一些东西.

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

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


Joh*_*ohn 5

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

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

应该

... = new Uri(@"pack://application:,,,/MyApp;component/images/mona2.jpg");
Run Code Online (Sandbox Code Playgroud)

尽管“组件”一词出现,但它并不是路径名的一部分——它是必须存在的字符串文字。为什么?我猜有人认为这是个好主意。

对于那些在事情的另一部分苦苦挣扎的人,“MyApp”怎么样?这就是议会的名称。右键单击项目名称,选择“属性...”,在“应用程序”选项卡下,您将看到“程序集名称:”字段。

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

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

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