2012-11-19 45 views
0

我正在为某些大型页面显示打印预览窗口。这些渲染需要一些时间,所以我想要显示比默认的“Page 1/1”消息更多的进度信息。当您关闭另一个表单时C#打印预览会关闭

我创建了一个简单的Windows窗体的项目,显示了我目前的做法:

(你可以创建一个新的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窗口。

这是怎么发生的?

+0

所以隐藏的形式呢?打印预览窗口正在关闭,因为您关闭了启动打印预览的窗体。另一种解决方案是从自己的线程启动预览。 –

+0

@Rhhound:我没有关闭启动打印预览的表单。我只关闭Form2。两者之间的唯一参考是一个事件... – Sunib

回答

0

我认为你需要指定打印预览对话框为Form1的所有者 - 见下文:

printPreviewDialog.ShowDialog(this); 
+0

谢谢!这解决了这个问题。所以它必须使用最后创建的窗口,因为它是默认的所有者?我必须承认我无法完全理解这种行为。 – Sunib

相关问题