如何在不更改文化的情况下更改 c# winform 应用程序的资源文件?

Posted

技术标签:

【中文标题】如何在不更改文化的情况下更改 c# winform 应用程序的资源文件?【英文标题】:How can I change resource files for a c# winform app, without changing the culture? 【发布时间】:2010-08-04 03:49:43 【问题描述】:

我们有一个已经开发了一段时间的 winform 应用程序。它有几个图像和控制颜色,可以创建品牌体验。我们有第二位客户想要相同的产品,但品牌不同。

所以我们在控件designer.cs文件中有如下代码行:

this.BackgroundImage = global::MyNameSpace.Properties.Resources.background;

似乎资源文件是要走的路,因为我可以简单地改变文化并拥有一个包含不同图像的单独资源文件。

但我不想改变文化(我不希望日期、货币等的显示)被改变,它只是闻起来。

我可以在运行时或编译时手动更改资源文件而无需更改区域性吗?

有没有更好的方法来实现这个结果?

另外,您/您如何使用资源文件来设置控件颜色(例如,将所有背景从黑色更改为红色)?

【问题讨论】:

您可能想将最后一点作为单独的问题发布。 【参考方案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");

【讨论】:

马克,这听起来很有希望。您能否指出可以引导我从单独的程序集中创建和读取资源的资源? 我更改了答案,因为您只需要资源文件而不需要链接到程序集。我包括使用说明 + 代码。 感谢您的帮助和代码。这个解决方案似乎我必须从 this.BackgroundImage = global::MyNameSpace.Properties.Resources.background 更改现有设计器文件中的代码;到 this.BackgroundImage = (Image) rm.GetObject("background");并且必须在这些文件的范围内包含“rm”。当我将控件加载到设计器中时,这不会产生错误吗? 我会从设计器文件中删除代码并将自定义代码放入表单的主文件中。 您的建议有效,这似乎是我所在的道路。现有的代码库很大,为了适应这种变化而对其进行重构似乎是没有根据的,因为替代方法是简单地添加一行代码“Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR")”。设置文化的唯一问题是它会对日期、货币等产生影响。似乎应该有一种简单的方法来利用文化设置交换资源的能力。【参考方案2】:

您可以考虑的一个选项是创建自定义文化,例如,您可以创建一个名为

的文化
ClientA-fr-FR
ClientB-fr-FR

您为每个资源创建资源,您应该能够适当地设置线程文化。

这是一个链接"How to: Create Custom Cultures"

【讨论】:

以上是关于如何在不更改文化的情况下更改 c# winform 应用程序的资源文件?的主要内容,如果未能解决你的问题,请参考以下文章

在不使用代码的情况下更改 Windows 区域设置/文化

如何在不使用 IDE 的情况下更改 C# 程序的图标?

如何在不更改格式的情况下返回 DateTime

如何在不选择 RichTextBox 的情况下恢复插入符号位置或更改文本颜色

如何在不更改原始数组的情况下更改函数中的数组? [复制]

如何在不更改修改后的时间戳的情况下签入文件?