gpt4 book ai didi

c# - 在 DataContext 中使用时无法删除文件

转载 作者:行者123 更新时间:2023-11-30 15:32:16 26 4
gpt4 key购买 nike

我的应用程序在屏幕上显示图像(基于本地计算机上的文件的图像)并且用户可以根据需要删除它们。

每次我尝试删除文件时,都会出现以下错误消息:

"The process cannot access the file 'C:\\Users\\Dave\\Desktop\\Duplicate\\Swim.JPG' because it is being used by another process."

我理解错误信息。

我有一个 UserControl,它接受一个文件路径(通过构造函数中的一个参数),然后将它绑定(bind)到它的 (UserControl) DataContext

作为调试此问题的一部分,我发现问题是由于在 UserControl 中设置了 DataContext。如果我从我的 UserControl 中删除 this.DataContext = this;,那么我就可以删除该文件。

所以,我的 TestUnit 看起来像

        Ui.UserControls.ImageControl ic = new ImageControl(
@"C:\Users\Dave\Desktop\Duplicate\Swim.JPG");

try
{
File.Delete(@"C:\Users\Dave\Desktop\Duplicate\Swim.JPG");
}
catch (Exception ex)
{
Assert.Fail(ex.Message);
}

UserControl 代码隐藏

    public ImageControl(string path)
{
this.FilePath = path;
this.DataContext = this; // removing this line allows me to delete the file!
InitializeComponent();
}

#region Properties

private string _filePath;
public string FilePath
{
get { return _filePath; }
set
{
_filePath = value;
OnPropertyChanged("FilePath");
}
}

如果重要的话,我的 UserControl XAML 正在使用绑定(bind)到“FilePath”的“Image”控件

我曾尝试在删除之前将 UserControl 设置为 null,但这没有帮助。

我已经尝试将 IDisposible 接口(interface)添加到我的 UserControl 和 Dispose() 方法设置 this.DataContext = null; 但这没有帮助。

我做错了什么?我怎样才能删除这个文件(或者更准确地说,让它不被使用)。

最佳答案

问题不在于 DataContext,而在于 WPF 从文件加载图像的方式。

当您将 Image 控件的 Source 属性绑定(bind)到包含文件路径的字符串时,WPF 会在内部从该路径创建一个新的 BitmapFrame 对象,基本上如下所示:

string path = ...
var bitmapImage = BitmapFrame.Create(new Uri(path));

不幸的是,这会保留由 WPF 打开的图像文件,因此您无法删除它。

要解决此问题,您必须将图像属性的类型更改为 ImageSource(或派生类型)并手动加载图像,如下所示。

public ImageSource ImageSource { get; set; } // omitted OnPropertyChanged for brevity

private ImageSource LoadImage(string path)
{
var bitmapImage = new BitmapImage();

using (var stream = new FileStream(path, FileMode.Open))
{
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.StreamSource = stream;
bitmapImage.EndInit();
bitmapImage.Freeze(); // optional
}

return bitmapImage;
}

...
ImageSource = LoadImage(@"C:\Users\Dave\Desktop\Duplicate\Swim.JPG");

关于c# - 在 DataContext 中使用时无法删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19346273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com