2013-03-11 74 views
2

假設我們有一個Windows窗體Form1,我們爲其設置了一個圖標。 Visual Studio將圖標存儲在Form1.resx($ this.Icon)中。.resx表單圖標級聯更新

現在我們決定將應用程序本地化爲N種語言,因此我們將Localizable設置爲True,我們從語言選項中選擇第一種語言,翻譯文本,然後繼續下一個重複該過程的語言(選擇另一種語言翻譯)到N.結果將是包含具有原始圖標的$ this.Icon條目的N個.resx文件。

然後,我們意識到我們要更新的形式圖標,因此我們將語言設置爲「(默認)」和我們設定的新圖標。令我們驚訝的是,我們發現N .resx文件沒有更新。

我們是否需要手動更新N .resx文件?有沒有像級聯更新?在這種情況下你會做什麼來避免更新N個圖標?

回答

-1

老實說,沒有理由在每個resx中都有相同的圖標。

ResX文件級聯基於語言,從最具體的語言資源到最少。

如果您從您的所有文件RESX除外默認的圖標,將始終使用的圖標。

如果你想要一個不同的圖標爲特定的語言,只需將不同的圖標添加到RESX文件。

你可以很容易地看到這一點。爲表單添加一個標籤,並根據名爲'test'的鍵的值填充它(可以在代碼中調用'GetLocalResourceObject(「test」)'來完成此操作)。

添加鍵值對'測試' - '你好'到你的resx文件。假設你的resx被稱爲'foo.resx'。在特定於語言的文件(如'foo.fr.resx')中添加'測試' - 'Bonjour'。如果您以非法語言運行程序,您會看到'Hello',但如果切換到法語,您會看到'Bonjour'。

它將工作與你的圖標以同樣的方式 - 你可以將其設置在底座RESX,它會顯示每種語言。然後您可以在不同的資源文件中覆蓋它。

0

我只是將代碼添加到我的Program.Main來修改所有解決方案.resx文件以刪除Form.Icon。

try 
    { 
     string solutionDirPath = @"path\to\solution"; 
     string[] resxFilePaths = Directory.GetFiles(solutionDirPath, "*.resx", SearchOption.AllDirectories); 
     foreach (string resxFilePath in resxFilePaths) 
     { 
      XDocument xdoc = XDocument.Load(resxFilePath); 
      var iconElement = xdoc.Root.Elements("data").SingleOrDefault(el => (string)el.Attribute("name") == "$this.Icon"); 
      if (iconElement != null) 
      { 
       iconElement.Remove(); 
       xdoc.Save(resxFilePath); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 

    } 
    finally 
    { 

    } 

而且我的垃圾箱尺寸幾乎減少了兩倍!

也爲各種形式的我只是將使用圖標從我的應用程序的可執行

Icon.ExtractAssociatedIcon(Application.ExecutablePath)