【问题标题】:How to release Image from Image Source in WPF如何在 WPF 中从图像源释放图像
【发布时间】:2013-06-04 01:24:08
【问题描述】:

正在加载如下图片

XAML

<Image Stretch="None" Grid.Row="16" Height="70" HorizontalAlignment="Left" Name="imgThumbnail" VerticalAlignment="Top" Width="70" Grid.RowSpan="3" Margin="133,1,0,0" Grid.Column="2" Grid.ColumnSpan="2" />

代码隐藏

if (Path.GetFileNameWithoutExtension(filePath).ToLower().Contains(slugName.ToLower() + "_70x70"))
{
    imgThumbnail.BeginInit();
    imgThumbnail.Stretch = Stretch.UniformToFill;
    imgThumbnail.Source = new BitmapImage(new Uri(filePath));
    imgThumbnail.EndInit();
    count = count + 1;
}

上面的代码工作正常,现在我的缩略图旁边有一个删除按钮,如果调用删除按钮,我想从源位置删除所有图像。

这是删除图像文件的代码

internal int Remove(string slugName, DirectoryInfo outputFolder)
{
    Helper.MetadataView.imgThumbnail.Source = null;

    foreach (string filePath_ToBeDeleted in filePathList_ToBeDeleted)
    {
        if (File.Exists(filePath_ToBeDeleted))
        {
            Helper.MetadataView.imgThumbnail.IsEnabled = false;
            File.Delete(filePath_ToBeDeleted);
            count += 1;
            }
        }
        return count;
    }
    return 0; // slugName == null
}

我尝试将源设为 null 并删除,但它会引发如下异常

该进程无法访问文件“\serv1\Dev\Images\730_Test4_0406_70x70.jpg”,因为它正被另一个进程使用。

不知道怎么处理,请高人指导一下。

【问题讨论】:

  • imgThumbnail是什么类型?
  • @Gjeltema,imgThumbnail 是一个图像。用 XAML 更新了我的问题。谢谢

标签: c# wpf image


【解决方案1】:

如果您想删除或移动它,则不应直接在您的应用程序中使用 Image

imgThumbnail.Source = new BitmapImage(new Uri(filePath));

相反,这样做:

BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = new Uri(filePath);
image.EndInit();
imgThumbnail.Source = image;

更多阅读this

【讨论】:

  • 再次感谢您的大力帮助。
  • 这是一个不错的解决方案。我没有创建新的Image,而是使用了ImageSource。赋值就像ImageSource SomeImageSource = image 和xaml 中的绑定&lt;Image Source"={Binding SomeImageSource}" /&gt; 。还将该代码包装在方法中。
  • 除了将 CacheOption 属性设置为 OnLoad 之外,我已经完成了所有工作。默认值为 OnDemand,它使源流保持打开状态。似乎 OnLoad 应该是默认值,以便按预期运行。在这里可以找到完整的文档:msdn.microsoft.com/en-us/library/…
  • 这对我来说适用于绑定。我创建了一个新属性,使用此代码将文件路径字符串转换为图像,然后将我的 WPF 图像绑定到图像,如上所示。效果很好!
  • 这里是数据绑定场景的解决方案:stackoverflow.com/questions/16908383/…
【解决方案2】:

为了实现良好的代码重用,可以使用绑定转换器:

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>

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2010-10-01
    • 2016-06-17
    相关资源
    最近更新 更多