2016-09-02 2 views
0

Я разрабатываю приложение, которое сильно использует преобразование из FlowDocument в XpsDocument. Время от времени генерируется исключение: NotSupportedException: «Префикс URI не распознается».Исключение при рендеринге XpsDocument после преобразования из FlowDocument

Мой сценарий очень сложный, и я сконденсировал его до простого теста. Если вы введете несколько символов в текстовое поле (быстро), вы получите исключение немедленно.

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

+0

ли это происходит только тогда, когда вы печатаете быстро? –

+0

Да в этом примере. Но это случается нечасто, даже если я использую его один раз в минуту. Приложение используется продуктивно, и мы получаем ошибку один раз в неделю. – Headi

ответ

0

Наконец-то я получил приемлемое решение. Проблема заключалась в том, что мое приложение WPF не уловило (никаких?) Необработанных исключений. Я запускаю свое приложение в коде, а в файле xaml я зарегистрировал обработчик DispatcherUnhandledException. Во всяком случае, это не поймало. Возможно, есть несколько дополнительных шагов, которые инициализируют приложение перед его запуском. Я добавил обработчик DispatcherUnhandledException в код, теперь он работает для меня. Я не могу избежать самого исключения, но, по крайней мере, я могу справиться с этим.

С уважением, Headi

Смежные вопросы