Как сделать одну иконку в трее и меню для нескольких форм?

В приложении 2 формы. 1 форма открывается при запуске и имеет кнопку, при нажатии на которую 1 форма закрывается и открывается 2 (основная).

Нужно сделать сворачивание приложения в трей и контекстное меню у иконки в трее.
Делаю через компоненты notifyIcon и contextMenu. Они привязаны к конкретной форме и получается, если делать на каждой форме свои notifyIcon и contextMenu, то и код обработки копируется на обе формы и пункты меню для каждой формы нужно дублировать и при переключении между формами в трее 2 иконки.

Переключение между формами сделано так:
Form2 f2 = new Form2();
this.Hide();
f2.ShowDialog();
this.Show();


Если вставить в метод переключения скрытие иконки 1 формы this.notifyIcon1.Visible = false;, то получается плохо. Технически это 2 разные иконки и иконка прыгает между другими в трее.
При попытке выйти из приложения на 2 форме через меню в трее Application.Exit();, 2 форма закрывается и открывается 1.

При попытке выйти из приложения на 2 форме через меню в трее Environment.Exit(1);, выход происходит, но 1 форма показывается на некоторе время.

Как правильно это реализовать? Хотелось бы работать с общим 1 компонентом, а не с двумя.
  • Вопрос задан
  • 3765 просмотров
Решения вопроса 1
По идеии, можно передать ссылку на первую иконку во вторую форму и пусть она работает с ней, пока первая(форма) закрыта.

UPD:
Form1
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            notifyIcon1.Visible = !notifyIcon1.Visible;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Form2 a = new Form2(notifyIcon1);
            Visible = false;
            a.ShowDialog();
            Visible = true;
        }
    }
}


Form2
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        NotifyIcon ico;
        public Form2(NotifyIcon ico)
        {
            this.ico = ico; 
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ico.Visible = !ico.Visible;
        }
    }
}


Я тестил это так.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
rdifb0
@rdifb0
Программист, реалист
notifyIcon можно ведь и вручную создать, и не будет тогда скакать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы