Как подавить обработку сочетаний клавиш в меню KeyDown в WPF? - PullRequest
0 голосов
/ 05 октября 2011

У меня есть приложение, в котором есть сочетания клавиш и текстовые поля. Я хочу, чтобы сочетания клавиш были отключены, когда текстовое поле имеет фокус, но я не могу найти простой способ сделать это. Я мог бы обработать событие 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 Ответ

1 голос
/ 05 октября 2011

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

Это отключит сочетания клавиш. Некоторые источники ocde с вашей стороны могут быть полезны.

EDIT

ТАК, что теперь у вас есть 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;
    } 

Код выше только для иллюстрации.

...