2017-08-25 5 views
1

J'essaie d'implémenter mon propre traducteur en utilisant des convertisseurs. Dans le convertisseur, j'appelle une classe statique contenant des traductions. Ces traductions sont chargées au démarrage de l'application.WPF Converter Static Text

Le principal avantage à l'aide des convertisseurs pour moi sont trois:

  1. Je traduis des textes dans l'exécution, en fonction des fichiers de langue XML.
  2. Lors de l'exécution de l'application, j'inscris le texte sans traduction dans un autre fichier XML, ce qui me permet d'ajouter ultérieurement la traduction.
  3. Les traductions sont également appliquées aux données si désiré.

Tout fonctionne bien lorsque le texte à traduire provient d'une propriété binded, par exemple:

<TextBox Grid.Row="1" Text="{Binding NameToShow, Converter={StaticResource TranslationConverter}}"></TextBox> 

Le problème est la traduction du texte statique comme les étiquettes, le contenu de bouton ... L'idée est de faire quelque chose comme cela:

<Button Content={Binding "MyText",Converter={StaticResource TranslationConverter}} Command="{Binding InitializeAdapterCommand}"></Button> 

Évidemment, je ne veux pas déclarer des chaînes statiques dans les ressources ou utiliser des propriétés pouvant être liées.

Des suggestions?

Répondre

1

Vous pouvez créer votre propre MarkupExtension au lieu de compter sur Manchettes:

public class StaticTranslation : MarkupExtension 
{ 
    public StaticTranslation() 
    { 
    } 

    public StaticTranslation(string textToTranslate) 
    { 
     TextToTranslate = textToTranslate; 
    } 

    public string TextToTranslate { get; set; } 

    public IValueConverter Converter { get; set; } 

    public object ConverterParameter { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (Converter != null) 
     { 
      return Converter.Convert(TextToTranslate, typeof(string), ConverterParameter, CultureInfo.CurrentUICulture); 
     } 
     return TextToTranslate; 
    } 
} 

et l'utiliser avec lib étant le xmlns:lib=[namespace containing StaticTranslation]

<TextBlock Text="{lib:StaticTranslation 'ABC',Converter={StaticResource TranslationConverter}}"/> 

Ofcourse l'utilisation du convertisseur StaticTranslation est juste un exemple. Vous pouvez tester/améliorer le code pour l'utilisation en production.

Side note:

Si vous obtenez une erreur lors de l'imbrication Converter={StaticResource TranslationConverter}, déplacez votre extension de balisage à un projet de bibliothèque de classes séparées. Voir les éléments suivants: https://stackoverflow.com/a/11785549/5265292

+0

Il fonctionne parfaitement. J'ai déjà défini Convertisseur dans un projet de bibliothèque de classes à des fins de réutilisation, donc cela a bien fonctionné. Merci. – Alvaro

1

vous pouvez utiliser la propriété Binding.Source pour transmettre une valeur const à un convertisseur:

Text="{Binding Source='My Text', Converter={StaticResource TranslationConverter}}" 
+0

Oh mon cher, je pensais fournir une sorte de 'x: Static' à la source de liaison avant d'opter pour écrire ma réponse, mais j'ai complètement échoué à essayer l'affectation de source la plus simple, pensait déjà à compliqué. +1 – grek40

+0

@ grek40, '" {{Binding Source = {x: Statique smth}} "' fonctionne également :) (https://stackoverflow.com/questions/45175467/return-singleton-value-in-mvvm- pour-liaison). même avec '" {{Binding Source = {StaticResource resourseKey}} "' – ASh

+0

Oui, je sais ... mais j'ai essayé de combiner une telle extension avec l'écriture directe du texte et de ne pas l'utiliser pour obtenir des ressources ou des propriétés statiques, parce que le question n'était pas de rediriger vers une ressource ou une propriété :) – grek40