我正在使用以下代码在我的wpf应用中显示一些图像:
<Image Source="{Binding Path=TemplateImagePath, Mode=TwoWay}" Grid.Row="3" Grid.Column="2" Width="400" Height="200"/>
通过浏览某个目录在代码隐藏的构造函数中设置它的绑定属性,下面是代码:
DirectoryInfo Dir = new DirectoryInfo(@"D:/Template");
if (Dir.Exists)
{
if (Dir.GetFiles().Count() > 0)
{
foreach (FileInfo item in Dir.GetFiles())
{
TemplateImagePath = item.FullName;
}
}
}
但是如果用户上传了其他一些图像,那么我需要删除这个旧图像,这是我按照以下方式进行的,并将图像绑定设置为null:
DirectoryInfo Dir = new DirectoryInfo(@"D:/Template");
if (Dir.Exists)
{
if (Dir.GetFiles().Count() > 0)
{
foreach (FileInfo item in Dir.GetFiles())
{
TemplateImagePath= null;
File.Delete(item.FullName);
}
}
}
但我得到的异常是无法删除某些其他进程使用的文件。 我该如何删除它?
答案 0 :(得分:7)
为了能够在ImageControl中显示图像时删除图像,您必须创建一个设置了BitmapImage的新BitmapFrame或BitmapCacheOption.OnLoad对象。然后立即从文件加载位图,之后文件不会被锁定。
将您的媒体资源从string TemplateImagePath
更改为ImageSource TemplateImage
并绑定如下:
<Image Source="{Binding TemplateImage}"/>
设置TemplateImage
属性,如下所示:
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = new Uri(item.FullName);
image.EndInit();
TemplateImage = image;
或者这个:
TemplateImage = BitmapFrame.Create(
new Uri(item.FullName),
BitmapCreateOptions.None,
BitmapCacheOption.OnLoad);
如果您想继续绑定到TemplateImagePath
属性,您可以使用binding converter将字符串转换为ImageSource,如上所示。
答案 1 :(得分:0)
根据Clemens的建议,这是具有良好代码重用的绑定转换器:
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"
在UI中使用转换器,在我的例子中,使用的是名为“ Controls”的库
<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" />
</Window.Resources>
<Grid>
<Image Source="{Binding MyImageString, Converter={StaticResource StringToImageSourceConverter}}" />
</Grid>
</Window>