Я успешно реализовал печать и предварительный просмотр для своего приложения с использованием классов .NET PrintDocument, PrintDialog и PrintPreviewDialog.
Однако мое приложение использует инструментарий для улучшения внешнего вида стандартных элементов управления .NET. В наборе инструментов есть версии большинства элементов управления .NET, но нет ни одного для элементов управления печатью.
Поэтому, чтобы убедиться, что внешний вид этих элементов управления соответствует остальной части приложения, я создаю собственный PrintPreviewDialog на основе формы набора инструментов и встраиваю в него .NET PrintPrewviewControl.
Моя проблема в том, что PrintPreviewControl всегда показывает «Нет страниц для отображения». У меня не было проблем, чтобы заставить это работать, используя .NET PrintPreviewDialog и не вижу, что я делаю неправильно.
Это .NET 2.0 PrintPreviewControl, и поэтому я знаю, что мне нужно вызвать InvalidatePreview () после назначения PrintDocument. Однако, кажется, не имеет значения, где я его размещаю, обработчик событий PrintPage никогда не вызывается ...
public class PrintEngine
{
...rest of class...
public PrintEngine()
{
m_printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage);
}
public void PrintPreview()
{
//ORIGINAL CODE USING .NET DIALOG WORK OK
//PrintPreviewDialog dlg1 = new PrintPreviewDialog();
//dlg1.Document = m_printDoc;
//PrepareImageForPrinting();
//dlg1.ShowDialog();
//CODE USING MY CUSTOM DIALOG DO NOT WORK?
MyPrintPreviewDialog dlg2 = new MyPrintPreviewDialog();
dlg2.Document = m_printDoc;
PrepareImageForPrinting(); //Creates the m_printImage List
dlg2.ShowDialog();
}
private void printDoc_PrintPage(object sender, PrintPageEventArgs e)
{
e.Graphics.DrawImage(m_printImages[m_currentPage], new Point(0, 0));
m_currentPage++;
e.HasMorePages = m_currentPage < m_pagesHigh;
}
}//end PrintEngine class
public class MyPrintPreviewDialog : KryptonForm
{
public PrintDocument Document
{
get { return m_printPreviewControl.Document; }
set
{
m_printPreviewControl.Document = value;
m_printPreviewControl.InvalidatePreview();
}
}
public MyPrintPreviewDialog()
{
InitializeComponent();
m_printPreviewControl = new PrintPreviewControl();
m_printPreviewControl.StartPage = 0;
}
private void MyPrintPreviewDialog_Load(object sender, EventArgs e)
{
m_printPreviewControl.Document.DefaultPageSettings = new PageSettings();
m_printPreviewControl.Document.PrinterSettings = new PrinterSettings();
m_printPreviewControl.InvalidatePreview();
}
}//end MyPrintPreviewDialog class