繁体   English   中英

如何测试我的notifyIcon使用哪个图标?

[英]How can I test which icon my notifyIcon is using?

我在测试我的notifyIcon使用哪个图标时遇到问题。

我为我的程序实例化了一个notifyicon。 程序运行时,我在代码中为其分配了一个图标。

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

我有2个按钮,一个按钮启动我的计时器,另一个按钮停止我的计时器。 计时器事件用于检查当前正在使用哪个图标,并将其切换到其他选项,但是使用我的测试无法正常工作。

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语句失败? 如何测试当前正在使用的图标,然后在计时器事件调用中将其切换为对应的图标?

原因是每次您直接从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;
}

我认为,将某些state传递给Icon更容易。 我想您可以根据某个事件或某些更改的状态通知来设置AlertIconLogonIcon 最好在某个简单的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

这样的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM