【发布时间】:2020-09-10 01:57:10
【问题描述】:
我正在编写一个图像管理器 WPF 应用程序。我有一个带有以下 ItemsTemplate 的 ListBox:
<Grid x:Name="grid" Width="150" Height="150" Background="{x:Null}">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="27.45"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"/>
</Grid.ColumnDefinitions>
<Border Margin="5,5,5,5.745" Grid.RowSpan="2" Background="#FF828282" BorderBrush="{DynamicResource ListBorder}" CornerRadius="5,5,5,5" BorderThickness="1,1,2,2" x:Name="border">
<Grid>
<Viewbox Margin="0,0,0,21.705">
<Image Width="Auto" Height="Auto" x:Name="picture" Source="{Binding Path=FullName}" />
</Viewbox>
<TextBlock Height="Auto" Text="{Binding Path=Name}" TextWrapping="Wrap" x:Name="PictureText" HorizontalAlignment="Left" Margin="70,0,0,0" VerticalAlignment="Bottom" />
</Grid>
</Border>
</Grid>
请注意,“Image”控件绑定到“FullName”属性,该属性是一个字符串,表示 JPG 的绝对路径。
一些应用程序功能需要我更改 JPG 文件(移动、重命名或删除)。当我尝试这样做(当前正在尝试移动文件)时,我收到一个 IOException:“该进程无法访问该文件,因为它正在被另一个进程使用。”锁定文件的进程是我的 WPF 应用程序。
我在网上进行了一些搜索,发现一些帖子表明图像特别难以释放其资源。我尝试了以下方法:
- 将 ListBox.Source 设置为 null
- 在之前添加 10 秒的等待时间 尝试移动。
- 发出 GC.Collect()。
- 将操作移动到不同的 线程。
我还能尝试什么?我想在 ItemsTemplate 中找到对 Image 对象的引用并尝试处理 Image,但我不知道如何获取该引用。
我读到的一个可能的解决方案是创建图像的副本而不是实际图像,但由于绑定是文件名而不是实际图像,我不知道我是否可以做到这一点。
任何帮助或建议将不胜感激。
【问题讨论】: