我已经创建了一个系统托盘应用程序,其中包含3个表单:
主窗体有一个Notifion,它具有ContextMenuStrip属性。
this.PopupMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.Login,
this.Logout,
this.History});
this.MainFormNotifyIcon.ContextMenuStrip = this.PopupMenu;
用户登录后,可以从弹出菜单中单击历史记录。
如果用户打开了历史记录窗体并单击了注销,我想关闭历史记录并将主窗体以及系统托盘隐藏起来。
由于可以直接从主窗体访问注销,因此隐藏主窗体不成问题。
但是,我想知道在用户注销的情况下,关闭历史记录窗体的正确方法是什么。
为了做到这一点,我将主窗体作为对历史窗体的引用传递给了主窗体LoggedOutEvent:
// Main Form
public partial class MainForm : Form
{
public event EventHandler LoggingOutEvent;
private HistoryForm _historyForm;
private void ShowHistory_Click(object sender, EventArgs e)
{
_historyForm = new HistoryForm(this);
_historyForm.Show();
}
private void Logout_Click(object sender, EventArgs e)
{
if (LoggingOutEvent != null)
LoggingOutEvent(null, null);
Hide();
}
}
// History Form
public partial class HistoryForm : Form
{
public HistoryForm(MainForm form)
{
InitializeComponent();
form.LoggingOutEvent += Form_LoggingOut;
}
private void Form_LoggingOut(object sender, EventArgs e)
{
Close();
}
}
所以,我实现它的方式是传递主表单作为对历史表单的引用,以便订阅注销事件。如果History窗体将有一个按钮打开History Details窗体,那么我是否也必须将主窗体引用传递给它,并以类似的方式订阅LogoutEvent呢?