2014-04-02 15 views
4

我完全被這個問題難住,我不知道該怎麼做。 我已經使用Visual Studio 2012 Premium創建了一個簡單的C#Windows窗體應用程序。我有一個小程序啓動並在系統托盤中創建一個NotifyIcon。點擊托盤圖標後,會顯示一個上下文菜單,並顯示幾個菜單選項(選項,關於等),其中每個選項顯示一個表單。我通過右鍵單擊我的項目項目,屬性,資源,添加了兩個圖標文件(.ico)。我以編程方式更改我的NotifyIcon的圖標,在兩個不同的圖標之間交替。我的問題是我的舊圖標繼續顯示,而不是我添加到項目中的新圖標。要清楚,我的問題是老圖標不斷顯示 - 一切正常,沒有錯誤,它只是不顯示我最新的圖標。 我改變了代碼中的圖標的方法是使用:如何讓Visual Studio爲我的NotifyIcon使用我更新的圖標?

notifyIcon.Icon = Resources.IconA03312014; //or the other one; the numbers are the date 

我開始了我的圖標,並使用這些後來決定改變他們一點點 - 我改變了一些顏色,等於是我通過單擊「從項目排除」選項從我的項目中刪除舊圖標。然後我添加了我的新圖標,它們有不同的名稱。然後我更新了兩個加載圖標的代碼引用以使用新名稱。無論我做什麼,我的新/更新的圖標都不顯示!

無論我在Debug或Release模式下在Visual Studio中運行程序,都沒關係。我可以清理解決方案,重建,然後直接通過在Windows中單擊運行可執行文件,並沒有任何區別。顯示舊圖標。 我遵循不同的在線說明,說明如何清除Windows 8圖標緩存(三種不同的方法)。我也使用了兩種不同的方法清除了緩存的通知托盤圖標。

基本上,我清理了我的解決方案,然後關閉了Visual Studio。我終止所有瀏覽器進程,從命令行運行ie4uinit.exe -ClearIconCache並刪除IconCache.db文件。然後,按照類似於這些(http://www.sevenforums.com/tutorials/13102-notification-area-icons-reset.html)的說明編輯註冊表,刪除通知圖標緩存。然後關閉電腦。在開始備份並重建我的解決方案並運行時,舊圖標仍然以某種方式存在。很久以前,舊圖標的物理.ico文件被刪除。每次向我的資源添加新圖標時,我都會從頭開始創建新的圖標文件(使用icobundl.exe),並通過在名稱中包含日期來唯一地命名它們。我知道Windows和顯然Visual Studio也喜歡緩存圖標,如果你在Windows中刪除一些圖標文件A.ico,然後將另一個圖標文件B.ico重命名爲A.ico,則B.ico文件的實際圖標將會改爲A's。無論如何,我沒有圖標文件的名稱是問題。現在,在代碼中,如果我使用相同的策略並設置其中一個窗體的圖標,它將正常工作,窗體顯示我最新的圖標,而我的通知圖標仍然顯示舊的(現在不存在,除Visual Studio la la land)圖標。 所以,我有:

... 
if(firstState){ 
    notifyIcon.Icon = Resources.IconA03312014; 
    optionsForm.Icon = Resources.IconA03312014; 
} 
else{ 
    notifyIcon.Icon = Resources.IconB03312014; 
    optionsForm.Icon = Resources.IconB03312014; 
} 
firstState = !firstState; 
... 

有沒有錯誤,都NotifyIcon的和optionsForm的變化,但通知圖標顯示不再存在任何地方(除地方/在某種程度上VS)我的舊圖標。表格的圖標更改爲我更新/最新的圖標。

如果我將應用程序的.exe文件複製到另一臺計算機並運行它,它也會顯示通知圖標的舊圖標,因此舊圖標仍以某種方式仍嵌入到由Visual Studio生成的exe文件中。如果我直接加載.ico文件,而不是引用我的項目資源,則會顯示新的圖標。這必須是Visual Studio中某種奇怪的資源緩存問題?

任何人都可以請幫我解決這個問題嗎?我只是不明白我的舊圖標是如何存在的,以及Visual Studio如何知道如何切換它們!沒錯,上面的圖標互換完美適用於表單。但對於notifyIcon,圖標確實從「A」切換到「B」,但它使用舊的A圖標和舊的B圖標 - 不再存在於任何位置的圖標!

我希望我已經解釋了我的問題。我非常感謝任何人都可以提供的幫助。

回答

5

幾個月前我有這個相同的問題,它讓我瘋狂了幾個小時。我非常專注於清除圖標緩存,並認爲這只是某種緩存問題,它並沒有立即讓我知道真正的問題。

答案對我來說至少是:儘管在.ico文件中有一個16x16版本的圖像,但Visual Studio將改爲使用32x32圖像並將其縮小到16x16,導致它看起來失真。我說VS做到了,因爲當我在其他機器上運行可執行文件(不同的Windows操作系統)時,我看到了相同的行爲,所以對我而言這不是Windows 8的問題。 (這可能是一般的Windows問題,雖然我不知道,但我沒有花時間去驗證生成的.exe文件的實際內容 - 包含MY 16x16版本還是16x16版本縮小我的32像素版本?這將證實它,我猜...)

我的「aha」時刻來了,當我添加了幾行紅色像素的每個大小的圖標圖像,在不同的部分我的圖標。所以我把16x16的紅色行放在底部。我的32x32在中心有紅色的行,等等。然後我把這個.ico文件加入到我的項目中,並啓動了項目和BAM,在系統托盤中使用了我的32x32圖標的扭曲版本作爲我的通知圖標。毫無疑問。

如果您發現通知圖標(16x16)看起來比您期望的更扭曲,您可以使用類似的策略來查看是否發生了相同的自動縮放。當我明白這一點時,我的快速解決方案是向我的項目添加一個.ico,只包含我的圖標圖像的16x16版本。然後,我僅將該資源圖像用於通知圖標。顯然,如果你爲表單做了這個(只有16x16的圖像),例如,你會在任務欄,Alt-Tab列表等中看到一個非常扭曲的圖標,因爲Windows在這種情況下沒有選擇,而是創建縮放您的16x16不同的圖標圖像大小,因爲這就是您提供的全部內容。無論如何,在我個人的情況下,我相信你也是如此,使用.ico格式沒有任何問題 - 它們顯示了圖像的實際嵌入16x16版本,沒有32px版本的「自動縮小尺寸」。

這就是我所知道的。我不再在這個問題上花費時間,因爲我不得不繼續前進。我希望這可以幫助別人避免一些圖標沮喪。爲什麼,哦,爲什麼,VS你會這樣對我們!?

+0

哇,謝謝先生!就是這樣!多麼奇怪的問題......如果沒有你的幫助,我永遠都不會想到這件事! – user3487286

+0

如果你認爲這是一個很好的答案,請給它一個upvote。我當然這樣做,因爲這非常有幫助。 – Anthony

1

我對啓動畫面有同樣的問題。 一些它在更換圖片後沒有改變。

我做的是我刪除圖像,然後保存表單。 運行該應用程序,並沒有圖像。 然後我替換了它們,問題就解決了。所以也許你可以嘗試與你一樣的圖標。希望它能解決你的問題。

+0

你好,我已經做了類似的事情。如果我在創建NotifyIcon對象時沒有指定圖標,它不會顯示在系統托盤中,因此我使用了一些隨機圖標,這些圖標是在Windows中找到的。我的項目中添加了一個新圖標(我的更新文件名),然後更改了我的通知圖標以使用我的圖標,但仍然看到舊圖標。當我從我的資源中雙擊我的圖標文件時,它會顯示更新的圖標,並更新我圖標的項目項目上的小圖標。只有通知圖標拒絕使用我的新圖標。謝謝,你的迴應確實給了我幾點想法 – user3487286

0

用編輯器打開項目文件Resources.resx。您必須將name="Icon1"更改爲name="YourIconName"

相關問題