Как мне подавить обработку нажатия клавиш сочетания клавиш меню в WPF?

#wpf #textbox #keyboard-shortcuts

#wpf #текстовое поле #сочетания клавиш

Вопрос:

У меня есть приложение, в котором есть сочетания клавиш меню и текстовые поля. Я хочу, чтобы сочетания клавиш были отключены, когда текстовое поле имеет фокус, но я не могу найти простой способ сделать это. Я мог бы обработать событие PreviewKeyDown текстового поля, но отправка события KeyDown не приводит к запуску события TextInput, поэтому мне пришлось бы вручную запускать событие TextInput самостоятельно, и я должен был бы убедиться, что каждое текстовое поле переопределяет событие PreviewKeyDown и создает событие TextInput.

Это единственный способ подавить сочетания клавиш меню, когда текстовое поле имеет фокус, или есть другой способ, который менее подвержен ошибкам?

Редактировать:

Вот как я добавляю сочетание клавиш:

 var kgc = new NuiWpfCore.Input.UnrestrictedKeyGestureConverter();  // allows gestures without modifier keys
var result = kgc.ConvertFromString(s) as NuiWpfCore.Input.UnrestrictedKeyGesture;
m_KeyBinding = new KeyBinding();
m_KeyBinding.Command = KeyBindingCommand;
m_KeyBinding.Modifiers = result.Modifiers;
m_KeyBinding.Key = result.Key;
m_Parent.InputBindings.Add(m_KeyBinding); // m_Parent is of type UIElement
  

Ответ №1:

Можете ли вы предоставить больше входных данных, как в ТОМ, КАК вы регистрируете сочетания клавиш? Использование KeyBinding ? Если это так, то оно уже должно Command быть указано. Итак, в Canexecute команды возвращает false, если текстовое поле находится в фокусе.

Это отключит сочетания клавиш. Может быть полезен некоторый исходный код ocde с вашей стороны.

Редактировать

ИТАК, теперь, когда вы KeyBinding используете KeyBindingCommand , который выглядит RoutedCommand для меня как. Если да, то у привязок команд есть CanExecute функция.

     m_Parent.CommandBindings.Add(new CommandBinding(KeyBindingCommand, OnExecuted, CanExcute));
  

В CanExecute обработчике …. CanExecutedRoutedArgs может быть / может быть неправильным

     private void CanExecute(object sender, CanExecutedRoutedArgs args)
    {
          e.CanExecute = !textBox.IsFocused;
    } 
  

Приведенный выше код приведен только для иллюстрации.

Комментарии:

1. Моя команда изначально не была RoutedCommand, но изменение ее на RoutedCommand и выполнение того, что вы предложили, устранили мою проблему!