0

我有一个像这样的静态命令类(但有更多命令):

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() 方法也不是虚拟的。

我唯一能想到的是在这个类中提供一个静态初始化方法来翻译所有的字典键。但这不是很干净恕我直言,因为我必须像这样再次命名每个命令

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

如果我忘记命名一个,不会有错误,只是没有翻译。我什至不喜欢我必须在此类中两次命名命令,并在 XAML 命令绑定中再次命名。

你有什么想法可以更优雅地解决这个问题吗?

我非常喜欢 RoutedUICommands,但是像这样它们对我来说毫无用处。为什么微软不能更频繁地添加“虚拟”这个小词?(或者像 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 回答