2017-01-31 3 views
0

Je travaille sur une application WPF qui doit être multilingue. J'ai donc suivi les étapes de ce article et ajouté quelques dictionnaires de ressources à mon projet. Puis j'ajouter un de ces dictionarioes à la fenêtre par la méthode suivante, que je vous appelle - à des fins de test - dans le constructeur de la fenêtre:Comment afficher un texte de ressource multilingue au moment du design dans WPF

private void SetLanguageDictionary() 
    { 
     ResourceDictionary dict = new ResourceDictionary(); 

     switch (Thread.CurrentThread.CurrentCulture.ToString()) 
     { 
      case "en-US": 
      case "en-GB": 
       dict.Source = new Uri("Resources\\StringResources_en-US.xaml", 
           UriKind.Relative); 
       break; 
      case "de-DE": 
       dict.Source = new Uri("Resources\\StringResources_de-DE.xaml", 
            UriKind.Relative); 
       break; 
      default: 
       dict.Source = new Uri("Resources\\StringResources_de-DE.xaml", 
            UriKind.Relative); 
       break; 
     } 

     Resources.MergedDictionaries.Add(dict); 
    } 

Enfin je mis en œuvre les ressources dans les étiquettes sur mon fenêtre comme ça:

<Label Grid.Row="0" 
      Grid.Column="0" 
      Margin="5" 
      Content="{DynamicResource firstname}"></Label> 

Si la culture actuelle sur mon PC est "en-US" le contenu sera "Prénom". Ou en cas de "DE-DE" (allemand) "Vorname".

Lors de l'exécution, cela fonctionne très bien, mais au moment de la conception, je ne peux pas voir les textes.

Que dois-je faire?

+0

Je pense que vous pourriez ce faire à la dure, j'utilise Content = "{Binding CommonDate, Source = {Ressources StaticResource }} "où Ressources est Resources.resx – 0x4f3759df

+0

Cela ressemble à un travail d'injection de dépendance. J'utilise la boîte à outils MVVM Light de NuGet - par défaut, les données que vous liez proviendront de l'un des deux services de données (référentiels) - vous avez un service de conception, qui gère les données fictives pour la conception, et votre service de production, utilisé au runtime. Dans votre viewmodel, vous récupérez les objets auxquels vous vous liez depuis le service de données, mais vous obtiendrez différents objets en fonction du service de données utilisé (ce qui dépend de votre mode de conception). Vous pouvez trouver plus d'informations sur https://mvvmlight.codeplex.com/ –

Répondre

0

Je l'ai découvert.

J'ai dû implémenter le ResourceDictionary dans Window.Resources. Pour ce faire, certaines balises doivent être ajoutées ("ResourceDictionary", "ResourceDictionary.MergedDictionaries").

S'il y a des styles définis, ils doivent être déplacés à l'intérieur de l'étiquette "ResourceDictionary" comme vous pouvez le voir ci-dessous.

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Resources/StringResources_en-US.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 

     <Style x:Key="style1"> 
      [...] 
     </Style> 

     [...] 
    </ResourceDictionary> 
</Window.Resources> 

Vous pouvez alors voir les textes du XAML fichier dans les contrôles qui y sont liés comme ressource dynamique. Et parce qu'il est utilisé comme ressource dynamique, il peut être remplacé dans le code-behind:

 ResourceDictionary dict = new ResourceDictionary(); 
     dict.Source = new Uri("Resources\\StringResources_de-DE.xaml", 
            UriKind.Relative); 
     Resources.MergedDictionaries.Add(dict);