2014-10-20 49 views
1

我有一個WPF應用程序,我支持多種語言。我可以更改語言運行時,因爲我在語言更改時加載包含字符串資源的不​​同資源字典集。如何在更改語言時更新由轉換器生成的字符串?

private void UpdateLoadedLanguages(object sender, SelectionChangedEventArgs e) 
     { 
      RemoveLoadedLanguages(); 

      ResourceDictionary aResourceDictionary = new ResourceDictionary(); 
      ResourceDictionary bResourceDictionary = new ResourceDictionary(); 
      ResourceDictionary cLanguageResourceDictionary = new ResourceDictionary(); 

      Language selectedLanguage = (Language) e.AddedItems[0]; 

      switch (selectedLanguage) 
      { 
       case Language.enUS: 
        a.Source = new Uri("pack://application:,,,/[Projecta];component/src/Helpers/Language.en-US.xaml"); 
        b.Source = new Uri("pack://application:,,,/[Projectb];component/src/resources/Language.en-US.xaml"); 
        c.Source = new Uri("pack://application:,,,/[Projectc];component/src/resources/Language.en-US.xaml"); 
        break; 
       case Language.nlNL: 
        a.Source = new Uri("pack://application:,,,/[Projecta];component/src/Helpers/Language.nl-NL.xaml"); 
        b.Source = new Uri("pack://application:,,,/[Projectb];component/src/resources/Language.nl-NL.xaml"); 
        c.Source = new Uri("pack://application:,,,/[Projectc];component/src/resources/Language.nl-NL.xaml"); 
        break; 
       default: 
        a.Source = new Uri("pack://application:,,,/[Projecta];component/src/Helpers/Language.en-US.xaml"); 
        b.Source = new Uri("pack://application:,,,/[Projectb];component/src/resources/Language.en-US.xaml"); 
        c.Source = new Uri("pack://application:,,,/[Projectc];component/src/resources/Language.en-US.xaml"); 
        break; 
      } 

      App.Current.Resources.MergedDictionaries.Add(aResourceDictionary); 
      App.Current.Resources.MergedDictionaries.Add(bResourceDictionary); 
      App.Current.Resources.MergedDictionaries.Add(cResourceDictionary); 
     } 

與翻譯資源字典通常是這樣的:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:system="clr-namespace:System;assembly=mscorlib"> 

    <system:String x:Key="DefaultApplicationTitleString">Title</system:String> 
    <system:String x:Key="DefaultDoneString">Done</system:String> 
    <system:String x:Key="DefaultCancelString">Cancel</system:String> 
    <system:String x:Key="DefaultDescriptionString">Description unknown</system:String> 

    <system:String x:Key="LanguageSelectionString">Language</system:String> 
    <system:String x:Key="AisleString">Aisle</system:String> 
    <system:String x:Key="LevelsString">levels</system:String> 

</ResourceDictionary> 

當我使用像上面這樣定義的正下方運行完美的字符串之一。

Title="{DynamicResource DefaultApplicationTitleString}" 

但隨着這樣的轉換器...

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      string text = (string) Application.Current.FindResource("DefaultDescriptionString"); 

      if (value != null) 
      { 
       string temp = (string) value; 

       char[] stringSeparators = { 'A', '.', '-' }; 
       string[] stringElements= temp.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries); 

       string aisleString = (string) Application.Current.FindResource("AisleString"); 
       string levelsString = (string) Application.Current.FindResource("LevelsString"); 

       text = aisleString + " " + stringElements[1] + ", " + levelsString + " " + stringElements[2] + " - " + 
           stringElements[3]; 

      } 

      return text; 
     } 

...我用這樣的...

<TextBlock Text="{Binding Id, Converter={StaticResource ItemIdToTextConverter}}" /> 

...然後我的字符串不當我更改語言時更新。如果我轉換的屬性在其viewModel上更新,那麼語言改變就會發生。

所以我的問題:有沒有人有我的解決方案,我的字符串作爲轉換器的結果更新語言的變化?

我一個解決方案的猜測是:(?我將如何做到這一點)

  1. 的力量,使用資源的所有frameworkelements的更新
  2. 或可能做一些與DynamicResourceExtenstion(我發現這個問題:?Return a dynamic resource from a converter,但我不明白的DynamicResourceExtension的解釋所以這是要走的路如果是的話,我將如何實現這一點)

回答

0

這將是太多評論,但利特?樂一個答案(或者不)。

當元素初始化時,轉換器僅被調用一次。之後,如果您使用的是StaticResource,則沒有鏈接。如果你使用DynamicResource,那麼隨時當得到改變的轉換器將被再次調用。

  • 您是否在您的本地化方法中更改源代碼?不。
  • 轉換器在語言​​改變時被調用嗎?是的,但僅限於IdPropertyChanged)的通知。你能解決這個問題

的方法之一是訂閱您的視圖模型語言切換事件,並呼籲屬性更改事件每個屬性。儘管源值仍然相同,這將執行您的轉換器。

其他可能性將是註冊某些需要本地化數據的對象。您將不再使用轉換器,但附加屬性(或行爲取決於複雜性)。枚舉(或保留一個列表)這些屬性的元素並更新它不應該很難。

第三種方式(我將在我第一個本地化的wpf應用程序中使用)是反思。註冊所有windows upong創建(當然,卸載時取消註冊),定義一個模式來說明如何識別元素的本地化屬性並通過它 - 勝利。

關於模式。我的「本地化」控件static內容將使用已有的Uid來定義,而不是在單獨的資源字典中定義它將自動生成的東西)。 動態我還沒有決定,也許會有一個行爲或附加屬性,甚至是小小的和平代碼(我喜歡MVVM,但我不是絕對的)從靜態類中重新分配預定義的字符串,這將通過反思來改變。

+0

謝謝您的回覆!我從第一種解決問題的方式中獲得靈感,致電屬性改變了事件。所以我用一個方法擴展了viewmodel的基類,該方法引發了與該viewModel相關的所有屬性的屬性更改事件。在改變語言選擇時,我爲所有加載的viewModel調用該方法。 – cherryorange 2014-10-21 08:57:03