42章:WPFでの印刷(2) (C#)

    作成2013.04.30

     WPFアプリケーションにおける印刷に関しては、わかりやすい事例が見つかりませんでした。
  1. 参照元情報
     印刷の概要は
    「印刷の概要」にジャンプする
     XpsDocumentWriterクラスを使用するのがスマートのようです。

  2. WPFでの印刷(2) (C#)
     XpsDocumentWriterクラスを試行錯誤的に試した結果です。
     ダウンロード後は解凍してから使用してください。
      [WPFでの印刷(2) (C#) ]をダウンロードする。
     解凍すると「42WPF_Printing2」フォルダーがあります。
    注(1)「41WPF_Printing2」フォルダーの「WPF_Printing2.sln」ファイルをダブルクリックすると「Microsoft Visual Basic 2010 Express」が起動します。
    注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。
    注(3)「ソリューションエクスプローラ」ウインドウ内の「MainWindow.xaml」をダブルクリックすると「デザイン」と「XAML」が表示されます。
    注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。
    注(5)「WPF_Printing2.sln」の動作確認は「デバッグ」_「デバッグ開始」で実行します。デバッグ機能を用いて動作確認を行います。


  3. WPF_Printing2.slnの実行
    (1)「Microsoft Visual Basic 2010 Express」のデバッグ機能を使用します。
    (2)「デバッグ」_「デバッグ開始」を選択します。
    (3)図形がはいった印刷画面が表示されます。
    (4)印刷ボタンを押すと印刷が実行されます。
    (5)クローズボックスで終了します。


  4. プロジェクトの構成
    (1)XAMLコードとコードで構成されます。


  5. MainWindow.xamlの全コード
    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="401" Width="522">
        <Grid>
            <Grid Name="Grid1" Margin="0,25,0,0">
                <Ellipse Height="50" HorizontalAlignment="Left" Margin="65,91,0,0" Name="Ellipse1" Stroke="Black" VerticalAlignment="Top" Width="93" Fill="BlueViolet" />
                <Label Content="Label" Height="28" HorizontalAlignment="Left" Margin="225,167,0,0" Name="Label1" VerticalAlignment="Top" />
                <Rectangle Height="56" HorizontalAlignment="Left" Margin="264,85,0,0" Name="Rectangle1" Stroke="Black" VerticalAlignment="Top" Width="101" Fill="Magenta" />
            </Grid>
            <StackPanel Height="25" HorizontalAlignment="Left" Name="StackPanel1" VerticalAlignment="Top">
                <Button Content="印刷" Height="23" Name="Button1" Width="75" />
            </StackPanel>
        </Grid>
    </Window>
    


  6. XAMLのポイント
    (1)一般的な記載のみです。


  7. MainWindow.xaml.csの全コード
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Shapes;
    using System.Windows.Xps;
    using System.Printing;
    using System.Windows.Markup;
    
    namespace WPF_Printing2
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button1_Click(object sender, RoutedEventArgs e)
            {
                FixedPage page = new FixedPage();
                PageContent content1 = new PageContent();
                FixedDocument doc =new FixedDocument();
                page.Width = 120 * 96 / 25.4;
                page.Height = 70 * 96 / 25.4;
                Ellipse Ellipse2 = new Ellipse();
                CopyEllipse(Ellipse1, Ellipse2);
                page.Children.Add(Ellipse2);
                Rectangle Rectangle2 = new Rectangle();
                page.Children.Add(Rectangle2);
                CopyRectangle(Rectangle1, Rectangle2);
                Label Label2 = new Label();
                CopyLabel(Label1, Label2);
                page.Children.Add(Label2);
    
                ((IAddChild)content1).AddChild(page);
                doc.Pages.Add(content1);
                PrintDocumentImageableArea imgArea=null;
                XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(ref imgArea);
                if (writer != null)
                {
                    writer.Write(doc);
                }
            }
    
            void CopyEllipse(Ellipse Ellipse1  , Ellipse Ellipse2)
            {
                Ellipse2.Height = Ellipse1.Height;
                Ellipse2.HorizontalAlignment = Ellipse1.HorizontalAlignment;
                Ellipse2.Margin = Ellipse1.Margin;
                Ellipse2.Stroke = Ellipse1.Stroke;
                Ellipse2.VerticalAlignment = Ellipse1.VerticalAlignment;
                Ellipse2.Width = Ellipse1.Width;
                Ellipse2.Fill = Ellipse1.Fill;
            }
    
            void CopyRectangle(Rectangle Rectangle1, Rectangle Rectangle2)
            {
                Rectangle2.Height = Rectangle1.Height;
                Rectangle2.HorizontalAlignment = Rectangle1.HorizontalAlignment;
                Rectangle2.Margin = Rectangle1.Margin;
                Rectangle2.Stroke = Rectangle1.Stroke;
                Rectangle2.VerticalAlignment = Rectangle1.VerticalAlignment;
                Rectangle2.Width = Rectangle1.Width;
                Rectangle2.Fill = Rectangle1.Fill;
            }
    
            void CopyLabel(Label Label, Label Label2)
            {
                Label2.Content = Label1.Content;
                Label2.Height = Label1.Height;
                Label2.HorizontalAlignment = Label1.HorizontalAlignment;
                Label2.Margin = Label1.Margin;
                Label2.VerticalAlignment = Label1.VerticalAlignment;
            }
        }
    }
    


  8. コードの解説
    (1)using System.Windows.Xps;とusing System.Printing;とusing System.Windows.Markup;が必要です。
    (2)FixedPage page = new FixedPage();で変数pageをFixedPage型で生成します。
    (3)PageContent content1 = new PageContent();で変数content1をPageContent型で生成します。
    (4)FixedDocument doc =new FixedDocument();で変数docをFixedDocument型で生成します。
    (5)page.Widthとpage.Height;でページサイズを決定します。
    (6)CopyEllipse(Ellipse1, Ellipse2);で図形をコピーします。(独自定義にルーチンです。)
    (7)page.Children.Add;でpageに図形を加えます。
    (8)((IAddChild)content1).AddChild(page);でcontent1にpageを加えます。
    (9)doc.Pages.Add(content1);でdocにcontent1を加えます。
    (10)XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(ref imgArea);でプリントダイアログをひらきます。
    (11)writer.Write(doc);はプリントダイアログで印刷が選択された場合に実行します。


    感想:
    (1)やっとスマートな印刷処理となったようです。
    (2)C#では、PrintQueue.CreateXpsDocumentWriter(ref imgArea);でrefを使用する必要があるようです。
    (3)Grid1に登録された図形は、Grid1から切り離すか、コピーしないとpageに登録できないようです。
    (4)Grid1から切り離すと戻すのが面倒なので、図形のコピーを採用しました。図形コピーの標準関数がよくわからないので、独自に定義したルーチンとしました。(もっとスマートなコピー方法があるような気がします。)







43章:WPFでの印刷(3) (C#)に行く。

トップページに戻る。