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

3
<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"

我应该怎么做呢?


http://social.msdn.microsoft.com/forums/en-US/wpf/thread/4ed27a95-bc48-4694-b5fb-66fdab8a79f3 - Klaus78
1个回答

5
MSDN文档解释说:

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

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

此外,了解使用ResourceDictionaries的目的也很重要。如果您打算将它们用作“共享资源”,则不能使用“嵌入式资源”操作构建字典。确保将它们标记为“内容”,并正确链接到它们的路径位置。此外,还需要了解合并的字典在哪些资源上覆盖另一个资源(取自MSDN文档):

合并字典中的资源占据了资源查找范围中紧接在它们合并到的主资源字典范围之后的位置。虽然资源键必须在任何单个字典中唯一,但在一组合并的字典中可以存在多个键。 在这种情况下,返回的资源将来自于在MergedDictionaries集合中顺序找到的最后一个字典。如果MergedDictionaries集合是在XAML中定义的,则合并字典中元素的顺序就是提供标记时元素的顺序。如果一个键在主字典中和被合并的字典中都定义了,那么返回的资源将来自于主字典。这些作用域规则对静态资源引用和动态资源引用同样适用。

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

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

    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);
    }

如果需要,以下是代码。如果有帮助,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接