WPF Routed Command иногда срабатывает только

У меня есть несколько RoutedCommands для таких команд, как control-A, copy paste, и все они работают нормально. Затем я добавил еще 4 перенаправленные команды для перемещения объекта вверх и вниз по холсту с помощью клавиш со стрелками, иногда они работают, а иногда нет. Сначала я думал, что это проблема с Focus на Canvas, но я только что узнал, что в то же время все другие перенаправленные команды, такие как control-A, работают, но стрелки не работают. Я действительно понятия не имею, что здесь происходит, они являются идентичными маршрутизируемыми командами с разными именами переменных, как получается, что одна работает 100% времени, а одна - только 50% времени?

Рабочая RoutedCommand:

_bindings.Add(new CommandBinding(DesignerCanvas.SelectAll, SelectAll_Executed));
SelectAll.InputGestures.Add(new KeyGesture(Key.A, ModifierKeys.Control));

private void SelectAll_Executed(object sender, ExecutedRoutedEventArgs e)
{
    SelectionService.SelectAll();
}

Неисправность RoutedCommand:

_bindings.Add(new CommandBinding(DesignerCanvas.MoveDown, MoveDown_Executed));
MoveDown.InputGestures.Add(new KeyGesture(Key.Down));

private void MoveDown_Executed(object sender, ExecutedRoutedEventArgs e)
{
    e.Handled = true;
    var selectedItems = from item in SelectionService.CurrentSelection.OfType<DesignerItem>()
                            select item;

    if (selectedItems.Count() > 0)
    {
        for (int i = 0; i < selectedItems.Count(); i++)
            selectedItems.ElementAt(i).Top += Option.OptionSingleton.Sensitivity;
    }
}

Работающая со сбоями RoutedCommand иногда просто не срабатывает, особенно после того, как я открою другое окно и вернусь на холст, тогда он перестанет срабатывать, в то время как другие перенаправленные команды не будут затронуты. Есть идеи, что вызывает это странное поведение?

3 ответа

Решение

Оказывается, это была проблема с фокусом, я просто устанавливал фокус на холст каждый раз, когда вводит мышь, теперь это вроде исправлено. Спасибо всем за ответы.

Иногда вы можете использовать очень инклюзивные обработчики событий класса для отслеживания маршрута события:

EventManager.RegisterClassHandler(typeof(FrameworkElement), CommandManager.CanExecuteEvent, 
     new CanExecuteRoutedEventHandler((s, e) => Debug.WriteLine("CanExecute: " + s)), true);
EventManager.RegisterClassHandler(typeof(FrameworkElement), CommandManager.ExecutedEvent, 
     new CanExecuteRoutedEventHandler((s, e) => Debug.WriteLine("Executed:" + s)), true);
EventManager.RegisterClassHandler(typeof(FrameworkElement), CommandManager.ExecutedEvent, 
     new CanExecuteRoutedEventHandler((s, e) => Debug.WriteLine("KeyDown:" + s)), true);

В вашем случае KeyDown может быть обработан до того, как он достигнет привязки команды или CanExecute событие может не достигнуть его по какой-то другой причине.

Надеюсь, это поможет вам решить проблему

Это может быть связано с тем, что клавиша, которую вы используете, это клавиша "Вниз". Я подозреваю, что если бы вы использовали другой ключ, он бы работал.

Некоторые элементы управления используют клавиши со стрелками и клавиши pageup/pagedown. Например, TextBox делает это. Если ваш Canvas находится в средстве просмотра прокрутки, его может съесть.

Есть два обходных пути для этого:

  1. Добавьте привязку к элементу управления, который использует жест ключа.
  2. Обработайте KeyPreview для Canvas (или любого родителя элемента управления, который использует нажатие клавиши) и выполните команду оттуда.

Ответ на этот вопрос показывает, как вы можете сделать #2 без написания определенного кода в обработчике KeyPreview для каждой команды.

Другие вопросы по тегам