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 생성 코드에 버그가 있다고 생각합니다.
내가 시도할만한 것이 있습니까? 또는 코드를 통해 파일 잠금을 제거하는 방법?
내가 같은 문제를 가지고하는 데 사용됩니다. 나는 어떻게 든 그것을 해결했다. 어딘가 물어 본 질문을 찾을 수 있는지 보도록하겠습니다. Freeze() 메서드를 사용하여 이미지를 고정하는 것과 관련이 있다고 생각합니다. –
FlowDocument 마크 업에서 poze : Freeze = "True"속성 (루트 태그의 xmlns : po 선언 포함)을 추가하려고 시도했지만 불행하게도 작동하지 않았습니다. – Ross
이미지를 다음과 같이 선언하려 했습니까? Image.Source> –