如何创建可以在程序的各个部分轻松引用和使用的资源?
我的具体问题是我有一个 NotifyIcon 我想根据程序的状态更改图标。一个常见的问题,但我一直在努力解决这个问题。
如何创建可以在程序的各个部分轻松引用和使用的资源?
我的具体问题是我有一个 NotifyIcon 我想根据程序的状态更改图标。一个常见的问题,但我一直在努力解决这个问题。
好吧,在对 StackOverflow 周围的各个点进行搜索和拼凑之后(天哪,我已经喜欢这个地方了),大多数问题已经过了这个阶段。不过,我确实设法解决了我的问题。
如何创建资源:
就我而言,我想创建一个图标。这是一个类似的过程,不管你想添加什么类型的数据作为资源。
如何使用资源:
太好了,所以我们有了新资源,我们渴望拥有那些可爱的不断变化的图标……我们如何做到这一点?好吧,幸运的是,C# 让这变得非常容易。
有一个名为的静态类Properties.Resources
可让您访问所有资源,因此我的代码最终变得如此简单:
paused = !paused;
if (paused)
notifyIcon.Icon = Properties.Resources.RedIcon;
else
notifyIcon.Icon = Properties.Resources.GreenIcon;
完毕!完成的!当您知道如何操作时,一切都很简单,不是吗?
正如我对 Visual Studio 2010 所期望的那样,上述内容实际上并不适合我。它不允许我访问 Properties.Resources,说由于权限问题而无法访问。我最终不得不更改资源属性中的 Persistence 设置,然后我找到了如何通过 Resources.Designer.cs 文件访问它,它有一个自动获取器,让我可以通过 MyNamespace.Properties.Resources 访问图标.NameFromAddingTheResource。这将返回一个 Icon 类型的对象,可以直接使用。
上述方法效果很好。
另一种方法(我在这里假设 web)是创建您的页面。向页面添加控件。然后在设计模式下转到:Tools > Generate Local Resource。资源文件将自动出现在解决方案中,页面中的所有控件都映射到资源文件中。
要为其他语言创建资源,请将 4 个字符的语言附加到文件名的末尾、扩展名之前(Account.aspx.en-US.resx、Account.aspx.es-ES.resx ...等)。
要检索代码隐藏中的特定条目,只需调用此方法:GetLocalResourceObject([resource entry key/name])
。
Matthew Scharley 发布的代码存在内存泄漏:
paused = !paused;
if (paused)
notifyIcon.Icon = Properties.Resources.RedIcon;
else
notifyIcon.Icon = Properties.Resources.GreenIcon;
您应该Dispose()
在替换它之前 notifyIcon.Icon,因为每次使用它都会Properties.Resources.SOME_ICON
创建一个新的。Icon
这可以在日志中观察到,使用以下代码:
Console.WriteLine(Properties.Resources.RedIcon.GetHashCode());
Console.WriteLine(Properties.Resources.RedIcon.GetHashCode());
Console.WriteLine(Properties.Resources.RedIcon.GetHashCode());
您将在日志中看到 3 个不同的哈希码。这意味着这些是不同的对象。
因此,简单的修复将是:
paused = !paused;
notifyIcon.Icon?.Dispose();
notifyIcon.Icon = paused
? Properties.Resources.RedIcon;
: Properties.Resources.GreenIcon;