2012年12月10日月曜日

Visual をXPSファイルに保存する

Canvas に TextBlock、Button、Ellipse を追加して、CanvasをXPSファイルに保存します。
  1. ファイル名を指定して、XpsDocumentオブジェクトを作成。
  2. XpsDocument.CreateXpsDocumentWriter を使って、1.で作成した XpsDocumentオブジェクトから、XpsDocumentWriter オブジェクトを作成。
  3. 2.で作成した XpsDocumentWriterオブジェクトの CreateVisualsCollatorメソッドで、VisualsToXpsDocumentオブジェクトを作成。
  4. 3.で作成した VisualsToXpsDocumentオブジェクトの Writeメソッドで、書き込みたいVisual オブジェクト を指定して書き込み。 

using (XpsDocument xpsdoc = new XpsDocument(sfd.FileName, FileAccess.Write)) //1
{
   XpsDocumentWriter xpsdw = XpsDocument.CreateXpsDocumentWriter(xpsdoc); //2
   VisualsToXpsDocument vToXpsD = (VisualsToXpsDocument)xpsdw.CreateVisualsCollator(); //3
   vToXpsD.Write(this.canvas1); //4
   vToXpsD.EndBatchWrite();
}




保存したファイルをXPSビューアーで開いてみます。画面のハードコピーではないので、拡大しても滑らかです。


MainWindow.xaml

<Window x:Class="SaveXps.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="200" Width="300">
    <Window.CommandBindings>
        <CommandBinding Command="SaveAs" Executed="SaveAsCommandHandler" />
    </Window.CommandBindings>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Menu Grid.Row="0">
            <MenuItem Command="SaveAs"/>
        </Menu>
        <Canvas Grid.Row="1" Name="canvas1">
            <TextBlock>Canvas上のTextBlock</TextBlock>
            <Button Canvas.Top="10" Canvas.Left="20">ボタン</Button>
            <Ellipse Canvas.Top="10" Canvas.Left="10" Stroke="Black" Width="30" Height="30" />
        </Canvas>
    </Grid>
</Window>

MainWindow.xaml.cs

using Microsoft.Win32;
using System.IO;
using System.Windows;
using System.Windows.Input;
using System.Windows.Xps;
using System.Windows.Xps.Packaging;

namespace SaveXps
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void SaveAsCommandHandler(object sender, ExecutedRoutedEventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            if (sfd.ShowDialog() == true)
            {
                using (XpsDocument xpsdoc = new XpsDocument(sfd.FileName, FileAccess.Write))
                {
                    XpsDocumentWriter xpsdw = XpsDocument.CreateXpsDocumentWriter(xpsdoc);
                    VisualsToXpsDocument vToXpsD = (VisualsToXpsDocument)xpsdw.CreateVisualsCollator();
                    vToXpsD.Write(this.canvas1);
                    vToXpsD.EndBatchWrite();
                }
            }
        }
    }
}

0 件のコメント:

コメントを投稿