WPF 在通过资源字典引用时锁定图像
WPF locks images when referenced through a resource dictionary
当我加载资源字典时,它会将所有元素加载到 canvas 中并正确显示所有元素。当我想删除一个元素时出现问题。如果删除该元素,我还想删除与该元素关联的图像。但是问题是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>
实际问题不是 ResourceDictionary,而是从 Setter 中的 Value 字符串为 Source 属性 隐式创建的 BitmapFrame。除非您没有明确指定 BitmapCacheOption,否则 WPF 会保持其源文件打开。
您可以像这样创建 Setter 的值,并设置 BitmapCacheOption.OnLoad
:
<Style TargetType="Image">
<Setter Property="Source">
<Setter.Value>
<BitmapImage CacheOption="OnLoad"
UriSource="Card Design Images\objectPhoto.png"/>
</Setter.Value>
</Setter>
</Style>
当我加载资源字典时,它会将所有元素加载到 canvas 中并正确显示所有元素。当我想删除一个元素时出现问题。如果删除该元素,我还想删除与该元素关联的图像。但是问题是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>
实际问题不是 ResourceDictionary,而是从 Setter 中的 Value 字符串为 Source 属性 隐式创建的 BitmapFrame。除非您没有明确指定 BitmapCacheOption,否则 WPF 会保持其源文件打开。
您可以像这样创建 Setter 的值,并设置 BitmapCacheOption.OnLoad
:
<Style TargetType="Image">
<Setter Property="Source">
<Setter.Value>
<BitmapImage CacheOption="OnLoad"
UriSource="Card Design Images\objectPhoto.png"/>
</Setter.Value>
</Setter>
</Style>