我正在尝试删除WPF中的图像文件,但WPF会锁定该文件。
<Image Source="C:\person.gif" x:Name="PersonImage">
<Image.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete..." x:Name="DeletePersonImageMenuItem" Click="DeletePersonImageMenuItem_Click"/>
</ContextMenu>
</Image.ContextMenu>
</Image>
Click处理程序看起来像这样:
private void DeletePersonImageMenuItem_Click(object sender, RoutedEventArgs e)
{
System.IO.File.Delete(@"C:\person.gif");
}
但是,当我尝试删除文件时,它被锁定,无法删除。
有关如何删除文件的任何提示?
答案 0 :(得分:10)
答案 1 :(得分:2)
首先从PersonImage控件中删除它然后删除图像。希望有所帮助。 正如您已在源中指定控件,并在不取消分配控件源的情况下将其删除。
PersonImage.Source = null;
System.IO.File.Delete(@"C:\person.gif");
希望这会有所帮助。
答案 2 :(得分:0)
最简单的方法是创建图像文件的临时副本并将其用作源..然后在应用程序结束时删除所有临时文件..
static List<string> tmpFiles = new List<string>();
static string GetTempCopy(string src)
{
string copy = Path.GetTempFileName();
File.Copy(src, copy);
tmpFiles.Add(copy);
return copy;
}
static void DeleteAllTempFiles()
{
foreach(string file in tmpFiles)
{
File.Delete(file);
}
}
WPF中的图像缓存也可以配置为执行此操作,但由于某种原因,我的各种尝试都失败了,我们得到了意外的行为,如无法删除或刷新图像等,所以我们这样做。
答案 3 :(得分:0)
不要将物理文件附加到对象。
BitmapImage bmp;
static int filename = 0;
static string imgpath = "";
private void saveButton_Click(object sender, RoutedEventArgs e)
{
try
{
filename = filename + 1;
string locimagestored = Directory.GetParent(Assembly.GetExecutingAssembly().Location).ToString();
locimagestored = locimagestored + "\\StoredImage\\";
imgpath = locimagestored + filename + ".png";
webCameraControl.GetCurrentImage().Save(imgpath);
Bitmap bitmap = new Bitmap(@imgpath);
IntPtr hBitmap = bitmap.GetHbitmap();
ImageSource wpfBitmap = Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); ;
if (filename == 1)
{
imgSavedOnline0.Source = wpfBitmap;
bitmap.Dispose();
}
else if (filename == 2)
{
imgSavedOnline1.Source = wpfBitmap;
bitmap.Dispose();
}
else if (filename == 3)
{
imgSavedOnline2.Source = wpfBitmap;
bitmap.Dispose();
}
else if (filename == 4)
{
imgSavedOnline3.Source = wpfBitmap;
bitmap.Dispose();
}
System.IO.DirectoryInfo di2 = new DirectoryInfo(locimagestored);
foreach (FileInfo file in di2.GetFiles())
{
file.Delete();
}
}
catch (Exception ex)
{
textBox1.Text = ex.Message;
}
}
答案 4 :(得分:0)
使用后面的代码,可以使用缓存选项BitmapCacheOption.OnLoad:
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
bi.UriSource = new Uri(PathToImage);
bi.EndInit();
PersonImage.Source = bi;
因为我很难找到它,所以我会补充一点,如果您想动态替换已删除的图像,则需要添加参数BitmapCreateOptions.IgnoreImageCache。