如何让Visual Studio使用我更新的NotifyIcon图标?

时间:2014-04-02 00:44:30

标签: c# winforms visual-studio-2012 icons notifyicon

我完全被这个问题困扰,我不知道该怎么做。 我使用Visual Studio 2012 Premium创建了一个简单的C#Windows窗体应用程序。我有一个小程序启动并在系统托盘中创建一个NotifyIcon。单击托盘图标时,将显示一个上下文菜单,它会显示一些菜单选项(选项,关于等),其中每个选项都显示一个表单。我通过右键单击我的项目项,属性,资源,通过参数添加了两个图标文件(.ico)。我以编程方式更改了我的NotifyIcon的图标,在两个不同的图标之间交替。我的问题是我的旧图标不断显示,而不是我添加到项目中的新图标。要清楚,我的问题是OLD图标不断显示 - 一切正常,没有错误,它只显示我的最新图标。 我在代码中更改图标的方式是使用:

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

我最初制作了我的图标并使用了这些图标后来决定稍微更改它们 - 我改变了一些颜色等等。然后我通过单击“从项目中排除”选项从项目中删除旧图标。然后我添加了我的新图标,这些图标有不同的名称。然后我更新了我的两个代码引用,加载图标以使用新名称。无论我做什么,我的新/更新图标都不会显示!

无论我是在调试版还是发布模式下运行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的。无论如何,我不是图标文件的名称是问题。

现在,在代码中,如果我使用相同的策略并设置我的表单的一个图标,它可以正常工作,表单显示我的最新图标,而我的通知图标仍然显示旧的(现在不存在,除了在Visual Studio中)拉拉土地)图标。 所以,我有:

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

没有错误以及notifyIcon和optionsForm的更改,但是通知图标显示我的OLD图标,该图标在任何地方都不再存在(除了某处/某种方式在VS中)。表单的图标更改为我的更新/最新图标。

如果我将我的应用程序的.exe文件复制到另一台计算机并运行它,它也会显示通知图标的旧图标,因此旧图标仍以某种方式嵌入在Visual Studio生成的exe中。如果我只是直接加载.ico文件,而不是引用我的项目资源,则会显示新图标。这必须是Visual Studio中某种奇怪的资源缓存问题吗?

任何人都可以帮我解决这个问题吗?我只是不明白我的旧图标是如何存在的,以及Visual Studio如何知道如何切换它们!没错,上面的图标换出适用于表单。但是对于notifyIcon,图标确实从“A”切换到“B”,但是它使用了旧的A图标和旧的B图标 - 不再存在的图标了!

我希望我已经解释了我的问题。我非常感谢任何人都可以提供的任何帮助。

3 个答案:

答案 0 :(得分:5)

几个月前我遇到了同样的问题,这让我疯狂了几个小时。我非常专注于清除图标缓存,并认为它只是某种缓存问题,它并没有立即发生在我身上真正的问题。

至少对我来说答案是:即使您的.ico文件中有16x16版本的图像,Visual Studio也会使用32x32图像并将其缩小到16x16,使其看起来扭曲。我说VS是这样做的,因为当我在其他机器(不同的Windows操作系统)上运行可执行文件时,我看到了相同的行为,因此对于我而言,它不是Windows 8的问题。 (一般来说,这可能是一个Windows问题,我不知道。我没有花时间来验证生成的.exe内部实际内容 - 它是否包含我的16x16版本或16x16版本通过缩小我的32px版本生成的?那可能已经证实了,我猜...)

我的" aha"当我在图标的不同部分添加几行红色像素到我的图标图像的每个尺寸时,我就来了。所以我把16x16的红色行放在底部。我的32x32在中心有红色的行,等等。然后我将这个.ico添加到我的项目并启动项目和BAM,我的32x32图标的扭曲版本在系统托盘中用作我的通知图标。毫无疑问。

如果您注意到您的通知图标(16x16)看起来比您预期的更加扭曲,您可能会使用类似的策略来查看是否发生了相同的自动缩放。当我想到这一点时,我的快速解决方案是在我的项目中添加.ico,其中仅包含我的图标图像的16x16版本。然后我将该资源图像仅用于我的通知图标。显然,如果您为表单执行此操作(只有16x16图像),例如,您会在任务栏,Alt-Tab列表等中看到一个非常扭曲的图标,因为Windows在这种情况下别无选择,只能创建通过缩放16x16来获得不同的图标图像大小,因为这是您提供的全部内容。无论如何,在我的特殊情况下,我相信也是你的,使用.ico表格没有问题 - 它们显示实际嵌入的16x16版本的图像,并且没有"自动缩小尺寸" 32px版本。

这就是我所知道的。我没有在这个问题上花费更多时间,因为我不得不继续前进。我希望这有助于某些人避免一些图标挫败感。为什么,哦,为什么,VS你会这样做给我们的!?

答案 1 :(得分:1)

我在启动画面时遇到了同样的问题。 一些如何在更换图片后没有改变。

我做的是删除图像然后保存表格。 运行应用程序,没有图像。 然后我换了他们,问题就解决了。 所以也许你可以尝试同样的图标。 希望它能解决你的问题。

答案 2 :(得分:0)

使用编辑器打开项目的文件Resources.resx。在那里,您必须将name="Icon1"更改为name="YourIconName"