从 FlowDocument 转换后呈现 XpsDocument 时出现异常
Exception while rendering XpsDocument after conversion from FlowDocument
我正在开发一个大量使用从 FlowDocument 到 XpsDocument 的转换的应用程序。有时会抛出异常:
NotSupportedException:"The URI prefix is not recognized."
我的场景非常复杂,我将其浓缩为一个简单的测试。如果您在文本框中输入一些字符(快速),您将立即得到异常。
Xaml:
<Window x:Class="FlowDocPreview.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<RichTextBox Name="rtb" KeyUp="rtb_KeyUp" />
<DocumentViewer Grid.Column="1" Name="dv" />
</Grid>
</Window>
后面的代码:
using System;
using System.IO;
using System.IO.Packaging;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Xps;
using System.Windows.Xps.Packaging;
namespace FlowDocPreview
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
rtb.Document = new FlowDocument();
}
Uri _packageUri = null;
private void rtb_KeyUp(object sender, KeyEventArgs e)
{
using (MemoryStream ms = new MemoryStream())
{
dv.Document = null;
if (_packageUri != null)
{
PackageStore.RemovePackage(_packageUri);
}
_packageUri = new Uri("memorystream://" + DateTime.Now.Ticks + ".xps");
TextRange sourceContent = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
MemoryStream stream = new MemoryStream();
sourceContent.Save(stream, DataFormats.Xaml);
FlowDocument flowDocumentCopy = new FlowDocument();
TextRange copyDocumentRange = new TextRange(flowDocumentCopy.ContentStart, flowDocumentCopy.ContentEnd);
copyDocumentRange.Load(stream, DataFormats.Xaml);
Package package = Package.Open(ms, FileMode.OpenOrCreate, FileAccess.ReadWrite);
PackageStore.AddPackage(_packageUri, package);
XpsDocument xpsDoc = new XpsDocument(package, CompressionOption.SuperFast);
xpsDoc.Uri = _packageUri;
XpsDocumentWriter documentWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
documentWriter.Write(((IDocumentPaginatorSource)flowDocumentCopy).DocumentPaginator);
dv.Document = xpsDoc.GetFixedDocumentSequence();
}
}
}
}
该异常无法捕获(参考 https://social.msdn.microsoft.com/Forums/windows/en-US/431e8e80-3bf0-4679-a0c0-9b5cae4f2f38/systemnotsupportexception-the-uri-prefix-is-not-recognized-when-creating-xps-document?forum=netfxbcl )或提前阻止(包似乎正确存在)。我检查了 .net 代码,没有发现这种奇怪行为的原因。我总共花了一天甚至几周的时间来找到修复方法。
有什么想法吗?问候,Heady
终于找到了一个可以忍受的解决方案。问题是我的 WPF 应用程序没有捕获(任何?)未处理的异常。我在代码中启动我的应用程序,并在 xaml 文件中注册了 DispatcherUnhandledException 处理程序。反正没抓到。也许在 运行 之前有一些额外的步骤来初始化应用程序。我在代码中添加了 DispatcherUnhandledException 处理程序,现在它对我有用。我无法避免异常本身,但至少我可以处理它。
此致,
海地
我正在开发一个大量使用从 FlowDocument 到 XpsDocument 的转换的应用程序。有时会抛出异常: NotSupportedException:"The URI prefix is not recognized."
我的场景非常复杂,我将其浓缩为一个简单的测试。如果您在文本框中输入一些字符(快速),您将立即得到异常。
Xaml:
<Window x:Class="FlowDocPreview.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<RichTextBox Name="rtb" KeyUp="rtb_KeyUp" />
<DocumentViewer Grid.Column="1" Name="dv" />
</Grid>
</Window>
后面的代码:
using System;
using System.IO;
using System.IO.Packaging;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Xps;
using System.Windows.Xps.Packaging;
namespace FlowDocPreview
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
rtb.Document = new FlowDocument();
}
Uri _packageUri = null;
private void rtb_KeyUp(object sender, KeyEventArgs e)
{
using (MemoryStream ms = new MemoryStream())
{
dv.Document = null;
if (_packageUri != null)
{
PackageStore.RemovePackage(_packageUri);
}
_packageUri = new Uri("memorystream://" + DateTime.Now.Ticks + ".xps");
TextRange sourceContent = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
MemoryStream stream = new MemoryStream();
sourceContent.Save(stream, DataFormats.Xaml);
FlowDocument flowDocumentCopy = new FlowDocument();
TextRange copyDocumentRange = new TextRange(flowDocumentCopy.ContentStart, flowDocumentCopy.ContentEnd);
copyDocumentRange.Load(stream, DataFormats.Xaml);
Package package = Package.Open(ms, FileMode.OpenOrCreate, FileAccess.ReadWrite);
PackageStore.AddPackage(_packageUri, package);
XpsDocument xpsDoc = new XpsDocument(package, CompressionOption.SuperFast);
xpsDoc.Uri = _packageUri;
XpsDocumentWriter documentWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
documentWriter.Write(((IDocumentPaginatorSource)flowDocumentCopy).DocumentPaginator);
dv.Document = xpsDoc.GetFixedDocumentSequence();
}
}
}
}
该异常无法捕获(参考 https://social.msdn.microsoft.com/Forums/windows/en-US/431e8e80-3bf0-4679-a0c0-9b5cae4f2f38/systemnotsupportexception-the-uri-prefix-is-not-recognized-when-creating-xps-document?forum=netfxbcl )或提前阻止(包似乎正确存在)。我检查了 .net 代码,没有发现这种奇怪行为的原因。我总共花了一天甚至几周的时间来找到修复方法。
有什么想法吗?问候,Heady
终于找到了一个可以忍受的解决方案。问题是我的 WPF 应用程序没有捕获(任何?)未处理的异常。我在代码中启动我的应用程序,并在 xaml 文件中注册了 DispatcherUnhandledException 处理程序。反正没抓到。也许在 运行 之前有一些额外的步骤来初始化应用程序。我在代码中添加了 DispatcherUnhandledException 处理程序,现在它对我有用。我无法避免异常本身,但至少我可以处理它。
此致, 海地