【问题标题】:Load XPS to documentviewer from embedded resource从嵌入式资源加载 XPS 到文档查看器
【发布时间】:2011-11-13 17:42:47
【问题描述】:

我正在努力为我的申请提供帮助。我有我正在加载到 documentviewer 的 xps 文档。这些文件嵌入在资源文件中。

我能够以字节数组的形式访问这些。 例如 Properties.Resources.help_sudoku_methods_2 返回字节[]

但是,documentviewer 无法读取它并且需要固定的documentsequence。 所以我从bytearray创建内存流,然后是xpsdocument,然后是fixeddocumentsequence,如下所示:

 private void loadDocument(byte[] sourceXPS)
        {
            MemoryStream ms = new MemoryStream(sourceXPS);
            const string memoryName = "memorystream://ms.xps";
            Uri memoryUri = new Uri(memoryName);
            try
            {
                PackageStore.RemovePackage(memoryUri);
            }
            catch (Exception)
            { }

            Package package = Package.Open(ms);


            PackageStore.AddPackage(memoryUri, package);

            XpsDocument xps = new XpsDocument(package, CompressionOption.SuperFast, memoryName);

            FixedDocumentSequence fixedDocumentSequence = xps.GetFixedDocumentSequence();
            doc.Document = fixedDocumentSequence;


        }

这是非常不干净的方法,如果文件中有图像也不起作用 - 而不是新文档中的图像显示来自第一个加载的文档的图像。

有没有更简洁的方法将 XPS 从嵌入式资源加载到文档查看器?还是我需要一些想法,例如将文件从资源复制到应用程序目录并从这里加载而不是内存流?谢谢。

【问题讨论】:

标签: c# .net wpf documentviewer xpsdocument


【解决方案1】:

为什么不将文件写入系统临时文件夹,然后从那里读取。

    Stream ReadStream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("file1.xps");
        string tempFile = Path.GetTempPath()+"file1.xps"; 
        FileStream WriteStream = new FileStream(tempFile, FileMode.Create, FileAccess.Write);
        ReadStream.CopyTo(WriteStream);
        WriteStream.Close();
        ReadStream.Close();

        // Read tempFile INTO memory here and then

        File.Delete(tempFile);

【讨论】:

  • 谢谢,这和我最后的结局很相似。我在我的文件夹应用程序中创建了 helf 文件夹,在第一次运行或丢失文件时,我将嵌入式 xps 写入该文件夹,然后从此处读取。
猜你喜欢
  • 1970-01-01
  • 2011-11-30
  • 2011-02-04
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
相关资源
最近更新 更多