C# WPF URI语法

4
我正在学习C#,并且一直在尝试使用WPF中的URI。我已经在谷歌上搜索了很多,但是没有什么收获。
基本上,我想在Car对象的属性中存储一个BitmapImage对象。然后,我希望在WPF窗体上的Image控件中显示BitmapImage。
这个应用程序是一个简单的应用程序(它是为大学作业而设计的),因此没有数据库等等。
我有两种方法可以做到这一点。第一种方法是从文本文件中预加载Car数据,包括我要加载的JPG文件的文件名。我已经在源代码和类文件所在的主目录下设置了一个名为Files的目录,并将JPG文件设置为“内容”和“始终复制”。当我运行调试时,它会将Files目录和JPG复制到debug\bin目录中。
我的代码通过以下方式使用URI引用JPG来创建BitmapImage:
BitmapImage myImage = new BitmapImage (new Uri("Files/" + Car.Imagefilename, UriKind.Relative);
Car.Image = myImage;
ImageControl.Source = myImage;

如果我在调试器中逐步执行此代码,有时它可以正常工作并显示图像,但大多数情况下都不行。

我的第二个方法是当用户创建一个新的汽车时。这种方法总是能够正常工作。在这种方法中,我使用文件对话框(dlg)选择图像并使用绝对路径。

BitmapImage myImage = new BitmapImage (new Uri(dlg.Filename, UriKind.Absolute);
Car.Image = myImage;
ImageControl.Source = myImage;

所以......我想不通为什么第一种方法不起作用。我认为这与相对引用有关,但我无法弄清楚如何正确地语法化来使其工作。我尝试使用"pack:,,,",我尝试添加"component",我尝试在"pack"之前加上"@"。我似乎找不到一个简单解释这个问题的东西。

如果这很简单,那就请原谅,但是它让我头疼!感激任何指针。

2个回答

8
如果图像文件位于Visual Studio项目的“Files”文件夹中,您应将它们的Build Action设置为Resource(并将Copy to Output Directory设置为Do not copy),然后通过Resource File Pack URI加载它们:
var image = new BitmapImage(new Uri("pack://application:,,,/Files/" + Car.Imagefilename));
Car.Image = image;
ImageControl.Source = image;

不需要将文件复制到任何地方。图片直接从程序集中加载。


2

首先尝试使用绝对路径加载图像文件。例如,如果图像存储在C:\projects\yourproject\files中,则尝试使用类似以下内容的路径:

BitmapImage myImage = new BitmapImage (new Uri("c:/projects/yourproject/files/carname.jpg", UriKind.Absolute);

如果它能正常工作,那么你面临的是路径计算问题。
此时,您可以在运行时使用AppDomain.CurrentDomain.BaseDirectory与可执行文件相关联来计算绝对路径,或者使用App.Config存储路径并从那里引用它。
祝愉快。

非常感谢!那个方法可行。我使用完整路径让它工作,然后使用了AppDomain.CurrentDomain.BaseDirectory。我就知道这很简单! - Nick S
1
那很好,尼克。但现在你有一个依赖于文件夹结构的问题,这可能不是理想的情况。考虑将图像路径存储在App.Config中,并从那里加载它。这样,如果您的用户决定将图像移动到单独的服务器上,您只需要修改配置文件,系统就会继续工作。无论如何,我很高兴它对您起作用了。 - Chintana Meegamarachchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接