Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在WPF中创建XPS-已使用的图像文件将被锁定,直到我的应用程序退出_Wpf_Flowdocument_Xps_File Locking - Fatal编程技术网

在WPF中创建XPS-已使用的图像文件将被锁定,直到我的应用程序退出

在WPF中创建XPS-已使用的图像文件将被锁定,直到我的应用程序退出,wpf,flowdocument,xps,file-locking,Wpf,Flowdocument,Xps,File Locking,在我的WPF应用程序中,我正在创建一个FlowDocument,方法是将其XAML标记构建为字符串,然后使用XamlReader.Parse将字符串转换为FlowDocument对象,然后将其保存到XPS文档文件中。它起作用了 我需要在我的文档中包含一个图像,为了实现这一点,我在temp目录中创建并保存一个临时文件,然后在我的FlowDocument的XAML中使用绝对路径引用它。这同样有效-在XPS文档创建过程中,图像实际上嵌入到XPS文档中,这非常好 但问题是,我的应用程序在此图像上保留文件

在我的WPF应用程序中,我正在创建一个
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>