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

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

新規登録して質問してみよう
ただいま回答率
85.50%
印刷

印刷とは、インキを用いて紙などの被印刷物に機械的に複製することを指します。現在は紙などの2次元の媒体だけでなく、3次元の曲面にも直接印刷する技術など様々な開発が進んでいます。

C#

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

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

Q&A

解決済

2回答

4632閲覧

xamlで定義したレイアウトを印刷したい

yshr3

総合スコア4

印刷

印刷とは、インキを用いて紙などの被印刷物に機械的に複製することを指します。現在は紙などの2次元の媒体だけでなく、3次元の曲面にも直接印刷する技術など様々な開発が進んでいます。

C#

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

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

1グッド

0クリップ

投稿2021/09/23 04:52

質問

請求書の印刷をするために
xamlで定義したレイアウトの帳票を出力したいと考えております。

WPF/XAMLで帳票のデザイン・印刷を行う
を参考にして作成しました。

下記ソースコードにて帳票を作成してみると
左上の隅に
「Domain.Report.BillingPageViewModel」
と表示されていて、
BillingPage.xamlで定義した内容が表示されません。

どう修正したらよいのか
教えていただけますようよろしくお願いいたします。

BillingPage.xaml

C#

1<Window x:Class="Domain.Report.BillingPage" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:Domain.Report" 7 mc:Ignorable="d" 8 Title="BillingPage" Height="450" Width="800"> 9 <Window.Resources> 10 <DataTemplate DataType="{x:Type local:BillingPageViewModel}"> 11 <Grid Margin="30"> 12 <StackPanel> 13 <TextBlock HorizontalAlignment="Center" FontSize="30" Text="ハローワールド" /> 14 <TextBlock HorizontalAlignment="Right" Text="2007/08/31" /> 15 <TextBlock Text="Hello, world!" /> 16 </StackPanel> 17 </Grid> 18 </DataTemplate> 19 </Window.Resources> 20</Window>

BillingPageViewModel.cs

C#

1namespace Domain.Report 2{ 3 public sealed class BillingPageViewModel 4 { 5 } 6}

BillingReport.cs

C#

1namespace Domain.Report 2{ 3 public sealed class BillingReport : IPaginatable 4 { 5 IReadOnlyList<object> Pages { get; } = 6 new object[] 7 { 8 new BillingPageViewModel(), 9 }; 10 11 public IReadOnlyList<object> Paginate(Size pageSize) 12 { 13 return Pages; 14 } 15 } 16}

IPaginatable.cs

C#

1namespace Domain.Report 2{ 3 public interface IPaginatable 4 { 5 IReadOnlyList<object> Paginate(Size pageSize); 6 } 7}

PaginatableExtension.cs

C#

1namespace Domain.Report 2{ 3 public static class PaginatableExtension 4 { 5 public static FixedDocument ToFixedDocument(this IPaginatable paginatable, Size pageSize) 6 { 7 var document = new FixedDocument(); 8 9 foreach (var content in paginatable.Paginate(pageSize)) 10 { 11 var presenter = 12 new ContentPresenter() 13 { 14 Content = content, 15 Width = pageSize.Width, 16 Height = pageSize.Height, 17 }; 18 19 var page = 20 new FixedPage() 21 { 22 Width = pageSize.Width, 23 Height = pageSize.Height, 24 }; 25 page.Children.Add(presenter); 26 27 page.Measure(pageSize); 28 page.Arrange(new Rect(new Point(0, 0), pageSize)); 29 page.UpdateLayout(); 30 31 var pageContent = new PageContent() { Child = page }; 32 document.Pages.Add(pageContent); 33 } 34 35 return document; 36 } 37 } 38}

印刷ボタン

C#

1 /// <summary> 2 /// 帳票印刷 3 /// </summary> 4 public DelegateCommand PrintButton { get; } 5 private void PrintButtonExecute() 6 { 7 PrintDialog printDialog = new PrintDialog(); 8 bool? result = printDialog.ShowDialog(); 9 if (!result.HasValue || !result.Value) return; 10 11 var queue = printDialog.PrintQueue; 12 var writer = PrintQueue.CreateXpsDocumentWriter(queue); 13 14 FixedDocument document = new BillingReport().ToFixedDocument(new Size(793.70, 1122.52)); 15 writer.Write(document); 16 }
TN8001👍を押しています

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

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

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

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

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

Zuishin

2021/09/23 05:57

ViewModel を Content に入れてそのまま印刷しようとしているから、ViewModel を文字列化したものが出ているように見えます。 印刷すべきは ViewModel ではなく XAML でしょう。
yshr3

2021/09/23 10:51

ご回答いただきありがとうございます。 教えていただいたことを参考に修正を試みたのですが、具体的にどう修正すればよいのか分かりませんでした。ViewModelではなくXAMLを印刷するために、どういう処理を加えればよいのか、もう少しだけ教えていただくことはできますでしょうか。 BillingReport.cs内の「new BillingPageViewModel()」を「new BillingPage()」に変更するということでしょうか。(変更したらエラーになりました。) それともPaginatableExtension.cs内の「content」に何か処理をしてからContentPresenterのContent に代入すればよいのでしょうか。 よろしくお願いいたします。
yshr3

2021/10/01 15:30

解決のためのヒントを頂けて助かりました。 ありがとうございました。
guest

回答2

0

当該記事のGitHubリンクが切れていますがHelloWorldPageViewModel等この記事特有の語句で検索すると下記が見つかります。
playground/2016-12-22-wpf-printing at main · vain0x/playground
細かくコードは見ていませんが、実行はできました。


もしかしたらこれが発展版なのかもしれません。
vain0x/DotNetKit.Wpf.Printing: Library and sample for printing with WPF
コードは見ていませんが、実行はできました。

投稿2021/09/23 05:39

編集2022/09/21 08:54
TN8001

総合スコア9244

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

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

yshr3

2021/09/23 11:02 編集

ご回答いただきありがとうございます。 >playground/2016-12-22-wpf-printing at main · vain0x/playground を確認してみましたら記事の内容と同じもののようでした。 しかし、「非推奨のため、発展版のDotNetKit.Wpf.Printingを参照してください」とのことでした。 私も実行して動作を確認してみたいと思ったのですが、 「DotNetKit.Wpf.Printing」をダウンロードし、VisualStudioで「DotNetKit.Wpf.Printing.sln」を起動して、デバックの開始では実行できませんでした。 TN8001さんが実行した方法を教えていただけますでしょうか。 よろしくお願いいたします。
TN8001

2021/09/23 11:18

スタートアップをDotNetKit.Wpf.Printing.Demoにしたぐらいで、特に何もしてないです。 > 実行できませんでした では情報不足です。 なにかエラーが出てビルドできないのか。 実行時にダイアログが出るとか、いきなり落ちるとか。 他人にも伝わる書き方をしてください。
yshr3

2021/09/24 22:01

情報不足で申し訳ありませんでした。 スタートアップをDotNetKit.Wpf.Printing.Demoにすることで実行できました。 ありがとうございます。
TN8001

2021/09/24 22:37

> 情報不足で申し訳ありませんでした。 別に怒っているわけではないので謝る必要はないです^^ 「そこがわからないと答えようがないですね」という指摘です(あらゆる可能性を羅列するわけにもいかないし^^; > スタートアップをDotNetKit.Wpf.Printing.Demoにすることで実行できました。 あ、そこでしたか。書いておけばよかったですね失礼しました。 当該ライブラリで目的が果たせたのであれば、yshr3さんの自己回答で解決済みにされても結構です(急ぐ必要はないです) もし当該ライブラリについて新たな疑問が生じた場合は、この件に関しては1番目のリンクを動かせばそれで終わりでしょうから、この質問は閉じていただいて新たな質問を立ててください。
yshr3

2021/10/01 15:29

時間はかかってしまいましたが、おかげで解決することが出来ました。 いつもありがとうございます。 これから上手に質問できるように工夫いたしますので、今後もよろしくお願いいたします。
guest

0

自己解決

色々と試行錯誤した結果、表示することが出来ました。
質問を投稿した時と今では、ソースコードが大きく変わってしまいましたので、
抽象的にはなりますが自分なりの解決方法を以下に示します。

(1)BillingPage.xamlをWindowではなくUserControlにした
(2)BillingReport.cs内の「new BillingPageViewModel()」を「new BillingPage()」に変更した
(3)BillingPage.xamlでは<UserControl.Resources><DataTemplate>は使用せずに<Grid></Grid>内に記載した。


以上の修正によって表示できたと認識していますが、
試行錯誤の末にやっと表示できたレベルですので
十分な検証はできていません。

投稿2021/10/01 15:26

yshr3

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問