如何在不从.ShowDialog返回的情况下隐藏模态对话框?

时间:2010-03-11 22:05:48

标签: .net winforms modal-dialog

我在vb.net中有一个应用程序,它以子函数开头做一些事情并决定它是否显示自己。当它显示出来时,它会通过调用dialog.ShowDialog()来实现。

dialog.ShowDialog()返回时,应用程序会进行一些清理并结束。

我想找到一种暂时隐藏对话框(将其发送到系统托盘)而无需从ShowDialog()函数返回的方法。但是,只要在表单的代码中执行me.Hide(),表单就会被隐藏,但ShowDialog()函数会返回并关闭进程。

我理解这是预期的行为。所以我的问题是如何才能获得这种效果?这是启动一个可以隐藏的对话框,并阻塞,直到用户真的想要退出应用程序。

5 个答案:

答案 0 :(得分:6)

如果隐藏对话框, 将从ShowDialog()返回。忘了试图改变它,你做不到。

您可以将对话框最小化。

form1.WindowState = FormWindowState.Minimized;

或者你可以将它放在屏幕上。

form.Left = -16384;

或者您可以将其设为透明Modifying opacity of any window from C#

答案 1 :(得分:4)

您无法完成此工作,隐藏表单时,ShowDialog()将始终返回。诀窍是使用常规表单和对Application.Run()的正常调用,但要防止它立即可见。将此代码粘贴到表单类中:

Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
    If Not IsHandleCreated Then
        CreateHandle()
        value = false
    End If
    MyBase.SetVisibleCore(value)
End Sub

请注意,在表单实际变为可见之前,Load事件处理程序才会运行,因此请确保在Sub New构造函数中进行任何初始化。

答案 2 :(得分:0)

另一种解决方法是将建模表单的“不透明度”属性更改为0,以使其完全透明。

private void MyModalForm_Load(object sender, EventArgs e)
{
    bool isShowing = true;
    //Do your thing.
    if(!isShowing) this.Opacity = 0.0;
    else this.Opacity = 1.0;
}

答案 3 :(得分:0)

我这样做了,在代码表单中:

private bool CanAccess()
{
    //your condition to access or not
}

private bool AlreadyCreated = false;
protected override void SetVisibleCore(bool value)
{
    if (value && !AlreadyCreated && !CanAccess())
    {
        base.SetVisibleCore(false);
        this.Close();
        return;
    }

    AlreadyCreated = true;
    base.SetVisibleCore(value);
}

它适用于 Show() 和 ShowDialog() 方法。

答案 4 :(得分:-1)

你可以使用旗帜。

  1. 在表单中添加一个标记:bool done = false;
  2. 完成时设置完成= true(在FormClosed事件中)。
  3. 检查调用函数中的标志(是完成了吗?)

    bool stilInMyFrm = false;
    MyFrm myFrm = new myFrm();
    
    try
    {
        stilInMyFrm = true;
        myFrm.ShowDialog();
        while (!myFrm.done)
            Application.DoEvents();
    }
    finally
    {
        stilInMyFrm = false;
        cleanup();
    }