2012-05-02 2 views
4

WPF 응용 프로그램에서 FlowDocument을 XAML 마크 업을 문자열로 작성한 다음 XamlReader.Parse을 사용하여 FlowDocument 개체로 바꾼 다음, 그런 다음 XPS 문서 파일에 저장합니다. 그것은 작동합니다.WPF에서 XPS 만들기 - 내 응용 프로그램이 종료 될 때까지 사용 된 이미지 파일이 잠겨 있습니다.

내 문서에 이미지를 포함해야하므로이를 수행하기 위해 이미지를 임시 디렉토리에 임시 파일로 저장 한 다음 절대 경로로 FlowDocument의 XAML로 참조하십시오. 이것은 또한 작동합니다 - XPS 문서 작성 프로세스 중에 이미지가 실제로 XPS 문서에 임베딩되는 방식입니다.

하지만 문제는 내 앱이 앱이 종료 될 때까지이 이미지에 파일 잠금을 유지한다는 것입니다.

모든 리소스를 정리하고 있습니다. 생성 된 XPS 파일에는 이미지 잠금 파일이 없습니다. XPS 파일을 만드는 코드의 일부를 주석 처리하면 이미지 파일이 잠기지 않습니다.

내 코드 (나는 .NET 4 CP에있어) :

var xamlBuilder = new StringBuilder(); 

// many lines of code like this 
xamlBuilder.Append(...); 

// create and save image file 
// THE IMAGE AT THE PATH imageFilePath IS GETTING LOCKED 
// AFTER CREATING THE XPS FILE 
var fileName = string.Concat(Guid.NewGuid().ToString(), ".png"); 
var imageFilePath = string.Format("{0}{1}", Path.GetTempPath(), fileName); 
using (var stream = new FileStream(imageFilePath, FileMode.Create)) { 
    var encoder = new PngBitmapEncoder(); 
    using (var ms = new MemoryStream(myBinaryImageData)) { 
    encoder.Frames.Add(BitmapFrame.Create(ms)); 
    encoder.Save(stream); 
    } 
    stream.Close(); 
} 

// add the image to the document by absolute path 
xamlBuilder.AppendFormat("<Paragraph><Image Source=\"{0}\" ...", imageFilePath); 

// more lines like this 
xamlBuilder.Append(...); 

// create a FlowDocument from the built string 
var document = (FlowDocument) XamlReader.Parse(xamlBuilder.ToString()); 

// set document settings 
document.PageWidth = ...; 
... 

// save to XPS file 
// THE XPS FILE IS NOT LOCKED. IF I LEAVE OUT THIS CODE 
// AND DO NOT CREATE THE XPS FILE, THEN THE IMAGE IS NOT LOCKED AT ALL 
using (var xpsDocument = new XpsDocument(filePath, FileAccess.ReadWrite)) { 
    var documentWriter = XpsDocument.CreateXpsDocumentWriter(xpsDocument); 
    documentWriter.Write(((IDocumentPaginatorSource) document).DocumentPaginator); 
    xpsDocument.Close(); 
} 

(사실, 임시 디렉토리에 동적으로 생성 된 이미지가 무관의의 사실 -이 문제가 발생하는 경우 I 하드 코드 내 컴퓨터에있는 이미지 파일의 경로 - 잠길 것입니다.)

파일 잠금을 야기하는 XPS 생성 코드에 버그가 있다고 생각합니다.

내가 시도할만한 것이 있습니까? 또는 코드를 통해 파일 잠금을 제거하는 방법?

+0

내가 같은 문제를 가지고하는 데 사용됩니다. 나는 어떻게 든 그것을 해결했다. 어딘가 물어 본 질문을 찾을 수 있는지 보도록하겠습니다. Freeze() 메서드를 사용하여 이미지를 고정하는 것과 관련이 있다고 생각합니다. –

+0

FlowDocument 마크 업에서 poze : Freeze = "True"속성 (루트 태그의 xmlns : po 선언 포함)을 추가하려고 시도했지만 불행하게도 작동하지 않았습니다. – Ross

+0

이미지를 다음과 같이 선언하려 했습니까?

답변

2

이 대신처럼 XAML을 변경할 수 있습니다 : 기본값은 유지 될 것으로 보인다으로

<Image> 
    <Image.Source> 
     <BitmapImage CacheOption="None" UriSource="your path" /> 
    </Image.Source> 
</Image> 

에서, XAML Builder는 이미지 파일을로드하는 방법을 지정하려면 CacheOption 매개 변수와 함께 플레이 할 수 있도록 그것 (GC가 그것의 일을하는 것을 기다리는 것)에 자물쇠. 여기

는 SO에 여기에 몇 가지 관련 질문 : How do you make sure WPF releases large BitmapSource from Memory?

+1

OnLoad CaheOption이 작동했습니다. 감사! – Ross

관련 문제