0

次のような静的 Command クラスがあります (ただし、さらに多くのコマンドがあります)。

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; }
}

静的コンストラクターの実行時に辞書が初​​期化されないため、辞書を使用して適切な言語のテキストを取得する必要がありますが、これは機能しません。

私の最初の試みは、RoutedUICommand から派生した新しいコマンド クラスを作成し、Text プロパティをオーバーライドして、get メソッドで dict を呼び出すことでした。しかし、Text プロパティは仮想ではなく、それが呼び出す GetText()-Method もそうではありません。

私が考えることができる唯一のことは、すべての辞書キーを変換するこのクラスで静的初期化メソッドを提供することです。しかし、このようにすべてのコマンドにもう一度名前を付ける必要があるため、これはあまりきれいではありません

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

名前を付けるのを忘れても、エラーは発生せず、翻訳は行われません。このクラスでコマンドに 2 回名前を付け、XAML コマンドバインディングでもう一度名前を付ける必要があることさえ好きではありません。

これをよりエレガントに解決する方法はありますか?

私は RoutedUICommands が大好きですが、このように私には役に立ちません。Microsoft はなぜ「仮想」という小さな単語をもう少し頻繁に追加できなかったのでしょうか?? (または、JAVA のようにデフォルトにしますか?!)

4

1 に答える 1

0

リフレクションを使用してすべてのコマンドを自動的に変換することで、受け入れられる方法を見つけました。このようにして、少なくともすべてのコマンドを別のメソッドに追加する必要はありません。辞書を初期化した直後に翻訳メソッドを呼び出します。

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);
}
于 2012-01-25T09:21:17.147 に答える