2012-10-09 2 views
2

나는 다음과 같은 코드를 사용하여 내 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)에 결합하는 다음과 같은 방법으로 일을하고 이미지를 설정하고있다이 오래된 이미지를 삭제해야합니다 후 다른 이미지를 업로드 할 경우 :

그러나 예외가 발생했습니다. 다른 프로세스에서 사용하는 파일을 삭제할 수 없습니다. 어떻게 삭제합니까?

+0

TwoWay Binding을 사용하지 않으셨습니까? 또 다른 해결 방법은 경로를 직접 설정하지 않고 경로에서 BitmapImage를 만들고 해당 비트 맵 이미지에 바인딩하는 것입니다. – Akku

+0

하는 방법. WPF.any 코드 예제 – SST

+0

에서 초보자입니다. 죄송합니다. 시간이 없으면 Google을 사용하십시오. – Akku

답변

6

이미지가 ImageControl에 표시되어있는 동안 이미지를 삭제하려면 BitmapCacheOption.OnLoad이 설정된 새 BitmapImage 또는 BitmapFrame 개체를 만들어야합니다. 그러면 비트 맵이 즉시 파일에서로드되고 나중에 파일이 잠기지 않습니다.

ImageSource TemplateImagestring TemplateImagePath에서 속성을 변경하고 다음과 같이 결합

:

<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 속성에 바인딩을 계속 유지하려면 위의 그림과 같이 문자열을 ImageSource로 변환하는 binding converter을 사용할 수 있습니다.

+0

고마워요 ..이게 정말 잘됐다. – SST

+2

또한 'System.GC.Collect(); System.GC.WaitForPendingFinalizers(); ' 이 줄 앞에있는 파일을 삭제하기 전에 : File.Delete (item.FullName) – SST

+0

'GC.Collect();'가 추가되었습니다. 및 'GC.WaitForPendingFinalizers();' 삭제하기 전에 내 문제를 해결했습니다. @SST – Sandwich

관련 문제