Как я могу проверить, какой значок использует мой notifyIcon? - PullRequest
0 голосов
/ 08 января 2012

У меня проблемы с проверкой того, какой значок использует мой notifyIcon.

У меня есть уведомление для моей программы. Когда программа запускается, я назначаю ей иконку в своем коде.

public Form1()
    {            
        InitializeComponent();
        notifyIcon1.Icon = Properties.Resources.LogoIcon;
    }

У меня есть 2 кнопки, одна из которых запускает мой таймер, а 1 - останавливает мой таймер. Предполагается, что событие таймера позволяет проверить, какой значок используется в данный момент, и переключить его на другой параметр, но он не работает с помощью моего теста.

Timer miniClock = new Timer();

    private void btnStartTimer_Click(object sender, EventArgs e)
    {           
        miniClock.Interval = 1000;
        miniClock.Tick += new EventHandler(MiniClockEventProcessor);
        miniClock.Start();
    }

    private void MiniClockEventProcessor(Object myObject, EventArgs myEventArgs)
    {
        if (notifyIcon1.Icon == Properties.Resources.AlertIcon)
        {
            notifyIcon1.Icon = Properties.Resources.LogoIcon;
        }
        else
            notifyIcon1.Icon = Properties.Resources.AlertIcon;

    }

    private void btnStopTimer_Click(object sender, EventArgs e)
    {
        miniClock.Stop();
        btnTest.Enabled = true;
    }

Огорчает то, что когда я запускаю таймер, он меняет значок, но мой тест не проходит, и он только переключает значок в операторе else, потому что к нему нет критериев, за исключением того, что он не выполняет оператор if? Как проверить, какой значок используется в данный момент, а затем переключить значок на его аналог при вызове события таймера?

Ответы [ 2 ]

3 голосов
/ 08 января 2012

Причина в том, что каждый раз, когда вы обращаетесь к объекту непосредственно из Properties.Resources, он фактически читает его заново и создает новый объект. Поскольку == будет проверяться по ссылке, а ссылки не равны, ваш тест каждый раз будет неудачным.

Решение состоит в том, чтобы кэшировать его, что вы должны делать независимо от эффективности:

private static readonly Icon LogoIcon = Properties.Resources.LogoIcon;
private static readonly Icon AlertIcon = Properties.Resources.AlertIcon;

public Form1()
{            
    InitializeComponent();
    notifyIcon1.Icon = LogoIcon;
}

и

Timer miniClock = new Timer();

private void btnStartTimer_Click(object sender, EventArgs e)
{           
    miniClock.Interval = 1000;
    miniClock.Tick += new EventHandler(MiniClockEventProcessor);
    miniClock.Start();
}

private void MiniClockEventProcessor(Object myObject, EventArgs myEventArgs)
{
    if (notifyIcon1.Icon == AlertIcon)
    {
        notifyIcon1.Icon = LogoIcon;
    }
    else
        notifyIcon1.Icon = AlertIcon;

}

private void btnStopTimer_Click(object sender, EventArgs e)
{
    miniClock.Stop();
    btnTest.Enabled = true;
}
1 голос
/ 08 января 2012

Я думаю, что легче передать некоторые state, чем Icon. Я представляю, что вы можете установить AlertIcon или LogonIcon, основываясь на каком-то событии или уведомлении об изменении состояния. Лучше иметь где-нибудь простую bool переменную состояния, которая указывает, что происходит.

Например, чтобы объяснить, о чем я говорю, это псевдокод :

private void MiniClockEventProcessor(Object myObject, EventArgs myEventArgs)
{
   if (!IsAlertState)
   {
       notifyIcon1.Icon = Properties.Resources.LogoIcon;
   }
   else
       notifyIcon1.Icon = Properties.Resources.AlertIcon;

}

private bool IsAlertState {get;set}

При получении оповещение о собственности IsAlertState = true.

Примерно так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...