我正在创建一个应用程序,我想实现一个进程窗口,该窗口在进行冗长的过程时出现.
我已经创建了一个标准的Windows窗体项目,我使用默认窗体创建了我的应用程序.我还创建了一个新表单作为进度窗口.
使用以下命令打开进度窗口(在函数中)时出现问题:
ProgressWindow.ShowDialog();
Run Code Online (Sandbox Code Playgroud)
遇到这个命令时,焦点在进度窗口上,我认为它现在是正在为事件处理主循环的窗口.缺点是它阻止了我在主窗体中执行冗长的操作.
如果我使用以下命令打开进度窗口:
ProgressWindow.Show();
Run Code Online (Sandbox Code Playgroud)
然后窗口正确打开,现在不会阻止主窗体的执行,但它不会作为子窗口(模态)窗口,即允许选择主窗体,不以父窗口为中心等. .
我有什么想法可以打开一个新窗口,但继续在主窗体中处理?
Axe*_*ger 11
您可能在单独的工作线程中开始冗长的操作(例如,使用后台工作程序).然后使用ShowDialog()并在完成线程时显示您的表单,关闭您正在显示的对话框.
这是一个示例 - 在此我假设您有两种形式(Form1和Form2).在Form1我把一个BackgroundWorker从工具箱.然后我将RunWorkerComplete事件连接BackgroundWorker到我的表单中的事件处理程序.以下是处理事件并显示对话框的代码:
public partial class Form1 : Form
{
public Form1() {
InitializeComponent();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
Thread.Sleep(5000);
e.Result = e.Argument;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
var dlg = e.Result as Form2;
if (dlg != null) {
dlg.Close();
}
}
private void button1_Click(object sender, EventArgs e) {
var dlg = new Form2();
this.backgroundWorker1.RunWorkerAsync(dlg);
dlg.ShowDialog();
}
}
Run Code Online (Sandbox Code Playgroud)