문제

wpf에서 창이 릴리스 한 후 배경 이미지 파일에서 파일 잠금 장치를 해제하지 않는 WPF에 문제가 있습니다. 응용 프로그램의 다른 부분이 이미지에 쓰기를 시도하기 전에

그래서 예로서; 3 개의 Windows, 1 "메뉴"선택 창 및 기타 2 개로 구성된 WPF 앱이 있다고 가정 해 봅시다. 두 창 모두 an을 만듭니다 ImageBrush 사용 a BitmapImage 로서 ImageSource (그만큼 같은 영상).

Window A는 눌렀을 때 원본으로 사용되는 파일 위에 각각 복사하여 사용 가능한 배경 이미지를 순환하는 버튼이 있습니다. ImageSource 그리고 새로운 것을 창조합니다 ImageBrush 그리고 설정 Window.Background 새로운 브러시에.

창 b는 단순히 사용합니다 ImageBrush 그리기 Window.Background.

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

창 B가 시작되고 닫히면 창 A가 시작되고 배경이 충돌했습니다. 배경을 전환하려고하면 an이 던져집니다 IOException 왜냐하면:

"프로세스는 다른 프로세스에서 사용되기 때문에 'C : Backgrounds background.png'파일에 액세스 할 수 없습니다."

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

도움이 되었습니까?

해결책

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

그러나 BitMapImage는 BitMapCacheOption을 설정하여 즉시 비트 맵을로드하는 내장 방법이 있습니다.

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

또는

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

이렇게하면 파일 스트림을 사용하는 것처럼 비트 맵을 즉시로드하고 스트림을 명시 적으로 닫을 수 있지만 몇 가지 차이점이 있습니다.

  • 팩 : // uri와 같은 모든 URI와 함께 작동합니다.
  • XAML에서 직접 사용할 수 있습니다
  • 비트 맵은 비트 맵 캐시에 캐시되므로 동일한 URI의 향후 사용은 디스크로 이동하지 않습니다. 특정 응용 프로그램에서 이것은 나쁜 일일 수 있지만 다른 용도의 경우 바람직한 기능이 될 수 있습니다.

다른 팁

파일에서 직접 이미지를로드하고 있다고 가정합니까?

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();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top