1

私は自分のアプリケーションの助けを借りようとしています。documentviewerにロードしているxpsドキュメントがあります。これらのファイルはリソースファイルに埋め込まれています。

これらにbytearrayとしてアクセスできます。たとえば、Properties.Resources.help_sudoku_methods_2はbyte[]を返します

ただし、documentviewerはそれを読み取ることができず、fixeddocumentsequenceが必要です。したがって、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を埋め込みリソースからdocumentviewerにロードするためのよりクリーンな方法はありますか?または、ファイルをリソースからアプリケーションディレクトリにコピーし、メモリストリームではなくここからロードするようなものが必要ですか?ありがとうございました。

4

1 に答える 1

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);
于 2011-11-14T21:08:30.447 に答える