WPF блокирует изображения при обращении через словарь ресурсов - PullRequest
0 голосов
/ 31 мая 2018

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

Это код, который я использую для загрузки файла:

ResourceDictionary dict = new ResourceDictionary();
dict.Source = new Uri(xamlFilePath, UriKind.RelativeOrAbsolute);

this.Resources.MergedDictionaries.Clear();
this.Resources.MergedDictionaries.Add(dict);

this.UpdateLayout();

Произошла блокировкапри вызове dict.Source.

Изображения хранятся в папке рядом с файлом XAML.В файле XAML хранится:

<Style x:Key="objectPhoto" TargetType="{x:Type Border}">
    <Setter Property="Visibility" Value="Visible" />
    <Setter Property="Canvas.Top" Value="116" />
    <Setter Property="Canvas.Left" Value="654" />
    <Setter Property="BorderBrush" Value="#FF000000" />
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="Height" Value="347" />
    <Setter Property="Width" Value="347" />
    <Setter Property="Background" Value="Transparent" />
    <Style.Resources>
        <Style TargetType="Image">
            <Setter Property="Source" Value="Card Design Images\objectPhoto.png" />
            <Setter Property="Stretch" Value="Fill" />
        </Style>
    </Style.Resources>
</Style>

1 Ответ

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

Фактическая проблема не в ResourceDictionary, а в BitmapFrame, который неявно создается из строки Value в Setter для свойства Source.Если вы явно не укажете BitmapCacheOption, WPF сохранит свой исходный файл открытым.

Вы можете создать значение установщика следующим образом и установить BitmapCacheOption.OnLoad:

<Style TargetType="Image">
    <Setter Property="Source">
        <Setter.Value>
            <BitmapImage CacheOption="OnLoad"
                         UriSource="Card Design Images\objectPhoto.png"/>
        </Setter.Value>
    </Setter>
</Style>
...