如何在wpf中动态更改资源字典源名称?

时间:2012-10-22 11:24:58

标签: wpf resourcedictionary

<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”

我应该怎么做。

1 个答案:

答案 0 :(得分:4)

MSDN-documentation解释,

  

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

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

使用ResourceDictionaries了解您的目的也很重要。如果您打算将它们用作“共享资源”,则无法使用“嵌入资源”操作构建字典。确保将它们标记为“内容”并正确链接到其路径位置。此外,了解Merged Dictionaries在选择哪种资源方面的行为也很重要(取自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。如果这有帮助,请告诉我。

相关问题