私のアプリケーションは、画面に表示されている情報を (Canvas コントロールを使用して) N 回 (プリンターに) 印刷します。
プロセスは
ユーザーがボタン (印刷と呼ばれる) をクリックします。
Canvas をテキストで更新します (通常はデータベースから取得しますが、以下のコードではハードコーディングされています)
Print to printer
新しいテキストで Canvas を更新します (再びデータベースから取得しますが、以下のコードではハードコーディングされています) Print to printer
ただし、上記のプロセスで説明したようにこれを機能させることはできません。プリンターは最後に行われた更新のみを印刷します。
この問題を再現できるようにするために、以下のコードを同封します
マイ XAML
<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Canvas Margin="0,0,0,88" Name="canvas1">
<TextBlock Text="Hello World" Name="TextBlock1" />
</Canvas>
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="0,245,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
</Window>
そして私のコードビハインド
using System;
using System.Windows;
using System.Printing;
using System.Windows.Threading;
using System.Windows.Controls;
namespace WpfApplication4
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
PrintDialog dialog = new PrintDialog();
for (int i = 1; i < 3; i++)
{
//showing this message box fixes the issue
//MessageBox.Show("01");
updateTextblock(i);
//use the dispatcher object to ensure all renders and databinding are completed before sending to print
DispatcherOperation disO;
disO = Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(delegate
{
print(dialog);
}
));
disO.Wait()
}
}
private void print(PrintDialog dialog)
{
//select printer auotmatically
PrintQueue queue = new LocalPrintServer().GetPrintQueue("Canon MG160 series WS");
//assign the printer
dialog.PrintQueue = queue;
dialog.PrintVisual(canvas1, "");
}
private void updateTextblock(int i)
{
TextBlock1.Text = "Number " + i.ToString();
}
}
}
印刷されるのはナンバー2だけです
Number 1 でキャンバスを繰り返し更新しましたが、印刷されません (空白のページが印刷されます)。
各キャンバスが印刷されるようにするために必要なことは何ですか? メッセージボックスを表示することで機能させることはできますが、自動化の目的を無効にします。
編集:プリンターからエラーメッセージが表示されます-「別のコンピューターがプリンターを使用しています。」他の Web サイトによると、1 つのジョブが終了するまで待たなければならず、その後 2 つ目のジョブが自動的に開始されますが、悲しいことに、決して開始されません。