2010-04-02 54 views
4

我试图删除WPF中的图像文件,但WPF锁定了该文件。删除XAML使用的图像文件

<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"); 
    } 

但是,当我尝试删除它已被锁定的文件无法删除。

有关如何删除文件的任何提示?

回答

1

首先将其从PersonImage控件中删除,然后删除图像。希望这会有所帮助。 正如您已分配给源中的控件一样,并在不取消分配控制源的情况下将其删除。

PersonImage.Source = null; 
System.IO.File.Delete(@"C:\person.gif"); 

希望能有所帮助。

+6

不幸的是,没有帮助。 – 2010-04-02 14:43:57

+0

无法正常工作无法删除文件... ERRRO =文件已被使用.. – 2017-06-29 06:20:31

8

我的应用Intuipic通过使用自定义转换器来解决这个问题,该转换器释放图像资源。请参阅代码here

+0

这是迄今为止最好的解决方案,恕我直言,并不难做。 – 2013-04-18 14:29:35

+0

有史以来最好的解决方案!谢谢@Kent。 – gmetax 2016-01-20 19:14:21

+0

MVVM场景的唯一实用解决方案。非常感谢! – 2016-11-16 15:49:51

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中的图像缓存也可以配置为执行此操作,但出于某种原因,我的各种尝试都失败了,并且出现意外行为,例如无法删除或刷新图像等,因此我们这样做了。

+0

谢谢,我用它从我创建的'listbox'中删除图像。您必须创建临时表和实际文件的文件名的并行列表。实际文件和临时文件必须位于相同的索引处,以便在删除时可以使用它们的索引来执行此操作。 – Stylzs05 2012-05-23 15:14:12