2

假设我们有一个 Windows 窗体 Form1,我们为其设置了一个图标。Visual Studio 会将图标存储在 Form1.resx ($this.Icon) 中。

现在我们决定将应用程序本地化为 N 种语言,因此我们将 Localizable 设置为 True,我们从 Language 选项中选择第一种语言,我们翻译文本并继续使用下一种语言重复该过程(选择另一种并翻译)直到N. 结果将是 N .resx 文件,其中包含带有原始图标的 $this.Icon 条目。

然后我们意识到我们想要更新表单图标,所以我们将语言设置为“(默认)”并设置新图标。令我们惊讶的是,我们发现 N 个 .resx 文件没有更新。

我们是否必须手动更新 N 个 .resx 文件?有类似级联更新的东西吗?在这种情况下你会怎么做以避免更新 N 个图标?

4

2 回答 2

1

我刚刚将代码添加到我的 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)
于 2017-03-23T13:48:23.983 回答
-1

老实说,没有理由在每个 resx 中都有相同的图标。

ResX 文件基于语言级联,从最具体的语言资源到最少的语言资源。

如果您从除默认值之外的所有 resx 文件中删除该图标,则将始终使用该图标。

如果您想要特定语言的不同图标,只需将不同图标添加到该 resx 文件。

您可以自己轻松地看到这一点。向表单添加标签,并根据名为“test”的键的值填充它(您可以通过在代码中调用“GetLocalResourceObject("test")' 来完成此操作)。

将键值对 'test'-'Hello' 添加到您的 resx 文件中。假设您的 resx 名为“foo.resx”。在特定于语言的文件(例如“foo.fr.resx”)中添加“test”-“Bonjour”。如果您以任何非法语语言运行程序,您将看到“Hello”,但如果您切换到法语,您将看到“Bonjour”。

它与您的图标的工作方式相同 - 您可以在基本 resx 中设置它,它会针对每种语言显示。然后,您可以在不同的资源文件中覆盖它。

于 2013-03-11T14:16:16.530 回答