Как правильно реализовать операцию выхода из системного трея - PullRequest
0 голосов
/ 19 ноября 2018

Я создал приложение в системном трее с 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 аналогичным образом?

Есть ли лучший способ реализовать это?

...