Question

J'ai une classe de commande statique comme celle-ci (mais avec beaucoup plus de commandes):

class GuiCommands
{
    static GuiCommands()
    {
        addInterface = new RoutedUICommand(DictTable.getInst().getText("gui.addInterface"), "addInterface", typeof(GuiCommands));
        removeInterface = new RoutedUICommand(DictTable.getInst().getText("gui.removeInterface"), "removeInterface", typeof(GuiCommands));
    }

    public static RoutedUICommand addInterface { get; private set; }
    public static RoutedUICommand removeInterface { get; private set; }
}

Il devrait utiliser mon dictionnaire pour obtenir les textes dans la bonne langue, ce qui ne fonctionne pas, car mon dictionnaire n'est pas initialisé lorsque le constructeur statique est exécuté.

Ma première tentative a été de créer une nouvelle classe de commande qui dérive de RoutedUicommand, de remplacer la propriété texte et d'appeler le dict dans la méthode GET. Mais la propriété texte n'est pas virtuelle et la méthode GetText () - Méthode qu'il appelle.

La seule chose à laquelle je peux penser est de fournir une méthode d'initialisation statique dans cette classe qui traduit toutes les clés de dict. Mais ce n'est pas très propre à mon humble avis parce que je dois nommer chaque commande une fois de plus comme ça

addInterface.Text = DictTable.getInst().getText(addInterface.Text);

Et si j'oublie d'en nommer un, il n'y aura pas d'erreur, mais pas de traduction. Je n'aime même pas que je dois nommer la commande deux fois dans cette classe et encore une fois dans les bindings de commands XAML.

Avez-vous des idées comment cela peut être résolu plus élégamment?

J'aime beaucoup les Routeduicands, mais comme ça, ils sont inutiles pour moi. Pourquoi Microsoft ne pouvait-il pas ajouter le petit mot «virtuel» un peu plus souvent ?? (ou le faire par défaut comme le fait Java ?!)

Était-ce utile?

La solution

J'ai trouvé un moyen acceptable en traduisant automatiquement toutes les commandes en utilisant la réflexion. De cette façon, je n'ai au moins pas à ajouter toutes les commandes à une autre méthode. J'appelle la méthode traduisée juste après avoir initialisé mon dictionnaire.

public static void translate()
{
    // get all public static props
    var properties = typeof(GuiCommands).GetProperties(BindingFlags.Public | BindingFlags.Static);

    // get their uicommands
    var routedUICommands = properties.Select(prop => prop.GetValue(null, null)).OfType<RoutedUICommand>(); // instance = null for static (non-instance) props

    foreach (RoutedUICommand ruic in routedUICommands)
        ruic.Text = DictTable.getInst().getText(ruic.Text);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top