2012-01-08 35 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

相關問題