Нужен обходной путь для переопределения свойства RoutedUICommand.Text - PullRequest
0 голосов
/ 24 января 2012

У меня есть статический класс 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 и вызвать dict в методе get.Но свойство Text не является виртуальным, как и метод GetText (), который он вызывает.

Единственное, о чем я могу подумать, - это обеспечить статический метод инициализации в этом классе, который транслирует все дикт-ключи.Но это не очень понятно, ИМХО, потому что я должен назвать каждую команду еще раз так:

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

, и если я забуду назвать одну, ошибки не будет, просто нет перевода.Мне даже не нравится, что мне приходится называть команду дважды в этом классе и еще раз в привязках команд XAML.

У вас есть идеи, как это можно решить более элегантно?

Мне очень нравятся команды RoutedUIC, но они мне бесполезны.Почему Microsoft не может добавить слово «виртуальный» чуть чаще ??(или сделать его по умолчанию, как это делает JAVA?!)

1 Ответ

0 голосов
/ 25 января 2012

Я нашел приемлемый способ, переводя все команды автоматически с помощью отражения. Таким образом, по крайней мере, мне не нужно добавлять все команды в другой метод. Я вызываю метод 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);
}
...