Удалить файл изображения, используемый XAML - PullRequest
6 голосов
/ 02 апреля 2010

Я пытаюсь удалить файл изображения в 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");
    }

Но когда я пытаюсь удалить файл, он блокируется и не может быть удален.

Любые советы о том, как удалить файл?

Ответы [ 4 ]

10 голосов
/ 02 апреля 2010

Мое приложение Intuipic решает эту проблему с помощью пользовательского конвертера, который освобождает ресурс изображения. Смотрите код здесь .

2 голосов
/ 02 апреля 2010

Сначала удалите его из элемента управления PersonImage, затем удалите изображение. Надеюсь, что это поможет. Как вы назначили элемент управления в источнике, и удалите его без отмены назначения источника управления.

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

надеюсь, что это поможет.

0 голосов
/ 17 мая 2018

Не прикреплять физический файл к объекту.

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;
  }
}
0 голосов
/ 02 апреля 2010

Самый простой способ сделать это - создать временную копию вашего файла изображения и использовать его в качестве источника ..., а затем в конце приложения удалить все временные файлы.

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 также может быть настроено для этого, но по какой-то причине мои различные попытки потерпели неудачу, и мы получили неожиданное поведение, такое как невозможность удалить или обновить изображение и т. Д., Поэтому мы сделали это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...