Как выпустить изображение из источника изображения в WPF

Загружаю изображение как ниже

XAML


CodeBehind

if (Path.GetFileNameWithoutExtension(filePath).ToLower().Contains(slugName.ToLower() + "_70x70"))
{
    imgThumbnail.BeginInit();
    imgThumbnail.Stretch = Stretch.UniformToFill;
    imgThumbnail.Source = new BitmapImage(new Uri(filePath));
    imgThumbnail.EndInit();
    count = count + 1;
}

Выше код работает нормально, теперь у меня есть кнопка удаления рядом с моим миниатюрой, если кнопка удаления называется, я предполагаю удалить все изображения из исходного местоположения.

Вот код для удаления файлов изображений

internal int Remove(string slugName, DirectoryInfo outputFolder)
{
    Helper.MetadataView.imgThumbnail.Source = null;

    foreach (string filePath_ToBeDeleted in filePathList_ToBeDeleted)
    {
        if (File.Exists(filePath_ToBeDeleted))
        {
            Helper.MetadataView.imgThumbnail.IsEnabled = false;
            File.Delete(filePath_ToBeDeleted);
            count += 1;
            }
        }
        return count;
    }
    return 0; // slugName == null
}

Я пытался источник быть нулевым и удалить, но он выдает исключение, как показано ниже

Процесс не может получить доступ к файлу\ Serv1 \ Dev \ Images \ 730_Test4_0406_70x70.jpg» потому что он используется другим процессом.

Не уверен, как распорядиться, пожалуйста, кто-нибудь направит меня.

 Usher04 июн. 2013 г., 03:35
@Gjeltema, imgThumbnail это изображение. Обновил мой вопрос с XAML. Спасибо
 Gjeltema04 июн. 2013 г., 03:30
Какой тип есть?imgThumbnail

Ответы на вопрос(2)

Решение Вопроса

Вы не должны использовать этоImage непосредственно в вашем приложении, если вы хотите удалить или переместить его.

imgThumbnail.Source = new BitmapImage(new Uri(filePath));

Вместо этого сделайте это:

BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = new Uri(filePath);
image.EndInit();
imgThumbnail.Source = image;

Для более подробной информацииэтот

 Nikhil Agrawal17 нояб. 2016 г., 00:18
@ChrisBordeman: ссылка перенаправляет только на этот ответ.
 Chris Bordeman07 июл. 2017 г., 21:33
@Ankur Tripathi Он хранит память столько, сколько необходимо и больше.
 Dan Randolph19 окт. 2016 г., 04:13
Я сделал все, но установил для свойства CacheOption значение OnLoad. По умолчанию используется OnDemand, который сохраняет исходный поток открытым. Кажется, OnLoad должен быть по умолчанию, чтобы вести себя как ожидалось. Полную документацию по этому вопросу можно найти здесь:msdn.microsoft.com/en-us/library/...
 Chris Bordeman11 июл. 2017 г., 03:17
Это победилоувеличить использование памяти. Поток немедленно уничтожен. Сделайте тест, если выне уверен. Я'я предполагаю, что вызаплатили за это?
 seabass202002 нояб. 2016 г., 19:45
Это сработало для меня с Binding. Я создал новое свойство, которое использует этот код для преобразования строки пути файла в изображение, а затем привязал свое изображение WPF к изображению, как показано выше. Работал отлично!
 Ankur Tripathi10 июл. 2017 г., 11:54
@ChrisBordeman, если я использовал этот код и загрузил 1000 изображений, это увеличит память высокого уровня? или память = размер изображения X 1000?
 Usher04 июн. 2013 г., 05:17
Еще раз спасибо за вашу большую помощь.
 Ankur Tripathi29 июн. 2017 г., 08:18
если я использую этот код, есть ли изменения в увеличении памяти приложения?
 Chris Bordeman04 дек. 2016 г., 04:25
@ seabass2020 извините, потерял правильную ссылку, но создайте IValueConverter, который делает это и использует для привязки: string path = value as string; if (path! = null && System.IO.File.Exists (path)) {// Создать новый поток и растровый кадр. var bitmapImage = new BitmapImage (); bitmapImage.BeginInit (); bitmapImage.StreamSource = new FileStream (путь, FileMode.Open, FileAccess.Read); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.EndInit (); bitmapImage.StreamSource.Dispose (); вернуть bitmapImage;
 Mr. Blond24 июл. 2015 г., 10:21
Это хорошее решение. вместо создания новогоImage я использовалImageSource, Значение присваивать так же, какImageSource SomeImageSource = image и связывание в xaml , Также обернул этот код внутри метода.
 Chris Bordeman16 нояб. 2016 г., 17:17
Вот'Решение для сценариев привязки данных:stackoverflow.com/questions/16908383/...
 amal5014 мая 2019 г., 01:40
Я потратил месяцы, пытаясь понять, почему изображение все еще используется, спасибо за отличное решение

р связывания:

namespace Controls
{
    [ValueConversion(typeof(String), typeof(ImageSource))]
    public class StringToImageSourceConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (!(value is string valueString))
            {
                return null;
            }
            try
            {
                ImageSource image = BitmapFrame.Create(new Uri(valueString), BitmapCreateOptions.IgnoreImageCache, BitmapCacheOption.OnLoad);
                return image;
            }
            catch { return null; }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

И есть строка для привязки, например,

public string MyImageString { get; set; } = @"C:\test.jpg"

И в пользовательском интерфейсе используется конвертер, в моем случае из библиотеки с именем "Элементы управления»

<window x:class="MainFrame" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:Controls;assembly=Controls">
    <window.resources>
        <controls:stringtoimagesourceconverter x:key="StringToImageSourceConverter">
    </controls:stringtoimagesourceconverter></window.resources>
    <grid>
        <img source="{Binding MyImageString, Converter={StaticResource StringToImageSourceConverter}}">
    </grid>
</window>

Ваш ответ на вопрос