2011-07-26 3 views
4

사용자 하드 드라이브의 특정 경로 아래에 각 폴더에 대한 버튼이있는 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 함수입니다. 이미지가 들어있는 폴더를 삭제하고 싶지만 이미지 파일이 버튼에 사용 중이므로 절 보내지 않을 것입니다. 폴더를 안전하게 지울 수 있도록 응용 프로그램에서 이미지를 사용하지 못하게하려면 어떻게해야합니까?

+0

당신이 어느 곳 application.When에서 개체가 여기에 당신이 GC 릴리스하기 전에 폴더를 삭제하려고하는 문제 자자 어떤 변수 GC 자료에 의해 참조되지 않는 이미지를 참조하지 않는 있는지 확인 영상. – maniacneron

답변

4

기본적으로 BitmapImage의 BitmapCacheOptionOnDemand입니다. 으로 변경할 수 있으며 사용자의 ValueConverter이 문제를 해결할 수 있습니다.

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}}"/> 
+0

매력처럼 일했습니다! 엄청 고마워. 나는 분명히 이것을 생각하지 않았을 것입니다, 적어도 이번 달은 아닙니다! 추신 : 나는 당신의 프로필 사진을 좋아합니다. – AdmSteck

관련 문제