質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

4211閲覧

WPF の印刷で MainWindow の <Grid> ~ </Grid> のイメージをそのまま印刷したいのですが

byori

総合スコア71

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2021/09/06 00:25

表題の通りで MainWindow の <Grid></Grid> に表示されているデータをそのまま印刷させることは可能でしょうか?そのイメージをどのように取得して印刷できますか?

xaml

1 <Grid> 2 <Grid.ColumnDefinitions> 3 <ColumnDefinition Width="8.2*"/> 4 <ColumnDefinition Width="1.7*"/> 5 <ColumnDefinition Width="0.1*"/> 6 </Grid.ColumnDefinitions> 7 8 <Grid.RowDefinitions> 9 <RowDefinition Height="Auto"/> 10 <RowDefinition Height="Auto"/> 11 <RowDefinition Height="Auto"/> 12 <RowDefinition Height="*"/> 13 </Grid.RowDefinitions> 14 15 <Border BorderBrush="Gray" BorderThickness="1" Grid.Row="0" Grid.Column="0" /> 16 <Border BorderBrush="Gray" BorderThickness="1 0 1 1" Grid.Row="1" Grid.Column="0" /> 17 <Border BorderBrush="Gray" BorderThickness="0 1 1 1" Grid.Row="0" Grid.RowSpan="2" Grid.Column="1" Grid.ColumnSpan="2" /> 18 19 <DockPanel Grid.Row="0" Grid.Column="0"> 20 <TextBlock Text="顧客名" Margin="4" FontSize="12"/> 21 <TextBox x:Name="iinCd" Margin="4" Width="200" Text=""/> 22 <TextBlock Text="標本番号" Margin="4" FontSize="12"/> 23 <TextBox x:Name="hyohon" Margin="4" Width="140" Text=""/> 24 <TextBlock Text="" Margin="4" FontSize="12"/> 25 </DockPanel> 26 <DockPanel Grid.Row="1" Grid.Column="0"> 27 <TextBlock Text="患者名" Margin="4" FontSize="12"/> 28 <TextBox x:Name="kanjaMei" Margin="4" Width="150" Text="" /> 29 <TextBlock Text="性別年齢" Margin="4" FontSize="12"/> 30 <TextBox x:Name="ageSex" Margin="4" Width="60" Text=""/> 31 <TextBlock Text="受付日" Margin="4" FontSize="12"/> 32 <TextBox x:Name="uketsukeBi" Margin="4 4 170 4" Width="100" Text="" /> 33 34 </DockPanel> 35 <DockPanel Grid.Row="0" Grid.Column="1" Grid.RowSpan="2"> 36 <StackPanel Orientation="Vertical"> 37 <Image x:Name="BarCode1" Width="160" Height="45" Margin="3" /> 38 <!-- <TextBlock Name="BarText" Margin="4" VerticalAlignment="Bottom" Width="120" FontSize="12" HorizontalAlignment="Center"/>--> 39 </StackPanel> 40 </DockPanel> 41 42 <Canvas Name="canvas1" Grid.Row="2" Grid.RowSpan="2" Grid.Column="0" Grid.ColumnSpan="2" Background="Transparent" 43 ContextMenu="{StaticResource Menu1}" MouseDown="canvas1_MouseDown" AllowDrop="True" > 44 </Canvas> 45 </Grid>

印刷方法はどのような形でもいいのですが、例えば現時点で下記のようにして page を作成しなければ・・・と思っています。表示中のビューをページとしてぶっこむ方法などありますか?

C#

1 public static void Print(System.Windows.Controls.Page page, Canvas canvus, string printerMei) 2 { 3 FixedDocument doc = new FixedDocument(); 4 5 FixedPage fp = CreateFixedPage(page, 1); 6 fp.Children.Add(canvus); 7 PageContent pc = new PageContent(); 8 pc.Child = fp; 9 doc.Pages.Add(pc); 10 11 PrintDialog dlg = new System.Windows.Controls.PrintDialog(); 12 // Create a local print server 13 LocalPrintServer ps = new LocalPrintServer(); 14 15 dlg.PrintQueue = ps.GetPrintQueue(printerMei); 16 17 if (dlg.ShowDialog() == true) 18 { 19 System.Windows.Xps.XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(dlg.PrintQueue); 20 21 doc.PrintTicket = dlg.PrintTicket; 22 23 : 24 25 26 public static System.Windows.Size PageSize { get; set; } 27 private static FixedPage CreateFixedPage(Page page, int size) 28 { 29 Action dummy = () => { }; 30 var disp = System.Windows.Threading.Dispatcher.CurrentDispatcher; 31 32 FixedPage fixpage = new FixedPage(); 33 { 34 try 35 { 36 Frame fm = new Frame(); 37 38 fm.Content = page; 39 disp.Invoke(dummy, System.Windows.Threading.DispatcherPriority.Loaded); //バインディングとかいろいろさせる必要がある場合 40 41 FixedPage.SetLeft(fm, 0); 42 FixedPage.SetTop(fm, 0); 43 44 fixpage.Children.Add(fm); 45 46 // Point 1!! XAML の画面幅を指定する。 47 fixpage.Arrange(new Rect(15, 15, PageSize.Height, PageSize.Width)); 48 49 fixpage.Width = page.Width; 50 fixpage.Height = page.Height; 51 52 fixpage.Measure(sz/*PageSize*/); 53 fixpage.Arrange(new Rect(new System.Windows.Point(), sz/*PageSize*/)); 54 fixpage.UpdateLayout(); 55 } 56 catch (Exception ex) 57 { 58 MessageBox.Show(ex.Message); 59 } 60 61 return fixpage; 62 } 63 }

Windows10 WPF C# VS2019

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2021/09/06 03:33

ソースコードのMainWindow.xamlのテキストを[取得]-[印刷]したいってことでしょうか?
byori

2021/09/06 04:02

はい、言葉足らずでしたが、 canvas1 には画像をビハインドコードから追加しています。 そのイメージとテキストを合わせてその <Grid></Grid>内の表示部分をそのままのイメージで印刷したいです。
hihijiji

2021/09/06 04:30

MainWindow.xamlはコンパイルされて実行時には残ってないのです。 Gitを使っているならそこからもらってくるのが簡単かと思います。
byori

2021/09/06 04:59

Xaml はなくなっちゃうのですね。 Git ? サンプルをパクってくること以外使ったことありません。( ̄▽ ̄) なんか、無理っぽいですね。
guest

回答1

0

自己解決

Xaml をそのまま印刷へって難しそうなので下記のように地味に書きました。

C#

1 // 印刷 2 Canvas info = MakingInformation(); 3 PrintPageModelBase.Print(info);

コントロールや画像など必要な分追加する

C#

1 private Canvas MakingInformation() 2 { 3 Canvas can = new Canvas(); 4 DockPanel dock1 = new DockPanel(); 5 dock1.Margin = new Thickness(5); 6 DockPanel dock2 = new DockPanel(); 7 dock2.Margin = new Thickness(5, 5, 5, 30); 8 9 10 var block = new TextBlock() 11 { 12 Text = "顧客名", 13 Margin = new Thickness(4, 4, 4, 4), 14 FontSize = 12, 15 }; 16 var box = new TextBox() 17 { 18 Name = "iinCd", 19 Margin = new Thickness(4, 4, 4, 4), 20 Width = 200, 21 Text = displayData.IinMei, 22 }; 23 var myBorder = new Border() 24 { 25 Background = System.Windows.Media.Brushes.LightBlue, 26 BorderBrush = System.Windows.Media.Brushes.Black, 27 Padding = new Thickness(15), 28 BorderThickness = new Thickness(2), 29 // CornerRadius = new CornerRadius(45), 30 Child = box, 31 }; 32 dock1.Children.Add(block); 33 dock1.Children.Add(myBorder); 34 35 画像など必要な分追加する 3637 38 can.Children.Add(dock1); 39 can.Children.Add(dock2); 40 retun can; 41 }

下記に渡して印刷(プレビュー)する

C#

1 class PrintPageModelBase 2 { 3 4 public static void Print(Canvas canvas) 5 { 6 // 印刷ドキュメントにキャンバスを追加 7 FixedPage page = new FixedPage(); 8 //page.Children.Add(info); 9 page.Children.Add(canvas); 10 PageContent content = new PageContent(); 11 content.Child = page; 12 FixedDocument doc = new FixedDocument(); 13 doc.Pages.Add(content); 14 15 // ドキュメントビューアコントロールを作成 16 var viewer = new DocumentViewer(); 17 viewer.HorizontalAlignment = HorizontalAlignment.Left; 18 viewer.VerticalAlignment = VerticalAlignment.Top; 19 viewer.Margin = new Thickness(0, 0, 0, 0); 20 viewer.Document = doc; 21 22 // プレビュー用のウインドウを作成 23 var previewWindow = new Window(); 24 //previewWindow.Owner = this; 25 previewWindow.Height = 800; 26 previewWindow.Width = 880; 27 28 // プレビュー用ウインドウにドキュメントビューアをセット 29 previewWindow.Content = viewer; 30 31 // プレビュー画面を表示 32 previewWindow.ShowDialog(); 33 }

投稿2021/09/07 05:12

byori

総合スコア71

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2021/09/07 09:38

どういう話か全く分かってないんですけど、PrintVisualとかじゃダメなんですか? [C# - WPFの印刷処理。キューがプリンターに送れない。|teratail](https://teratail.com/questions/345252
byori

2021/09/08 06:04

TN8001 様、いつもありがとうございます。 まさにその通りです。PrintVisual でこんなにシンプルにに印刷できるんですね。 知りませんでした、本当に助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問