首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从FlowDocument转换后呈现XpsDocument时出现异常

从FlowDocument转换后呈现XpsDocument时出现异常
EN

Stack Overflow用户
提问于 2016-09-02 16:44:07
回答 1查看 323关注 0票数 0

我正在开发一个大量使用从FlowDocument到XpsDocument的转换的应用程序。有时会抛出异常: NotSupportedException:“无法识别URI前缀。”

我的场景非常复杂,我将其压缩为一个简单的测试。如果你在文本框中输入一些字符(快速),你会立即得到异常。

Xaml:

代码语言:javascript
复制
<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>

代码隐藏:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-12 22:52:51

最后,我得到了一个可以接受的解决方案。问题是我的WPF应用程序没有捕获(有吗?)未处理的异常。我在代码中启动应用程序,并在xaml文件中注册了DispatcherUnhandledException处理程序。无论如何,它没有被捕获。在运行应用程序之前,可能需要执行一些额外的步骤来初始化应用程序。我在代码中添加了DispatcherUnhandledException处理程序,现在它可以为我工作了。我不能避免异常本身,但至少我可以处理它。

致敬,Headi

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39288041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档