我有一个简单的winforms应用程序。应用程序从MainForm开始,它始终隐藏。 MainForm打开另一个名为Notification(.Show)的表单,该表单在10秒后关闭。因此,如果MainForm打开一个对话框表单(.ShowDialog)而Notification仍处于打开状态,那么如果Notification命中10秒并关闭,则打开的对话框也会关闭。
通知表单和对话框表单都有TopMost = True
一个例子:
简短的例子: 即使我的应用程序只执行此操作,OtherDialogForm也会关闭:
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
new Notification("Title", "Content").Show(); // closes itself after 10 seconds
new OtherDialogForm().ShowDialog(); // being closed by form above (not wanted)
}
}
更长的例子: MainForm.cs
public partial class MainForm : Form
{
protected override void SetVisibleCore(bool value)
{
base.SetVisibleCore(false);
}
public MainForm()
{
CreateNotification();
}
public void CreateNotification()
{
new Notification.Show();
}
// triggered while Notification (from above) is still open
private async void TriggeredByHotkey()
{
using (OtherDialogForm dialog = new OtherDialogForm())
{
dialog.ShowDialog();
// if DialogResult == ...
}
}
}
Notification.cs
public partial class Notification : Form
{
Timer timer;
public Notification()
{
// sets timer tick to 10 seconds,
// then calls void with this.Close()
}
// not sure if I really need this, but the problem is still there without
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams;
cp.ExStyle |= 8; // Turn on WS_EX_TOPMOST
return cp;
}
}
}
我真的不知道为什么对话框会与Notification一起关闭。
答案 0 :(得分:2)
您可以隐藏通知表单而不是关闭它,因为它只是一个您不需要关闭它的通知,您可以将它保留在后台并在需要时显示它。 来自msdn:https://msdn.microsoft.com/en-us/library/c7ykbedk(v=vs.110).aspx
此版本的ShowDialog方法未指定表单或控件作为其所有者。调用此版本时,当前活动窗口将成为对话框的所有者。如果要指定特定所有者,请使用此方法的其他版本。
因此,如果您使用ShowDialog并且Notification表单成为另一个dialig表单的父级,则它们将在关闭通知表单时关闭
答案 1 :(得分:0)
如果您从通知表单中触发TriggeredByHotkey
方法。这种方法只会在你的呼叫者活着时才会运行。特别是如果您使用using
提供对话框。
在方法结束时,using
引用的变量调用它自己的Dispose来关闭表单。