none
DocumentViewerの見えたまま保存したい(xpsファイルを50%透過させたい) RRS feed

  • 質問

  • おせわになります。

    WPF+C#で下記の記述をしております。0404.xpsを50%の透過にして保存しなおしたいのですが、このコードで表示まではなんとか50%までいけるのですが、そこからmicrosoft xps document writerを使用してxpsを作成しても50%透過になりません。

    どなたかよい方法を伝授いただけないでしょうか?

     XpsDocument xd = new XpsDocument("0404.xps", System.IO.FileAccess.Read);
     FixedDocumentSequence fds = xd.GetFixedDocumentSequence();
     this.docViewer.Document = fds;
    this.docViewer.Opacity = 0.5;

    2015年4月5日 6:28

すべての返信

  • こんにちは。

    DocumentViewer自体を透過させてしまっては意味がないです。
    なので、方向性としてはその中に表示させるコンテンツを透過させることになると思います。

    次の例のような感じで。

    private void btnLoad_Click(object sender, RoutedEventArgs e)
    {
        XpsDocument xd = new XpsDocument("0404.xps", FileAccess.Read);
        FixedDocumentSequence fds = xd.GetFixedDocumentSequence();
        //this.docViewer.Document = fds;
        //this.docViewer.Opacity = 0.5;
        FixedDocument fd = fds.References.First().GetDocument(true);
        fd.Pages.First().GetPageRoot(true).Opacity = 0.5;
        docViewer.Document = fd;
    }

    DocumentViewerは複数のページが表示されることもありますのでいろいろ考慮するべきことはあるかもしれませんが、
    まずはこんなかんじで。

    #なお、投稿先はWPFフォーラムのほうが良かったかもしれませんね。
    #オペレータさんが気づいたら移動してくれると思います。

    2015年4月5日 9:06
    モデレータ
  • こんな

    private void Button_Click(object sender, RoutedEventArgs e) { FixedDocument newFixedDocument; if (docViewer.Document == null) { //読み込み XpsDocument originalDocument = new XpsDocument("0404.xps", System.IO.FileAccess.Read); docViewer.Document = originalDocument.GetFixedDocumentSequence(); } if (docViewer.Document is FixedDocument) { newFixedDocument = (FixedDocument)docViewer.Document; for (int i = 0; i < newFixedDocument.Pages.Count; i++) { //既存ページをそのまま編集 var pc = newFixedDocument.Pages[i]; var fixedPage = (FixedPage)pc.Child; double op = (double)fixedPage.GetValue(UIElement.OpacityProperty) * 0.5; fixedPage.SetValue(UIElement.OpacityProperty, op); } } else if(docViewer.Document is IDocumentPaginatorSource) { //切り離し用関数 var miRemoveChild = typeof(PageContent).GetMethod("RemoveLogicalChild", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); var paginator = docViewer.Document.DocumentPaginator; //別のドキュメントを作る(そのままだとページ移動のたびに再生成されてしまうので) newFixedDocument = new FixedDocument(); for (int i = 0; i < paginator.PageCount; i++) { //ページ生成 var p = paginator.GetPage(i); var fixedPage = p.Visual as FixedPage; //各ページの表示要素を既存のページから切り離し PageContent pc = (PageContent)LogicalTreeHelper.GetParent(fixedPage); miRemoveChild.Invoke(pc, new object[] { fixedPage }); //新しいページに追加 pc = new PageContent(); pc.Child = fixedPage; double op = (double)fixedPage.GetValue(UIElement.OpacityProperty) * 0.5; fixedPage.SetValue(UIElement.OpacityProperty, op); newFixedDocument.Pages.Add(pc); } } else { MessageBox.Show("非対応"); return; } //保存 Package package = Package.Open("0402_2.xps", System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite); XpsDocument docSave = new XpsDocument(package, CompressionOption.Normal); var writer = XpsDocument.CreateXpsDocumentWriter(docSave); writer.Write(newFixedDocument); package.Close(); this.docViewer.Document = newFixedDocument; }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2015年4月5日 15:35
  • 返信遅れまして申し訳ありません。

    まさに求めておりました処理です。このような短期間でのご指導大変恐縮しております。

    ありがとうございました。

    2015年4月6日 13:47
  • 返信おくれ申し訳ありません。

    ここまで手間隙かけてくださり恐縮です。大変参考になりました。

    ありがとうございました。

    2015年4月6日 13:55