如何从DocumentViewer中删除FixedDocument?

时间:2011-07-27 15:15:28

标签: c# wpf xps documentviewer

我有一个带有fixedDocument的DocumentViewer(在XAML中构建)然后我在代码中向fixedDocument添加内容,它在屏幕上显示完美。

我的问题是当我尝试从fixedDocument创建一个XPS文件时,我得到一个'它已经是另一个元素的子元素'错误。

我找不到DocumentViewer.Children.Clear方法,如何删除/分离fixedDocument以便我可以用它来创建文件?

为了完整性,这是我得到错误的代码:

    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();
    }

由于

2 个答案:

答案 0 :(得分:2)

您应该只能将Document设置为null。

DocumentViewer dv;
dv.Document = null;

答案 1 :(得分:0)

由于您未将XPS加载到dv中,因此设置dv.Document = null;可能不会这样做。而不是Process.Start(OutputPath);将xps加载到dv中。或者您可以将进程分配给名称,以便关闭它。但我会明确加载到dv。

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