2012-09-14 39 views
1

是否有創建ResourceDictionary定位器的方法。 現在我有在XAML:ResourceDictionary定位器

<ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="../../Resources/StringResources.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 

如果後面的代碼將基於的CurrentCulture詞典列表

我想有

<ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <Locator "StringResources"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 

或者類似的東西,使得我不必修改每個v.xaml.cs文件

回答

2

你可以創建自己的ResourceDictionary:

public class ResourceDictionaryLocator : ResourceDictionary 
{ 
    public ResourceDictionaryLocator() 
    { 
     switch (CurrentLocalization) 
     { 
      case "English": 
       base.Source = new Uri("pack://application:,,,/Languages/English.xaml"); 
       break; 

      case "French": 
       base.Source = new Uri("pack://application:,,,/Languages/French.xaml"); 
       break; 
     } 
    } 
} 

然後使用它是這樣的:

<Application x:Class="TestingWPF.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:TestingWPF" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <local:ResourceDictionaryLocator /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

這通常是不這樣做,但是。您可以在運行時加載不同的資源字典。像下面這樣:

Application.Current.Resources.MergedDictionaries.Clear(); 
Application.Current.Resources.MergedDictionaries.Add(dictionary); 
+0

這是真棒,我做了這個定位器聽全球語言改變的事件,現在我的整個應用程序從一個下拉列表中改變。謝謝你這個優雅的解決方案 – maxfridbe

2

您可以創建一個MarkupExtension將返回所請求的資源字典:

public class ResourceDictionaryLocator : MarkupExtension 
{ 
    public string DictionaryName { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     // Logic to return the wanted ResourceDictionary 
     if (DictionaryName == "...") 
     { 
     } 

     return null; 
    } 
} 

然後在XAML中使用它:

<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <local:ResourceDictionaryLocator DictionaryName="StringResources" /> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary>