Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法通过按钮删除正在使用的图像_C#_Wpf_Image_Xaml_Button - Fatal编程技术网

C# 无法通过按钮删除正在使用的图像

C# 无法通过按钮删除正在使用的图像,c#,wpf,image,xaml,button,C#,Wpf,Image,Xaml,Button,我有一个wpf应用程序,它为用户硬盘上特定路径下的每个文件夹都有一个按钮。每个文件夹包含按钮上显示的图像和单击按钮时运行的文件。以下是我用于按钮的模板: <DataTemplate x:Key="ProgramItemDataTemplate"> <Button Style="{StaticResource ButtonStyle}" Click="Program_Click" Tag="{Binding Key}"> <

我有一个wpf应用程序,它为用户硬盘上特定路径下的每个文件夹都有一个按钮。每个文件夹包含按钮上显示的图像和单击按钮时运行的文件。以下是我用于按钮的模板:

   <DataTemplate x:Key="ProgramItemDataTemplate">
        <Button Style="{StaticResource ButtonStyle}" Click="Program_Click" Tag="{Binding Key}">
            <Button.ContextMenu>
                <ContextMenu>                        
                    <MenuItem x:Name="DeleteMenuItem" Click="DeleteMenuItem_Click" Header="Delete" Tag="{Binding Key}" />
                </ContextMenu>
            </Button.ContextMenu>
            <StackPanel>
                <Image Source="{Binding Value}" MaxWidth="200" MaxHeight="175"></Image>
                <TextBlock Text="{Binding Key,Converter={StaticResource PathToNameConverter2}}" TextWrapping="Wrap" TextAlignment="Center" />
            </StackPanel>
        </Button>
    </DataTemplate>

绑定值是图像的路径,绑定键是单击按钮时运行的另一个文件的路径。问题在于DeleteMenuItem函数。我想删除包含图像的文件夹,但它不允许我删除,因为按钮正在使用图像文件。如何将图像从应用程序的使用中释放出来,以便安全地删除文件夹?

默认情况下,位图图像是
OnDemand
您可以通过拥有自己的
ValueConverter
将其更改为
OnLoad
,这将解决您的问题

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        BitmapImage image = new BitmapImage(); 
        image.BeginInit();
        image.CacheOption = BitmapCacheOption.OnLoad;
        image.UriSource = new Uri(value.ToString()); 
        image.EndInit();  
        return image;
    }

<Image Source="{Binding Path, Converter={StaticResource ImageConverter}}"/>
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性) { BitmapImage=新的BitmapImage(); image.BeginInit(); image.CacheOption=BitmapCacheOption.OnLoad; image.UriSource=新Uri(value.ToString()); image.EndInit(); 返回图像; }
确保在应用程序中的任何位置都不引用图像。当对象未被任何变量引用时,gc会将其释放。这可能是您在gc释放图像之前尝试删除文件夹时遇到的问题。工作非常顺利!非常感谢。我绝对不会想到这个,至少这个月不会!附言我喜欢你的个人资料照片。