VS2008项目文件中的资源被表单设计器“创造性地”重复使用,有可能避免吗?

4
我们在Visual Studio 2008的项目中有一些自动生成的资源文件,其中有一些本地化版本,在其中一个本地化版本中,有一个字符串为空。
更明确地说,我们有一个核心的资源文件,其中包含许多字符串资源。然后我们有另外4个本地化版本的文件,在其中一个其他本地化文件中,有一个字符串被赋予了一个空值。
问题是表单设计器非常高兴找到了字符串的资源,并且将不遗余力地重用此资源,以便为生成的表单设计器代码中分配属性的任何空字符串。
例如,如果某个控件上的属性由于某种原因未指定默认值(因此即使为空也将序列化为代码),则它将引用我们的资源,而不是在C#代码中写出空字符串文字。
问题是它引用了本地化版本,而这些版本并没有编译成代码。
下面是一个简化的代码示例:
this.rpAllFields.KeyTip = 
  global::namespaces.SystemMessagesResources_sv_SE.
    dash_red_shift_info_description;

在这种情况下,dash_red_shift_info_description 没有sv-SE语言环境的值,因此设计师在代码中看到空字符串时,会尝试链接到该资源。但是,SystemMessagesResources_sv_SE不是现有的类,而是SystemMessagesResources资源文件的瑞典本地化版本的似乎已生成的类名,该资源文件编译为一个类。
这是否可以避免?我们已经厌倦了每次更改表单文件时进行搜索/替换,并且我们相当确定我们做了一些愚蠢的事情导致了这种情况,但显然我们自己无法找到原因。
如果我们删除了该资源,则上述代码将变成这样:
this.rpAllFields.KeyTip = "";
4个回答

2
如果问题是由资源文件中的空字符串引起的,那么将其更改为一个空格会产生什么影响?因此,资源文件中包含“”的地方更改为“ ”。我不知道这是否是最好的解决方案,但我很想知道它是否会阻止设计师将该资源用作默认空字符串。但是,由于不知道它是如何使用的,我不确定将应该未定义的值定义为空格的影响是什么...

2

您可以尝试创建一个字符串资源empty_string,对于每个语言环境都定义为空字符串""。如果将其设置为第一个资源,表单设计器(希望如此)将始终选择该值作为要在您的表单中使用的值。这样,至少您将使用专门用于此目的的字符串。


问题在于您可能无法更改资源文件或管理它们。如果它们是第三方的,或需要一些非标准的修改来解决空格问题,那么您将会自食其果。 - Klathzazt

0

你需要一个值为空字符串的资源吗?我可以想象一些多语言场景,其中某些资源键应该对应于某些支持语言中的空白(如果您正在使用字符串连接来处理一些UI元素)。

但是,如果我的场景不是这样的话,我会放弃那个空字符串的资源条目。我只会说,“反正哪些独立的UI文本会翻译成空白呢?”

如果我确实需要该资源在某些情况下为空白(其中它代表一种语言中的一篇文章,而另一种语言中不存在等效的单词),我会尝试看看是否可以以其他方式产生相同的效果。


资源条目在原始语言中有值,但在另一种语言中没有,因此为空字符串。如果我删除资源条目,它将默认回到原始语言,这也是错误的。 - Lasse V. Karlsen
你是单独使用空字符串(例如作为 UI 元素的文本)还是将其与其他字符串连接以形成短语?如果是后者,我建议您暂时忽略纯粹主义者,并将不规则资源硬编码到区域感知属性中。 - Ishmaeel

0

生成的资源文件和代码示例会很好。

你的意思是:在你的命名空间中有一个空字符串文字定义(找到的第一个),但这会导致一些问题?它不会一直为空吗?当你编译代码时,它会做一些奇怪的事情来节省空间。我遇到了类似的问题,当生成带有代码后台的XAML文件用于动态构建程序集文件时:编译器足够聪明,知道“这没有任何区别”,但对我们来说却有所不同,因为它会重命名字面量(在其他地方使用)。

为了解决这个问题,我们在命名空间中使用了命名类型来表示这些基元,并将其作为全局类型。我在这里看到的是你的全局命名空间正在填补空白-你可能想要有一个“下面”的命名空间来评估所有空字符串。

我已经一年多没有使用过这个了,所以如果我的措辞不好,请原谅,但我的意思是:想想XML。你需要在属性中显式使用命名空间或将它们分配给较低的位置(如XAML中的附加属性)。

我希望这可以帮助你(并且有意义)。


这是一个资源文件,完全由资源编辑器管理和生成,因此除非我想重写整个资源系统,否则我怀疑我不能随意引入命名空间。 - Lasse V. Karlsen

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