Я создал приложение в системном трее с 3 формами:
- Форма входа
- Основная форма
- Форма истории.
Основная форма имеет NotifIcon со свойством ContextMenuStrip.
this.PopupMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.Login,
this.Logout,
this.History});
this.MainFormNotifyIcon.ContextMenuStrip = this.PopupMenu;
Таким образом, пользователь может щелкнуть правой кнопкой мыши на панели задач и получить всплывающее меню для входа в систему.
После того, как пользователь вошел в систему, он может нажать «История» во всплывающем меню.
Если пользователь открыл форму истории и щелкнул по выходу из системы, я хочу закрыть историю и скрыть основные формы в системном трее.
Поскольку выход из системы напрямую доступен из главной формы, скрытие основной формы не является проблемой.
Однако мне интересно, как правильно закрыть форму «История» в случае выхода пользователя из системы.
Чтобы сделать это, я передал форму Main в качестве ссылки на форму History и подписался на форму Main 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();
}
}
Итак, я реализовал это так, что я передаю основную форму как ссылку на форму истории, чтобы подписаться на событие выхода из системы. Что если в форме «История» будет кнопка, открывающая форму «Детали истории», придется ли мне передавать ссылку на основную форму и подписываться на LogoutEvent аналогичным образом?
Есть ли лучший способ реализовать это?