在WPF中创建XPS-已使用的图像文件将被锁定,直到我的应用程序退出
在我的WPF应用程序中,我正在创建一个在WPF中创建XPS-已使用的图像文件将被锁定,直到我的应用程序退出,wpf,flowdocument,xps,file-locking,Wpf,Flowdocument,Xps,File Locking,在我的WPF应用程序中,我正在创建一个FlowDocument,方法是将其XAML标记构建为字符串,然后使用XamlReader.Parse将字符串转换为FlowDocument对象,然后将其保存到XPS文档文件中。它起作用了 我需要在我的文档中包含一个图像,为了实现这一点,我在temp目录中创建并保存一个临时文件,然后在我的FlowDocument的XAML中使用绝对路径引用它。这同样有效-在XPS文档创建过程中,图像实际上嵌入到XPS文档中,这非常好 但问题是,我的应用程序在此图像上保留文件
FlowDocument
,方法是将其XAML标记构建为字符串,然后使用XamlReader.Parse
将字符串转换为FlowDocument
对象,然后将其保存到XPS文档文件中。它起作用了
我需要在我的文档中包含一个图像,为了实现这一点,我在temp目录中创建并保存一个临时文件,然后在我的FlowDocument
的XAML中使用绝对路径引用它。这同样有效-在XPS文档创建过程中,图像实际上嵌入到XPS文档中,这非常好
但问题是,我的应用程序在此图像上保留文件锁定,直到应用程序退出。
我正在清理所有资源。生成的XPS文件上没有文件锁定-只有图像文件。如果注释掉创建XPS文件的代码部分,则图像文件不会被锁定
我的代码(我在.NET 4 CP上):
var xamlBuilder=new StringBuilder();
//像这样的代码行很多
xamlBuilder.Append(…);
//创建并保存图像文件
//路径imageFilePath处的图像被锁定
//创建XPS文件后
var fileName=string.Concat(Guid.NewGuid().ToString(),“.png”);
var imageFilePath=string.Format(“{0}{1}”,Path.GetTempPath(),文件名);
使用(var stream=newfilestream(imageFilePath,FileMode.Create)){
var encoder=新的PngBitmapEncoder();
使用(var ms=new MemoryStream(myBinaryImageData)){
编码器.Frames.Add(BitmapFrame.Create(ms));
编码器。保存(流);
}
stream.Close();
}
//按绝对路径将图像添加到文档中
xamlBuilder.AppendFormat(“您可以这样更改xaml:
<Image>
<Image.Source>
<BitmapImage CacheOption="None" UriSource="your path" />
</Image.Source>
</Image>
为了能够使用CacheOption
参数,指定Xaml构建器应该如何加载图像文件,因为默认值似乎是对其保持锁定(似乎是等待GC完成其工作)
这里有一些相关的问题:我曾经有过同样的问题。我以某种方式解决了它。让我看看我是否能在某处找到我问的问题(如果我在这里问的话)。我认为这与使用Freeze()
方法冻结图像有关。在FlowDocument标记中,我尝试添加po:Freeze=“True”“属性(在根标记中使用xmlns:po声明)-很遗憾不起作用。您是否尝试过像这样声明图像:谢谢Simon。很遗憾,“None”对CacheOption不起作用。但它导致我搜索到以下页面:,在该页面中,用户使用“OnLoad”防止文件锁定”CacheOption。所以我做了,它工作了!太棒了。顺便说一句,输入答案,我会奖励赏金,如果没有你的输入,我是不会明白的。
<Image>
<Image.Source>
<BitmapImage CacheOption="None" UriSource="your path" />
</Image.Source>
</Image>