我可能已经阅读了有关此内容的所有帖子。似乎无法找到问题。 这是我的收藏品
private ObservableCollection<BitmapImage> _imageList = new ObservableCollection<BitmapImage>();
这就是我加载图片的方式
foreach (string filepath in temp) //populate image collection
{
BitmapImage tempImg = new BitmapImage();
tempImg.BeginInit();
tempImg.CacheOption = BitmapCacheOption.OnLoad;
tempImg.UriSource = new Uri(filepath);
tempImg.EndInit();
_imageList.Add(tempImg);
}
当我尝试删除时,该行发生异常,该文件正在使用中。
if (File.Exists(_imageList[SelectedItem].UriSource.AbsolutePath.ToString()))
{
int temp = SelectedItem;
//_imageList.RemoveAt(temp);
Console.WriteLine(_imageList[temp].UriSource.AbsolutePath.ToString());
File.Delete(_imageList[temp].UriSource.AbsolutePath.ToString());
}
例外:
mscorlib.dll中出现“System.IO.IOException”类型的异常,但未在用户代码中处理。
附加信息:进程无法访问文件'e:\ pix \ img.jpg',因为它正被另一个进程使用。
有人可以重新打开吗?我想出了问题,并不是这个代码,它是在View的部分,我想发一个答案。
答案 0 :(得分:0)
但例外是什么?它被解雇的代码行? 我敢打赌,你的BitmapImage保存文件,这就是为什么你不能删除它,你应该首先处理它。
有时WPF只保存文件,在这种情况下,只保存文件中的字节并将其保留下来是好的,例如:
private BitmapImage loadImage(string imgPath)
{
BitmapImage myRetVal = null;
if (imgPath != null)
{
BitmapImage img = new BitmapImage();
using (FileStream stream = File.OpenRead(imgPath))
{
img.BeginInit();
img.CacheOption = BitmapCacheOption.OnLoad;
img.StreamSource = stream;
img.EndInit();
}
myRetVal = image;
}
return myRetVal;
}
答案 1 :(得分:0)
您从列表中删除了临时项目,然后立即重复使用它。鉴于事实上,列表中有足够的项目,将删除错误的文件。否则,您将获得IndexOutOfRangeException。
此外,UriSource.AbsolutePath是一个字符串,那么使用ToString()毫无意义。
从发布的代码中无法看到,为什么文件可能正在使用中。请检查另一个应用程序是否保持文件打开(或您,其他地方)。