いくつかの大きなページの印刷プレビュー ウィンドウを表示しています。これらのレンダリングには時間がかかるので、デフォルトの「Page 1/1」メッセージよりも多くの進捗情報を表示したいと考えています。
現在のアプローチを示す単純な Windows フォーム プロジェクトを作成しました。
(必要に応じて、2 つのフォームを含む新しい Windows フォーム プロジェクトを作成し、コピーして貼り付けることができます)
public event EventHandler PrintReady;
public event ProgressChangedEventHandler ProgressChanged;
private void button1_Click(object sender, EventArgs e)
{
var printDocument = new PrintDocument();
printDocument.PrintPage += new PrintPageEventHandler(printDocument_PrintPage);
printDocument.EndPrint += new PrintEventHandler(printDocument_EndPrint);
var printPreviewDialog = new PrintPreviewDialog();
printPreviewDialog.Document = printDocument;
// Create the 'progress' form.
var form2 = new Form2(this);
form2.Show();
printPreviewDialog.ShowDialog();
}
void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
for (int i = 0; i < 100; i++)
{
// This is where I do some rendering.
Thread.Sleep(20);
if (this.ProgressChanged != null)
{
this.ProgressChanged.Invoke(this, new ProgressChangedEventArgs(i, null));
}
}
}
void printDocument_EndPrint(object sender, PrintEventArgs e)
{
if (this.PrintReady != null)
{
this.PrintReady.Invoke(this, null);
}
}
そしてもちろん、私の進行状況フォーム:
public Form2(Form1 form1)
{
form1.ProgressChanged += new ProgressChangedEventHandler(ProgressChangedHandler);
form1.PrintReady += new EventHandler(PrintReadyHandler);
InitializeComponent();
}
void PrintReadyHandler(object sender, EventArgs e)
{
this.Close();
}
void ProgressChangedHandler(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
「this.Close()」も印刷プレビューを閉じます! その行を削除すると、印刷プレビューが表示され、開いたままになります。したがって、Close() 関数は進行状況ウィンドウと PrintPreview ウィンドウの両方を閉じています。
なぜこうなった?