2012-01-08 33 views
0

我遇到问题,测试我的notifyIcon正在使用哪个图标。如何测试我的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语句,因为没有标准,它只是它失败了,如果声明?如何测试当前正在使用哪个图标,然后将图标切换到计时器事件调用中的图标上?

回答

1

我觉得它更容易一些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} 

在recived 警报财产IsAlertState = true

就是这样。

+0

很棒的建议。我基于时钟事件的每次运行中更改的布尔值实施测试,并且效果很好。谢谢! – 2012-01-08 00:29:47

+0

@FuzzEvans:请注意,您仍然需要缓存图标。否则,你会每次都加载它们。 – Ryan 2012-01-08 00:31:47

+0

@minitech,谢谢,我会这样做的。 – 2012-01-08 00:58:50

3

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

虽然我明白你在说什么,但我在尝试执行上述操作时收到错误。 Properties.Resources.LogoIcon'是一个'属性',但是像'type'一样使用。 – 2012-01-08 00:24:10

+0

@FuzzEvans:对不起,修复了代码。我忘了定义类型。 – Ryan 2012-01-08 00:25:00

+0

我很欣赏你的信息,为什么我无法测试实际的图标。 – 2012-01-08 00:30:12

相关问题