How to hide a modal dialog without returning from .ShowDialog?
I have an application in vb.net that starts with a sub function do some things and decide if it shows itself or not. When it shows itself it does so by invoking dialog.ShowDialog()
.
When dialog.ShowDialog()
returns, the application does some cleaning and ends.
I'd like to find a way to temporarily hide the dialog (send it to the system tray) without returning from the ShowDialog() function. However, as soon as I do a me.Hide()
in the form's code, the form is effectively开发者_如何学C hidden, but the ShowDialog() function returns and the process is closed.
I understand this is the expected behavior. So my question is how can I get this effect? That is launch a dialog, that can be hidden, and block until the user really wants to quit the application.
If you hide the dialog, you will return from ShowDialog(). Forget about trying to change that, you can't.
You might be able to minimize the dialog.
form1.WindowState = FormWindowState.Minimized;
Or you can position it off screen.
form.Left = -16384;
Or you can make it transparent Modifying opacity of any window from C#
You cannot make this work, ShowDialog() will always return when the form is hidden. The trick is to use a regular form and a normal call to Application.Run() but to prevent it from becoming visible immediately. Paste this code into your form class:
Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
If Not IsHandleCreated Then
CreateHandle()
value = false
End If
MyBase.SetVisibleCore(value)
End Sub
Beware that your Load event handler won't run until the form actually becomes visible so be sure to do any initialization in the Sub New constructor.
Another workaround is to change the modeled form's Opacity property to 0 to make it fully transparent.
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;
}
I did this, inside code form:
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);
}
It work for Show() and ShowDialog() methods.
you may use a flag.
- Add a flag to your form :
bool done = false;
- set done = true when it is complete (in FormClosed event).
check for flag in caller function (is it done ?)
bool stilInMyFrm = false; MyFrm myFrm = new myFrm(); try { stilInMyFrm = true; myFrm.ShowDialog(); while (!myFrm.done) Application.DoEvents(); } finally { stilInMyFrm = false; cleanup(); }
精彩评论