WPF从文件夹加载图像

时间:2014-03-26 13:03:16

标签: c# wpf xaml

我的图片不在资源中,而是在磁盘上。该文件夹与应用程序相关。我用过:

Overview_Picture.Source = new BitmapImage(new Uri(String.Format("file:///{0}/../MyImages /myim.jpg", Directory.GetCurrentDirectory())));
Overview_Picture.Source = new BitmapImage(uriSource);

但是那些类型的代码创建了许多问题并搞砸了GetCurrentDirectory返回有时候确定而有时没有。

因此,MyImages文件夹位于Debug文件夹旁边,我怎么能在那里使用它们而不是像我一样,以其他更正确的方式使用它们?

2 个答案:

答案 0 :(得分:2)

正如在SO上经常提到的那样,GetCurrentDirectory方法根据定义并不总是返回程序集所在的目录,而是返回当前的工作目录。两者之间存在很大差异。

您需要的是当前的程序集文件夹(以及它的父目录)。另外,我不确定是否希望图片是安装文件夹上方的一个文件夹(当你说它们比Debug文件夹高一级时基本上就是你所说的 - 在现实生活中将是安装应用程序的文件夹上方的一个文件夹。)

使用以下内容:

string currentAssemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string currentAssemblyParentPath = Path.GetDirectoryName(currentAssemblyPath);

Overview_Picture.Source = new BitmapImage(new Uri(String.Format("file:///{0}/MyImages/myim.jpg", currentAssemblyParentPath)));

此外,之后还有一个迷路空间MyImages,我将其移除。

答案 1 :(得分:0)

从相对文件路径构造绝对Uri的另一种方法是从相对路径打开FileStream,并将其分配给BitmapImage的StreamSource属性。但是请注意,在初始化BitmapImage之后,当您想要关闭流时,还必须设置BitmapCacheOption.OnLoad

var bitmap = new BitmapImage();

using (var stream = new FileStream("../MyImages/myim.jpg", FileMode.Open))
{
    bitmap.BeginInit();
    bitmap.CacheOption = BitmapCacheOption.OnLoad;
    bitmap.StreamSource = stream;
    bitmap.EndInit();
    bitmap.Freeze(); // optional
}

Overview_Picture.Source = bitmap;