2011-07-27 4 views
0

J'ai un DocumentViewer avec un FixedDocument (construit en XAML) puis j'ajoute du contenu au fixedDocument dans le code et il affiche parfaitement sur l'écran.Comment supprimer FixedDocument de DocumentViewer?

Mon problème est lorsque je tente de créer un fichier XPS à partir du FixedDocument, im obtenir un « son déjà un enfant d'un autre élément » erreur.

Je ne peux pas trouver une méthode DocumentViewer.Children.Clear, Comment puis-je supprimer/détacher le FixedDocument je peux l'utiliser pour créer le fichier?

pour être complet, voici le code où im obtenir l'erreur:

public void CreateXPSFile() 
    { 
     // 1 - create xps_file   
     string OutputPath = baseDir + pathAdjust + "test.xps"; 
     using (FileStream fs = File.Create(OutputPath)) 
     { 
      ConvertToXps(fixedDocument, fs); 
     } 

     // open the document using the system default xps viewer 
     Process.Start(OutputPath); 
    } 

    public static void ConvertToXps(FixedDocument fd, Stream outputStream) 
    {   
     var package = Package.Open(outputStream, FileMode.Create); 
     var xpsDoc = new XpsDocument(package, CompressionOption.Normal); 
     XpsDocumentWriter xpsWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc); 

     // xps documents are built using fixed document sequences 
     var fixedDocSeq = new FixedDocumentSequence(); 
     var docRef = new DocumentReference(); 
     docRef.BeginInit(); 
     docRef.SetDocument(fd); 
     docRef.EndInit(); 
     ((IAddChild)fixedDocSeq).AddChild(docRef); <<<<<----- Error occurs here 

     // write out our fixed document to xps 
     xpsWriter.Write(fixedDocSeq.DocumentPaginator); 

     xpsDoc.Close(); 
     package.Close(); 
    } 

Merci

Répondre

2

Vous devriez juste être en mesure de mettre le document à null.

DocumentViewer dv; 
dv.Document = null; 
0

Étant donné que vous ne chargez pas le fichier XPS dans dv, définissez dv.Document = null; pourrait ne pas faire l'affaire. Plutôt que Process.Start (OutputPath); charger les xps en dv. Ou vous pouvez assigner le processus à un nom afin que vous puissiez le fermer. Mais je voudrais charger explicitement dans dv.

 System.Diagnostics.Process myProcess = new System.Diagnostics.Process(); 
     myProcess.StartInfo.FileName = "C:\\HelloWorld.exe"; 
     myProcess.StartInfo.CreateNoWindow = true; 
     myProcess.Start(); 
     // ... 
     myProcess.Close(); 
Questions connexes