回答編集履歴

4

VisualBrush

2024/11/16 16:15

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -1,3 +1,9 @@
1
+ # 追記
2
+ `VisualBrush`を使用するほうがスマートだったかもしれません。
3
+ [WPFでプリントしたい](https://teratail.com/questions/48084#reply-h65xhlz4tdgqrt)
4
+
5
+ ---
6
+
1
7
  注)プリンタが手元にないので未確認です。
2
8
 
3
9
  そのエラーはすでにウィンドウ等にAddされているコントロール(`canvas1`)を、別のものにAddしようとしたためです。

3

見直しキャンペーン中

2023/08/14 09:41

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -1,6 +1,6 @@
1
1
  注)プリンタが手元にないので未確認です。
2
2
 
3
- そのエラーはすでにウィンドウ等にAddされているコントロール(canvas1)を、別のものにAddしようとしたためです。
3
+ そのエラーはすでにウィンドウ等にAddされているコントロール(`canvas1`)を、別のものにAddしようとしたためです。
4
4
  そのため参考記事ではすべてコードで作成しています。
5
5
 
6
6
  `RemoveLogicalChild`で切ることはできると思いますが、切ると当然表示も消えます。

2

見直しキャンペーン中

2023/07/27 15:46

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -1,199 +1,100 @@
1
1
  注)プリンタが手元にないので未確認です。
2
2
 
3
-
4
-
5
3
  そのエラーはすでにウィンドウ等にAddされているコントロール(canvas1)を、別のものにAddしようとしたためです。
6
-
7
4
  そのため参考記事ではすべてコードで作成しています。
8
5
 
9
-
10
-
11
6
  `RemoveLogicalChild`で切ることはできると思いますが、切ると当然表示も消えます。
12
-
13
7
  [FrameworkElement.RemoveLogicalChild(Object) メソッド (System.Windows) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.frameworkelement.removelogicalchild)
14
8
 
15
-
16
-
17
9
  あるいはこちらは表示されているものを入れてもいいようです。
18
-
19
10
  [PrintDialog.PrintVisual(Visual, String) メソッド (System.Windows.Controls) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.printdialog.printvisual)
20
-
21
-
22
11
 
23
12
  ---
24
13
 
25
-
26
-
27
14
  プリンタを出すのが面倒なので、仮想プリンタでPDFに出してみましたが出ましたよ?(細かい設定とかはわからないですが
28
15
 
29
-
30
-
31
- ```xaml
16
+ ```xml
32
-
33
17
  <Window
34
-
35
18
  x:Class="Questions345252.MainWindow"
36
-
37
19
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
38
-
39
20
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
40
-
41
21
  Width="800"
42
-
43
22
  Height="450">
44
-
45
23
  <Grid x:Name="grid1">
46
-
47
24
  <Grid.RowDefinitions>
48
-
49
25
  <RowDefinition Height="Auto" />
50
-
51
26
  <RowDefinition />
52
-
53
27
  </Grid.RowDefinitions>
54
-
55
28
  <StackPanel>
56
-
57
29
  <Button Click="Button_Click" Content="印刷 - Remove" />
58
-
59
30
  <Button Click="Button_Click_1" Content="印刷 - PrintVisual" />
60
-
61
31
  </StackPanel>
62
-
63
32
  <Canvas x:Name="canvas1" Grid.Row="1">
64
-
65
33
  <Rectangle
66
-
67
34
  Canvas.Left="100"
68
-
69
35
  Canvas.Top="100"
70
-
71
36
  Width="100"
72
-
73
37
  Height="100"
74
-
75
38
  Fill="Blue" />
76
-
77
39
  <TextBlock
78
-
79
40
  Canvas.Left="60"
80
-
81
41
  Canvas.Top="15"
82
-
83
42
  Text="印刷てすと" />
84
-
85
43
  <Button
86
-
87
44
  Canvas.Left="273"
88
-
89
45
  Canvas.Top="65"
90
-
91
46
  Width="80"
92
-
93
47
  Content="aaa" />
94
-
95
48
  </Canvas>
96
-
97
49
  </Grid>
98
-
99
50
  </Window>
100
-
101
51
  ```
102
52
 
103
-
104
-
105
- ```C#
53
+ ```cs
106
-
107
54
  using System.Printing;
108
-
109
55
  using System.Windows;
110
-
111
56
  using System.Windows.Controls;
112
-
113
57
  using System.Windows.Documents;
114
58
 
115
-
116
-
117
59
  namespace Questions345252
118
-
119
60
  {
120
-
121
61
  public partial class MainWindow : Window
122
-
123
62
  {
124
-
125
63
  public MainWindow() => InitializeComponent();
126
64
 
127
-
128
-
129
65
  private void Button_Click(object sender, RoutedEventArgs e)
130
-
131
66
  {
132
-
133
67
  var printDialog = new PrintDialog();
134
-
135
68
  var result = printDialog.ShowDialog();
136
-
137
69
  if (!result.HasValue || !result.Value) return;
138
70
 
139
-
140
-
141
71
  // 切断
142
-
143
72
  grid1.Children.Remove(canvas1);
144
-
145
-
146
73
 
147
74
  var page = new FixedPage();
148
75
 
149
-
150
-
151
76
  // 入れる
152
-
153
77
  page.Children.Add(canvas1);
154
78
 
155
-
156
-
157
79
  var queue = printDialog.PrintQueue;
158
-
159
80
  var writer = PrintQueue.CreateXpsDocumentWriter(queue);
160
-
161
81
  writer.Write(page);
162
82
 
163
-
164
-
165
83
  // 終わったのでこっちからも切断
166
-
167
84
  page.Children.Remove(canvas1);
168
85
 
169
-
170
-
171
86
  // 戻す
172
-
173
87
  grid1.Children.Add(canvas1);
174
-
175
88
  }
176
89
 
177
-
178
-
179
90
  private void Button_Click_1(object sender, RoutedEventArgs e)
180
-
181
91
  {
182
-
183
92
  var printDialog = new PrintDialog();
184
-
185
93
  var result = printDialog.ShowDialog();
186
-
187
94
  if (!result.HasValue || !result.Value) return;
188
95
 
189
-
190
-
191
96
  printDialog.PrintVisual(canvas1, "Questions345252");
192
-
193
97
  }
194
-
195
98
  }
196
-
197
99
  }
198
-
199
100
  ```

1

コード

2021/06/24 23:23

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -17,3 +17,183 @@
17
17
  あるいはこちらは表示されているものを入れてもいいようです。
18
18
 
19
19
  [PrintDialog.PrintVisual(Visual, String) メソッド (System.Windows.Controls) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.printdialog.printvisual)
20
+
21
+
22
+
23
+ ---
24
+
25
+
26
+
27
+ プリンタを出すのが面倒なので、仮想プリンタでPDFに出してみましたが出ましたよ?(細かい設定とかはわからないですが
28
+
29
+
30
+
31
+ ```xaml
32
+
33
+ <Window
34
+
35
+ x:Class="Questions345252.MainWindow"
36
+
37
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
38
+
39
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
40
+
41
+ Width="800"
42
+
43
+ Height="450">
44
+
45
+ <Grid x:Name="grid1">
46
+
47
+ <Grid.RowDefinitions>
48
+
49
+ <RowDefinition Height="Auto" />
50
+
51
+ <RowDefinition />
52
+
53
+ </Grid.RowDefinitions>
54
+
55
+ <StackPanel>
56
+
57
+ <Button Click="Button_Click" Content="印刷 - Remove" />
58
+
59
+ <Button Click="Button_Click_1" Content="印刷 - PrintVisual" />
60
+
61
+ </StackPanel>
62
+
63
+ <Canvas x:Name="canvas1" Grid.Row="1">
64
+
65
+ <Rectangle
66
+
67
+ Canvas.Left="100"
68
+
69
+ Canvas.Top="100"
70
+
71
+ Width="100"
72
+
73
+ Height="100"
74
+
75
+ Fill="Blue" />
76
+
77
+ <TextBlock
78
+
79
+ Canvas.Left="60"
80
+
81
+ Canvas.Top="15"
82
+
83
+ Text="印刷てすと" />
84
+
85
+ <Button
86
+
87
+ Canvas.Left="273"
88
+
89
+ Canvas.Top="65"
90
+
91
+ Width="80"
92
+
93
+ Content="aaa" />
94
+
95
+ </Canvas>
96
+
97
+ </Grid>
98
+
99
+ </Window>
100
+
101
+ ```
102
+
103
+
104
+
105
+ ```C#
106
+
107
+ using System.Printing;
108
+
109
+ using System.Windows;
110
+
111
+ using System.Windows.Controls;
112
+
113
+ using System.Windows.Documents;
114
+
115
+
116
+
117
+ namespace Questions345252
118
+
119
+ {
120
+
121
+ public partial class MainWindow : Window
122
+
123
+ {
124
+
125
+ public MainWindow() => InitializeComponent();
126
+
127
+
128
+
129
+ private void Button_Click(object sender, RoutedEventArgs e)
130
+
131
+ {
132
+
133
+ var printDialog = new PrintDialog();
134
+
135
+ var result = printDialog.ShowDialog();
136
+
137
+ if (!result.HasValue || !result.Value) return;
138
+
139
+
140
+
141
+ // 切断
142
+
143
+ grid1.Children.Remove(canvas1);
144
+
145
+
146
+
147
+ var page = new FixedPage();
148
+
149
+
150
+
151
+ // 入れる
152
+
153
+ page.Children.Add(canvas1);
154
+
155
+
156
+
157
+ var queue = printDialog.PrintQueue;
158
+
159
+ var writer = PrintQueue.CreateXpsDocumentWriter(queue);
160
+
161
+ writer.Write(page);
162
+
163
+
164
+
165
+ // 終わったのでこっちからも切断
166
+
167
+ page.Children.Remove(canvas1);
168
+
169
+
170
+
171
+ // 戻す
172
+
173
+ grid1.Children.Add(canvas1);
174
+
175
+ }
176
+
177
+
178
+
179
+ private void Button_Click_1(object sender, RoutedEventArgs e)
180
+
181
+ {
182
+
183
+ var printDialog = new PrintDialog();
184
+
185
+ var result = printDialog.ShowDialog();
186
+
187
+ if (!result.HasValue || !result.Value) return;
188
+
189
+
190
+
191
+ printDialog.PrintVisual(canvas1, "Questions345252");
192
+
193
+ }
194
+
195
+ }
196
+
197
+ }
198
+
199
+ ```