如何在不改变语言环境的情况下更改C# Winform应用程序的资源文件?

3
我们有一个Winform应用程序已经开发了一段时间。它有几个图片和控件颜色,创建了一个品牌体验。我们有第二个客户想要同样的产品,但是使用不同的品牌。
因此,在控件designer.cs文件中有如下代码行:
this.BackgroundImage = global::MyNameSpace.Properties.Resources.background;

似乎资源文件是个好选择,因为我可以简单地更改文化并且有一个不同图像的单独资源文件。但是我不想改变文化(我不想改变日期、货币等的显示),这很麻烦。我能在运行时或编译时手动更改资源文件而无需更改文化吗?有没有更好的方法来实现这个目标?此外,如何使用资源文件设置控件颜色(例如将所有背景从黑色更改为红色)?

你可能希望将最后一部分作为一个单独的问题发布。 - Mark Cidade
2个回答

1

您可以从一个仅包含资源的单独文件中读取资源(但不依赖于全球化卫星程序集机制)。您还可以将默认资源与主程序集一起编译作为后备。

您可以使用Resgen.exe.resx文件创建.resources文件,然后使用ResourceManager来读取它:

//note that resourceFilename does NOT include the ".resources" extension
var rm = ResourceManager.CreateFileBasedResourceManager( resourceFilename
                                                        ,resourceDir
                                                        ,null);
this.BackgroundImage = (Image) rm.GetObject("background");

马克,听起来很有前途。你能给我指一些资源,可以帮助我逐步创建和读取来自单独程序集的资源吗? - Handleman
我改变了我的答案,因为你只需要资源文件而不需要链接到程序集中。我包含了使用说明和代码。 - Mark Cidade
感谢您的帮助和代码。这个解决方案似乎需要我更改现有设计文件中的代码,从 this.BackgroundImage = global::MyNameSpace.Properties.Resources.background; 到 this.BackgroundImage = (Image) rm.GetObject("background"); 并且必须在这些文件中拥有"rm"的范围。 当我将控件加载到设计器中时,这不会产生错误吗? - Handleman
我会从设计文件中删除代码,并将自定义代码放在窗体的主文件中。 - Mark Cidade
你的建议是可行的,只是从我的角度来看,这似乎是一条高路。现有的代码库很大,重构所有内容以适应此更改似乎是不必要的,因为另一种选择是仅添加一行代码“Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")”。设置区域设置的唯一问题是它对日期、货币等的影响。似乎应该有一种简单的方法来利用区域设置具有交换资源的能力。 - Handleman

0
你可以考虑的一个选项是创建自定义文化,例如,你可以创建一个名为的文化。
ClientA-fr-FR
ClientB-fr-FR

你需要为每个资源创建并能够适当地设置线程文化。

这里有一个链接 "如何:创建自定义文化"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接