2012-10-22 174 views
2
<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> 

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

现在我想改变的ResourceDictionary的源名称源= “StringLocalization/Dictionary_fr-FR.xaml”到源= “StringLocalization/Dictionary_en-US.xaml”

我应该做的为了那个原因。

+0

为什么你想这样做? – pdvries

+0

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

回答

4

MSDN-documentation解释,

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

看起来您只能通过创建一个或加载一个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你需要它。让我知道这是否有帮助。