我在vb.net中有一个应用程序,它以子函数开头做一些事情并决定它是否显示自己。当它显示出来时,它会通过调用dialog.ShowDialog()
来实现。
当dialog.ShowDialog()
返回时,应用程序会进行一些清理并结束。
我想找到一种暂时隐藏对话框(将其发送到系统托盘)而无需从ShowDialog()函数返回的方法。但是,只要在表单的代码中执行me.Hide()
,表单就会被隐藏,但ShowDialog()函数会返回并关闭进程。
我理解这是预期的行为。所以我的问题是如何才能获得这种效果?这是启动一个可以隐藏的对话框,并阻塞,直到用户真的想要退出应用程序。
答案 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)
你可以使用旗帜。
bool done = false;
检查调用函数中的标志(是完成了吗?)
bool stilInMyFrm = false;
MyFrm myFrm = new myFrm();
try
{
stilInMyFrm = true;
myFrm.ShowDialog();
while (!myFrm.done)
Application.DoEvents();
}
finally
{
stilInMyFrm = false;
cleanup();
}