需要解决重写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一样将其设为默认值?!)
我找到了一种可以接受的方法,即使用反射自动转换所有命令。这样,我至少不必将所有命令添加到另一个方法中。我在初始化字典后立即调用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);
}