Как вытащить форму из области уведомление(трей)

152
01 апреля 2021, 06:30

Есть основная форма, которую я могу сворачивать-разворачивать в(из) области уведомлений(трей).

private void Form1_Resize(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                notifyIcon1.Visible = true;
                notifyIcon1.ShowBalloonTip(3000);
                this.ShowInTaskbar = false;
            }
        }
        public void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.WindowState = FormWindowState.Normal;
            this.ShowInTaskbar = true;
            notifyIcon1.Visible = false;
        }

Стоит задача из другого класса "вытаскивать" программу из трея.

Пробую вот так, но почему то оно не отображается

Form1 frm = new Form1();
frm.WindowState = FormWindowState.Normal;
frm.ShowInTaskbar = true;
frm.notifyIcon1.Visible = false;
frm.TopMost = true;
Answer 1

Я вам предлагаю разбить логику на отдельные части и работать с их ссылками, а не созданием объекта отдельно.

К примеру мы создадим новый класс, который будет отвечать исключительно за работу с NotifyIcon, я назову его NotifyHelper. В этом классе мы пропишем стартовые значения (иконку) и методы вывода нужных уведомлений, то есть получаем что то вроде этого:

public class NotifyHelper
{
    NotifyIcon notify;
    public NotifyHelper(NotifyIcon notify)
    {
        this.notify = notify;
        this.notify.Icon = SystemIcons.Application;
    }
    public NotifyHelper Visible(bool visible = true)
    {
        notify.Visible = visible;
        return this;
    }
    public void Show(string title, string text, int timeout = 3000, ToolTipIcon icon = ToolTipIcon.Info)
    {
        if (notify == null) return;
        notify.ShowBalloonTip(timeout, title, text, icon);
    }
    public void ShowWarn(string text, string title = "Внимание") => 
        Show(title, text, icon: ToolTipIcon.Warning);
    public void ShowInfo(string text, string title = "Информация") =>
        Show(title, text);
}

Теперь у стартовой формы пропишем инициализацию данного класса, я лично сделаю прям в конструкторе:

NotifyHelper NotifyHelper;
public Form1()
{
    InitializeComponent();
    NotifyHelper = new NotifyHelper(notifyIcon1).Visible();
}

Все, теперь мы можем с этим классом работать где угодно, достаточно передать ссылку.
Для примера я создам на первой форме две кнопки, при нажатие первой мы выведем обычное уведомление, а при нажатие 2-й мы откроем 2-ю форму.

  • Первый обработчик пусть вызывает .ShowInfo() из нашего вспомогательного класса:

    private void Button1_Click(object sender, EventArgs e) => 
        NotifyHelper.ShowInfo("Объявление из первого окна!");
  • А второй пусть открывает новую форму, передавая через конструктор NotifyHelper:

    private void Button2_Click(object sender, EventArgs e) => 
        new Form2(NotifyHelper).Show();

Все, с первой формой закончили, осталось подготовить чуть вторую:

  • Принимаем через конструктор вспомогательный класс:

    NotifyHelper NotifyHelper;
    public Form2(NotifyHelper notifyHelper)
    {
        InitializeComponent();
        NotifyHelper = notifyHelper;
    }
  • Ну и для примера добавим одну кнопку на форуму и в ее обработчике клика вызываем нужный метод из вспомогательного класса:

    private void Button1_Click(object sender, EventArgs e) => 
        NotifyHelper.ShowWarn("Произошла ошибка!");

Вот собственно и все.
Мы "завернули" NotifyIcon в свой класс, который отвечает только за него и дальше просто вызываем нужные методы, не затрагивая всю форму и что то еще. Вам остается снабдить класс тем функционалом, который нужен (сменить иконку в трее, показать может другое уведомление, вывести окно из трея и так далее).

READ ALSO
Вызов функции принадлежащей классу Editor, из другого класса

Вызов функции принадлежащей классу Editor, из другого класса

Я нашёл тут ответ на мой вопрос, но он не помогУ меня не видит класс WaypointEditor в другом классе

129
NullReferenceException при попытке работы с массивом

NullReferenceException при попытке работы с массивом

При попытке работы с массивом OnlyGreatMarks в последнем методе происходит ошибка:

150
С#. Вызов метода из метода в одном классе

С#. Вызов метода из метода в одном классе

Ну очень глупый вопрос наверное :(

127
Количество элементов на странице в зависимости от введенного числа

Количество элементов на странице в зависимости от введенного числа

Подскажите, пожалуйста, как в ASPNET CORE MVC сделать так, чтобы по вводу нужного числа в текстовом поле во view, появлялось количество элементов (текстовых...

97