使用Show而不是ShowDialog进行C#冻结过程

时间:2017-09-01 19:19:24

标签: c# winforms

我正在为特定程序编写插件(Autodesk Revit)。 在这个插件中,我向用户展示了一个WinForm。 使用winform上的按钮,用户将临时发送回主应用程序(Autodesk Revit)进行选择,一旦完成,它将被发送回WinForm。

初始化Winform时,我可以使用Form.Show()或使用Form.ShowDialog()

如果我将使用Form.Show()表格将正确显示,表格上的按钮可用于让用户在主应用程序中进行选择,并在完成后将其发送回表格在选择之前使用this.hide()进行选择,之后使用this.Show()进行选择,以便在选择过程中暂时隐藏表单。

如果我将使用Form.ShowDialog()表格将正确显示并且可以使用表单上的按钮,但是因为ShowDialog在等待对话结果时冻结主应用程序,用户将无法进行选择。

这就是为什么我想要使用Form.Show()代替Form.ShowDialog()

但这是我面临的问题: 如果我使用Form.Show(),表单可以移动到后台或其他监视器,并且由于主应用程序不处于冻结状态,用户可以继续工作并完全忘记表单仍处于打开状态。< / p>

所以我想知道是否有可能以某种方式空闲/冻结主应用程序,就像我在使用ShowDialog时使用Show一样?

2 个答案:

答案 0 :(得分:2)

我认为您需要稍微调整一下逻辑:

  • 使用ShowDialog,但关闭表单以返回原始应用程序
  • 设计一种在关闭前保存表单状态的方法(例如序列化为MemoryStream)。
  • 当您希望再次将用户发送到表单时,重新创建表单并在再次显示模式之前恢复其状态。

答案 1 :(得分:0)

使用ShowDialogue()时,使用其他主题不会挂起主表单使用下面的代码:

        //Initially
        this.Enabled = false;
        Form form = new YourForm();
        form.TopMost = true;
        form.Focus();
        System.Threading.Thread thread = new System.Threading.Thread(() => form.ShowDialog());
        thread.Priority = System.Threading.ThreadPriority.Highest; //<- just an example, set it according to your need
        thread.Start();



        //If you want to close it from the main form (you can do it from the opened form itself though)
        form.Invoke((MethodInvoker)delegate
        {
            form.Close();
        });
        thread.Abort();
        this.TopMost = true;
        this.Enabled = true;
        this.Focus();
        this.TopMost = false;