以异步方式打开第二个winform,但仍然表现为父表单的子项?

Gar*_*hby 15 c# winforms

我正在创建一个应用程序,我想实现一个进程窗口,该窗口在进行冗长的过程时出现.

我已经创建了一个标准的Windows窗体项目,我使用默认窗体创建了我的应用程序.我还创建了一个新表单作为进度窗口.

使用以下命令打开进度窗口(在函数中)时出现问题:

ProgressWindow.ShowDialog();
Run Code Online (Sandbox Code Playgroud)

遇到这个命令时,焦点在进度窗口上,我认为它现在是正在为事件处理主循环的窗口.缺点是它阻止了我在主窗体中执行冗长的操作.

如果我使用以下命令打开进度窗口:

ProgressWindow.Show();
Run Code Online (Sandbox Code Playgroud)

然后窗口正确打开,现在不会阻止主窗体的执行,但它不会作为子窗口(模态)窗口,即允许选择主窗体,不以父窗口为中心等. .

我有什么想法可以打开一个新窗口,但继续在主窗体中处理?

Axe*_*ger 11

您可能在单独的工作线程中开始冗长的操作(例如,使用后台工作程序).然后使用ShowDialog()并在完成线程时显示您的表单,关闭您正在显示的对话框.

这是一个示例 - 在此我假设您有两种形式(Form1Form2).在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)