Это старая проблема, о которой здесь уже задавали ( Создайте простую неизмененную привязку ключа в WPF ), но ответ мне не подходит. У меня все еще есть проблема.
Я использую. net core 3.1 с WPF, и я хочу определить KeyBinding
для немодифицированного ключа по коду.
В XAML
<Window.InputBindings>
<KeyBinding Command="{Binding MyRoutedCommand}" Key="H" />
</Window.InputBindings>
работает как шарм. Но если я попытаюсь определить KeyBinding
в коде,
KeyBinding b = new KeyBinding()
{
Command = MyRoutedCommand,
Key = Key.H
};
InputBindings.Add(b);
, я получаю исключение NotSupported для жеста None+H
непосредственно при запуске приложения.
Исходное исключение ( немецкий, Visual Studio 2019):
NotSupportedException: Die Kombination aus Taste und Modifizierer "None+H" wird für KeyGesture nicht unterstützt.
Кто-нибудь знает причину, по которой XAML работает и установка InputBinding
по коду не работает?
С уважением, Кристоф
PS:
Основываясь на некоторых комментариях, я обнаружил следующую строку кода в коде за конструктором.
InputBindings.Add(new KeyBinding(MyRoutedCommand, Key.H, ModifierKeys.None));
Если я удалю эту строку, исключение исчезнет. Итак, я думаю, что причина исключения найдена.
Решение (добавлено 09.08.2020):
Код, который я упомянул в вопросе, был правильным . Только строка, которую я нашел в коде файла, была причиной исключения. Если вы сравните строки кода, то увидите, что используются два разных конструктора KeyBinding
.
Проблема в том, что конструктор KeyBinging()
без параметров и конструктор KeyBinding(key, modifier)
работают по-разному.
Конструктор с параметром ключа и модификатора создаст KeyGesture
внутри. И KeyGesture выдаст исключение, если вы попытаетесь использовать «печатаемую» клавишу без клавиши-модификатора. Даже клавиша Shift не поддерживается KeyGesture. Итак, None + H
и Shift + H
недействительны.
Но в самом классе KeyBinding использовать эти комбинации клавиш не проблема. Если вам нужно определить KeyBinding для «печатаемого» ключа, просто используйте конструктор KeyBiding без параметров и добавьте RoutedCommand и ключ вручную, прежде чем добавлять KeyBinding в InputBindings. Это показано в приведенном выше коде.
Я должен сказать «Спасибо» за комментарии. Без помощи я бы не увидел своей ошибки в коде файла.