2012-01-24 67 views
0

我有這樣一個靜態的Command類(但有更多的命令):工作需要,各地的覆蓋RoutedUICommand.Text財產

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方法中調用字典。但是Text屬性不是虛擬的,它也不是它所調用的GetText()方法。

我唯一能想到的是在這個類中提供了一個靜態初始化方法,它可以轉換所有的字典密鑰。但是,這是不是很乾淨,恕我直言,因爲我不得不再次命名的每一個命令這樣

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

,如果我忘了一個名字,也不會有錯誤,只是沒有翻譯。 我甚至不喜歡這個,我必須在這個類中命名兩次,並再次在XAML命令綁定中命名。

你有什麼想法可以更優雅地解決這個問題嗎?

我很喜歡RoutedUICommands,但是就像這樣,它們對我來說是無用的。爲什麼微軟不能更頻繁地添加「虛擬」這個小詞? (或使它像JAVA默認?!)

+1

爲什麼不把命令的構造(addinterface = ..)移動到addInterface命令的getter? 你也應該避免構建可能永遠不會被調用的命令.. – SvenG

+0

看起來非常有希望,代碼看起來很棒,但不起作用,因爲每次命令被請求時都會創建一個新實例。我的按鈕不再可點擊:(我可以緩存它,但它主要是我以前的代碼。 – JCH2k

+0

看起來像你的DictTable是一個Sigleton?爲什麼不把這個類初始化? – Kolja

回答

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