2009-11-02 4 views
3

WPF에서 응용 프로그램의 다른 부분이 이미지에 쓰려고 시도하기 전에 창을 닫은 후에 배경 이미지 파일에 파일 잠금이 해제되지 않는 문제가 있습니다.창 배경 이미지 삭제 WPF

예를 들어, 3 개의 창, 1 개의 "메뉴"선택 창 및 2 개의 다른 창으로 구성된 WPF 응용 프로그램이 있다고 가정 해보십시오. 두 창 모두 ImageSource (과 동일 이미지)으로 BitmapImage을 사용하여 ImageBrush을 만듭니다.

창 A는 버튼이 그 누르면 원래 ImageSource으로 사용되는 파일을 통해 그들 각각을 복사하고 새로운 ImageBrush를 만들고 새로운 브러시로 Window.Background를 설정하여 사용할 수있는 배경 이미지를 통해 순환합니다.

창 B는 ImageBrush을 사용하여 Window.Background을 그립니다.

창 A가 시작되면 배경이 전환되고 닫히고 창 B가 시작되면 모든 것이 정상입니다.

창 B가 시작되고 닫히면 창 A가 시작되고 배경 전환으로 충돌이 발생합니다. 배경을 바꾸려고하면 IOException이 표시됩니다.

"다른 프로세스에서 사용 중이므로 'C : \ Backgrounds \ Background.png'파일에 액세스 할 수 없습니다."

그래서 창 B는 여전히 어떻게 든 그것을 잡고 있어야합니다!? 나는 그 문제를 치료하는지 알기 위해 GC.Collect(); GC.WaitForPendingFinalizers();을 시도했지만 시도하지는 않습니다.

답변

4

토마스 준 대답은 정확하고 파일 경로가있는 경우 잘 작동하지 않습니다 비트 맵을 캐시하고 XAML을 사용하지 않으려합니다.

BitmapImage img = new BitmapImage { CacheOption = BitmapCacheOption.OnLoad }; 
img.BeginInit(); 
img.UriSource = imageUrl; 
img.EndInit(); 

또는

<BitmapImage CacheOption="OnLoad" UriSource="..." /> 

이 즉시 명시 적으로 비트 맵을로드합니다 : 또한 BitmapImage는 BitmapCacheOption을 설정하여 즉시 비트 맵을로드 할 내장 방법이 언급되어야한다 그러나

스트림을 닫으십시오. FileStream을 사용하는 것과 마찬가지로 몇 가지 차이점이 있습니다.

  • pack : // Uri와 같은 모든 Uri에서 작동합니다.
  • XAML에서 직접 사용할 수 있습니다.
  • 비트 맵은 비트 맵 캐시에 캐시되므로 나중에 같은 Uri를 사용하면 디스크로 이동하지 않습니다. 귀하의 특정 응용 프로그램에서 이것은 나쁜 일이 될 수 있지만 다른 용도로는 바람직한 기능 일 수 있습니다.
+0

그것은 멋지다, 당신에게 양쪽 다 감사해라! – Siyfion

2

파일에서 직접 이미지를로드한다고 가정합니다.

BitmapImage img = new BitmapImage(); 
img.BeginInit(); 
img.UriSource = imageUrl; 
img.EndInit(); 

대신 스트림에서로드 해보십시오. 파일이 잠겨 있지 있도록 이미지 후에 스트림을 직접 닫을 수있는 방법은로드 :

BitmapImage img = new BitmapImage(); 
using (FileStream fs = File.OpenRead(imageFilePath) 
{ 
    img.BeginInit(); 
    img.StreamSource = fs; 
    img.EndInit(); 
} 
+0

사실 그것은 그보다 더 나빴습니다. backgroundBrush.ImageSource = new BitmapImage (new Uri (Constants.ShellLocation + @ "Background \ TempBkgrnd.png", UriKind.Absolute)); – Siyfion