c# - .net 处理表单中的图像资源

标签 c# .net winforms

当我的表单引用图像和图标资源时,我对是否要处理它们感到有点困惑。具体来说,如果我从设计时资源中引用图像/图标或在运行时加载图像,行为是否会有所不同。 (.Net4, VS2015, C#)

显然,如果您在设计时将窗体的 Icon 属性设置为 Resource,则在窗体关闭时您不会显式地对其 Dispose() 进行处理。但是如果你这样设置呢:

this.Icon = Resources.my_default_icon;

您是否必须在关闭该表单时处理 this.Icon

类似地,如果我有一个仅用于“品牌化”的迷你类,并且有一个在运行时加载的静态 Icon 对象(可能来自文件,可能只是引用嵌入式资源)怎么办?我应该在那个静态 Icon 的 getter 中使用复制构造函数吗?还是可以将其设为公共(public)静态 Icon 并允许我的所有表单在其 _Shown() 事件中包含以下单行代码?

this.Icon = MyBrandingClass.formIcon;

不确定它是否有很大不同,我已经看到一些关于在运行时设置图片框图像和处理图像的引用资料,但是你会处理嵌入的资源图像吗?如果我传递对我的品牌形象的引用,我可以/应该省略处理吗?或者我应该在 getter 中使用复制构造函数来返回一个新的 Image 对象,然后在完成表单时始终将其处理掉吗?

最佳答案

程序应该在不再需要图像时处理这些图像,但这并不一定意味着您的代码需要这样做。

在您的第一个示例中:

this.Icon = Resources.my_default_icon;

这实际上转发到一个 ResourceManager 的静态实例类(class)。查看 Resources.Designer.cs 中的代码,您可能会发现它很有用。

您可以将该类视为“拥有”图像。它最初会创建对图像的引用,因此当 ResourceManager 的实例被销毁时(即当程序退出时),它会处理它

你的第二个例子实际上非常相似:

this.Icon = MyBrandingClass.formIcon;

您正在自己实现类似于 ResourceManager 的东西。

在这种情况下,将 MyBrandingClass 视为图像的所有者,因此负责清除图像。如何?使 MyBrandingClass 成为具有静态实例的单例。这样,当程序终止时,MyBrandingClass 的析构函数此时您可以处置它在其生命周期内实例化的任何资源。

您可以考虑的其他事情是让您的 MyBrandingClass 继承自 ResourceManager。或者,您可能只拥有 ResourceManagers 的多个实例(假设您计划拥有不同版本的 MyBrandingClass)。正如我所说,查看 Resources.Designer.cs 中的文档和代码可能会让您了解实际发生的内部情况,并让您了解可能在运行时填充 ResourceManager(可能来自 a directory of images?)

如果在设计时所有资源都是已知的,另一种选择是在您的项目中拥有多个资源对象。右键单击项目,添加新项目,选择“资源文件”。然后,您可以使用适合每个品牌的内容填充每个品牌,并在应用程序启动时初始化对正确品牌的引用。这会使您的可执行文件膨胀,因为即使您只使用一个品牌,您也包含了每个品牌的所有资源。如果您想更改品牌或添加新品牌,它还需要重建应用程序,因此也许在运行时从目录动态填充资源管理器可能会更好(尽管安装程序打包会稍微复杂一些)。

关于c# - .net 处理表单中的图像资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42233060/

相关文章:

c# - 在一个函数中多次更新屏幕元素

c# - 如何在 C# 的 ListView 中添加图像?

c# - 如何使用 ISO 8601 格式的 DateTime 字段将 JSON 文本反序列化为 BsonDocument?

c# - 将 IEnumerable<Task<T>> 转换为 IObservable<T>

c# - 文本框仅在其他线程完成后更新

c# - 从 C# Windows 应用程序读取/写入三星安卓手机/平板电脑

c# - 将列表和字典合并为 1 个字典

c# - 将文件从字符串或流上传到 FTP 服务器

c# - 为什么 int.Max+ int.Max = -2

c# - 用户控件 - 从数据源的属性名称列表中选取属性值