gpt4 book ai didi

C# - Windows 窗体本地化(语言)在运行时更改 - ListView 列标题不会更改语言

转载 作者:行者123 更新时间:2023-11-30 22:20:44 24 4
gpt4 key购买 nike

我目前正在从事一个必须支持 6 种不同语言的项目。我已经有了一个工作实现,它使用字符串的资源文件和控件的表单本地化。实现的最后一部分涉及在程序运行时实时更改语言。我已经看到有关如何执行此操作的建议,最后我使用了 ApplyResources 方法的修改版本。一般来说,我说的是这种事情:

ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
CultureInfo culture = new CultureInfo("fr-FR");

resources.ApplyResources(_mybutton, _mybutton.Name, culture);

因此,按钮“_mybutton”文本将更改为法语本地化版本。这适用于我的所有表单和控件,特定的 ListView 控件除外。此 ListView 有 5 列对象类型 ColumnHeader。我正在尝试使用 ApplyResources 将列标题的文本更改为新语言。我已经在 .fr.resx 资源文件中为列标题添加了适当的法语文本,正如预期的那样,当我将表单本地化切换为法语时,设计器 View 向我显示了法语翻译版本。

更进一步,我尝试在构造函数中窗体的 InitializeComponent() 方法之前将全局线程 currentUICulture 属性更改为法语。我确认这将为 ListView 中的列标题加载正确的法语资源。

但是,当我尝试手动将区域性应用到 ColumnHeader/ListView 资源时,我的问题出现了。例如,我会说代码大致如下所示:

ComponentResourceManager resources = new ComponentResourceManager(typeof(myUserControl));
CultureInfo culture = new CultureInfo("fr-FR");
resources.ApplyResources(_myListView, _myListView.Name, culture);
resources.ApplyResources(_myColumnHeader1, _myColumnHeader1.Name, culture);
this.Refresh();

无论我尝试什么,我都无法将法语资源应用于列标题文本。我也试过:

 resources.ApplyResources(_myListView.Columns[0], _myListView.Columns[0].Name, culture);

在 stackoverflow 上搜索解决方案后,我尝试了类似的方法:

 var lv = (ListView)_myListView;
foreach (ColumnHeader col in lv.Columns)
{
resources.ApplyResources(col, col.Name, culture);
}

相同的效果 - 没有语言变化。我查看了 Designer.cs 代码,看看是否有任何关键差异或我遗漏的行,看起来我做对了。所有其他控件都可以正确更改语言,但我的 ListView 中的列标题拒绝动态更改文本。有没有人见过这个?我在这里做错了什么?

在最坏的情况下,我可以将列标题的文本移动到外部资源文件,然后手动设置每个列标题的文本,但我发现这很麻烦,尤其是当我必须稍后处理具有许多列的 ListView ,或者如果文本需要为每种语言提供多个值。非常感谢您的帮助!

最佳答案

我对自己的问题进行了更多研究,看起来 .NET Framework 中实际上存在一个错误,即 ColumnHeader 对象的 .Name 方法实际上并未正确返回对象名称。这就是我尝试将资源应用于该对象失败的原因。

我能够通过对 ColumnHeaders 的更改进行硬编码来解决问题。例如:

resources.ApplyResources(_myHeader, "_myHeader", culture);

基本上,您只需将对 .Name 的调用替换为名称的文字字符串。我已经测试过这个并且它有效。不幸的是,这意味着它不适合作为我用来更改所有控件的代码的一部分。我必须为每个需要更改的 ColumnHeader 对象添加一行。幸运的是,我没有使用列数可变的 ListView ,因为这可能会很棘手。

另一种选择是创建本地化的资源文件。您可能已经将它们用于消息框文本和其他字符串等内容。然后您可以在您的资源文件中添加一个条目,例如“columnHeader_myHeader”,并为每种语言设置适当的语言文本。最后,您可以使用以下方法手动更改列标题的文本:

_myHeader.Text = myResourceFileName.columnHeader_myHeader;

这将根据当前线程文化选择合适的语言。

关于C# - Windows 窗体本地化(语言)在运行时更改 - ListView 列标题不会更改语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14816735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com