.net 以表单形式处理图像资源

AWe*_*ber 5 .net c# winforms

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

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

this.Icon = Resources.my_default_icon;
Run Code Online (Sandbox Code Playgroud)

this.Icon关闭该表格后是否需要丢弃?

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

this.Icon = MyBrandingClass.formIcon;
Run Code Online (Sandbox Code Playgroud)

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

ste*_*eet 3

当程序不再需要图像时,应该将其丢弃,但这并不一定意味着您的代码需要这样做。

在你的第一个例子中,当你这样做时:

this.Icon = Resources.my_default_icon;
Run Code Online (Sandbox Code Playgroud)

这实际上转发到ResourceManager类的静态实例。看一下Resources.Designer.cs中的代码,您可能会发现它内容丰富。

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

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

this.Icon = MyBrandingClass.formIcon;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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