我目前正在開發一個必須支持6種不同語言的項目。我已經有一個工作實現使用字符串資源文件和窗體本地化的控制。實施的最後一部分涉及在程序運行時實時更改語言。我已經看到了如何做到這一點的建議,並且我最終使用了ApplyResources方法的修改版本。在一般情況下,我說的是這樣的事情:C# - 運行時Windows窗體本地化(語言)更改 - ListView列標題不會更改語言
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資源文件中添加了相應的法語文本,並且當我將表單本地化切換到法語時,Designer View向我展示了法語翻譯版本,就像預期的那樣。更進一步,我嘗試在構造函數中將表單的InitializeComponent()方法更改爲全局線程currentUICulture屬性爲法語。我確認這會爲列表視圖中的列標題加載正確的法語資源。
但是,我嘗試手動將文化應用於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);
我試着計算器上尋找解決方案後,類似的東西:
var lv = (ListView)_myListView;
foreach (ColumnHeader col in lv.Columns)
{
resources.ApplyResources(col, col.Name, culture);
}
效果相同 - 沒有語言的變化。我查看了Designer.cs代碼,看看是否有任何關鍵的區別或缺失的行,看起來我正確地做了。所有其他控件都能正確更改語言,但列表視圖中的列標題拒絕動態更改文本。有沒有人見過這個?我在這裏做錯了什麼?
在最壞的情況下,我可以將列標題的文本移動到外部資源文件,然後手動設置每個列標題的文本,但是我發現這是一個很大的麻煩,特別是如果我有處理稍後有很多列的列表視圖,或者如果文本需要爲每種語言設置多個值。非常感謝幫助!