【问题标题】:How to dynamically change resource dictionary source name in wpf?如何在 wpf 中动态更改资源字典源名称?
【发布时间】:2012-10-22 11:24:57
【问题描述】:
<Application x:Class="CustControls.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml">
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/ControlLibrary;component/Styles/ControlResource.xaml"/>
            <ResourceDictionary Source="StringLocalization/Dictionary_fr-FR.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

现在我想将 ResourceDictionary 的源名称 Source="StringLocalization/Dictionary_fr-FR.xaml" 更改为 Source="StringLocalization/Dictionary_en-US.xaml"

我该怎么办。

【问题讨论】:

标签: wpf resourcedictionary


【解决方案1】:

MSDN-documentation 解释,

"在代码中,您不设置 Source 属性。相反,您必须获取 通过创建一个或加载一个 ResourceDictionary 对象。一 加载现有 ResourceDictionary 以调用 XamlReader.Load 的方法 具有 ResourceDictionary 根的现有 XAML 文件流,然后 将 XamlReader.Load 返回值强制转换为 ResourceDictionary。"

看起来你只能通过创建或加载一个 ResourceDictionary 来获得。

了解您使用 ResourceDictionaries 的目的也很重要。如果您打算将它们用作“共享资源”,则无法使用“嵌入式资源”操作构建字典。确保它们被标记为“内容”并正确链接到它们的路径位置。此外,了解合并字典在选择哪个资源而不是另一个资源方面的行为也很重要(取自MSDN-documentation):

合并字典中的资源占用资源中的一个位置 在主资源范围之后的查找范围 他们被合并到的字典。虽然资源键必须是 在任何单独的字典中都是唯一的,一个键可以存在多个 一组合并字典中的时间。 在这种情况下,资源 返回的将来自按顺序找到的最后一个字典 MergedDictionaries 集合。 如果 MergedDictionaries 集合是在 XAML 中定义的,然后是合并的顺序 集合中的字典是元素的顺序 标记中提供。如果在主字典中定义了一个键 并且还在合并的字典中,然后是资源 返回的将来自主字典。这些范围规则 同样适用于静态资源引用和动态资源 参考文献。

查看您的代码,您似乎只想将另一个 ResourceDictionary 加载到您的应用程序中。如果这就是你想要的,那么可能将它添加到 MergedDictionaries 集合中可能已经足够了。

如果您想在运行时加载一个,您可以使用以下代码(或类似代码)。只要确保你没有嵌入你的资源:

    try
    {
        string path = @".\Themes\Dictionary1.xaml";
        var xmlTextReader = new XmlTextReader(path);
        var resourceDictionary = (ResourceDictionary)XamlReader.Load(xmlTextReader);
        Application.Current.Resources.MergedDictionaries.Clear();
        Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);
    }
    catch (Exception exception)
    {
        Debug.WriteLine(exception.Message);
    }

这里是code,以备不时之需。让我知道这是否有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多