Контекстное меню Systray - почему мои команды не включены? - PullRequest
1 голос
/ 19 декабря 2008

Я создаю приложение WPF и имею значок в системном трее с контекстным меню. Для пунктов меню я хочу использовать команды WPF, но когда я их назначаю, они всегда отображаются серым цветом, хотя (в других местах разрешены (такие же) команды.

)
MenuItem menuItem = new MenuItem();
menuItem.Header = "Exit";
menuItem.Command = CustomCommands.ExitApplication;
Systray.AddMenuItem(menuItem);

Это прекрасно работает, когда я назначаю события щелчка, и я пытался создать метод CanExecute для команды, который всегда устанавливает для CanExecute значение true, но это тоже не помогает. Кто-нибудь понял, почему пункты меню отключены?


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

Чтобы решить эту проблему, я добавил после добавления пунктов меню в контекстное меню следующее:

CommandManager.InvalidateRequerySuggested();

Ответы [ 3 ]

3 голосов
/ 19 декабря 2008

Наверное, вам нужно добавить CommandBinding в меню или systray, чтобы ваша команда обрабатывалась. Хотя я думаю, что если бы это было так, он был бы включен по умолчанию.

2 голосов
/ 20 декабря 2008

Да, я видел, как это произошло. Иногда вы должны указать системе WPF CommandManager перезапустить методы CanExecute. Попробуйте вызвать его после загрузки ContextMenu: CommandManager.InvalidateQuerySuggested();

0 голосов
/ 09 июня 2013

У меня была похожая проблема. Я чувствую, что мое решение - это что-то вроде хака, но я действительно не мог обойти эту проблему. Я использую пользовательскую реализацию DelegateCommand, и включение / отключение кнопок и элементов меню работает, за исключением элементов в контекстных меню. Итак, я обработал событие ContextMenuOpening, затем сохранил Items во временной переменной, вызвал метод Clear в ContextMenu и повторно добавил элементы сразу после этого. Работает как шарм, но, как я уже сказал, чувствует себя "хакером". Это выглядит примерно так:

    private void ContextMenu_ContextMenuOpening (object sender, System.ComponentModel.CancelEventArgs e)
    {
        // HACK: For some reason items need to be removed and added back so that the command enablement requery works.
        var menu = sender as ContextMenu;
        if (menu == null) return;

        var menuItems = menu.Items.ToArray();
        menu.Items.Clear();
        foreach (var menuItem in menuItems)
            menu.Items.Add(menuItem);
    }
...