WPF Routed Command иногда срабатывает только - PullRequest
0 голосов
/ 25 февраля 2011

У меня есть несколько 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 ]

2 голосов
/ 25 февраля 2011

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

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 может не достичь его по какой-либо другой причине.

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

1 голос
/ 28 февраля 2011

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

1 голос
/ 25 февраля 2011

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

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

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

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

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

...