删除XAML使用的图像文件

时间:2010-04-02 08:42:16

标签: wpf image

我正在尝试删除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");
    }

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

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

5 个答案:

答案 0 :(得分:10)

我的应用Intuipic通过使用释放图像资源的自定义转换器来处理此问题。请参阅代码here

答案 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。