我刚学习c#并且一直在努力使用WPF中的URI。我已经搜索了一下,但没有太多运气。
基本上我试图将一个BitmapImage对象存储为Car对象中的属性。然后我想在WPF表单的Image控件中显示BitmapImage。
该应用程序是一个简单的应用程序(它用于Uni分配),因此没有数据库等。
我有两种方法可以做到这一点。首先是我从文本文件中预加载Car数据,包括我要加载的JPG的文件名。我已将JPG包含在名为Files的目录中,该目录位于我的源代码和类文件所在的主目录之外。我已将JPG文件设置为'内容'并且'始终复制'。当我运行Debug时,它将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:,,,",我已尝试添加"组件",我已尝试过' @& #39;在" pack"之前。我似乎无法找到解释这一点的东西。
道歉,如果这是直截了当的,但它正在努力!感谢任何指针。
答案 0 :(得分:3)
如果图像文件位于Visual Studio项目的“文件”文件夹中,则应将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;
无需在任何地方复制文件。图像直接从装配中加载。
答案 1 :(得分:1)
首先尝试使用其绝对路径加载图像文件。例如,如果图像存储在c:\ projects \ yourproject \ files中,则尝试使用类似
的内容BitmapImage myImage = new BitmapImage (new Uri("c:/projects/yourproject/files/carname.jpg", UriKind.Absolute);
如果有效,您所面临的是路径计算问题。
此时,您可以在运行时使用AppDomain.CurrentDomain.BaseDirectory
参考可执行文件计算Absolute,或使用App.Config
存储路径并从那里引用它。
干杯