需要解决重写RoutedUICommand.Text属性的问题

本文关键字:属性 问题 Text RoutedUICommand 解决 重写 | 更新日期: 2023-09-27 18:21:10

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

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

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

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

如果我忘了命名一个,就不会有错误,只是没有翻译。我甚至不喜欢在这个类中两次命名命令,在XAML命令绑定中一次。

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

我很喜欢RoutedUI命令,但像这样它们对我来说毫无用处。为什么微软不能经常添加"虚拟"这个词呢??(或者像JAVA一样将其设为默认值?!)

需要解决重写RoutedUICommand.Text属性的问题

我找到了一种可以接受的方法,即使用反射自动转换所有命令。这样,我至少不必将所有命令添加到另一个方法中。我在初始化字典后立即调用translate方法。

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