#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 и выполнение того, что вы предложили, устранили мою проблему!