Создайте простую неизмененную привязку ключей в WPF (. net core 3.1 /.net 5) - PullRequest
0 голосов
/ 05 августа 2020

Это старая проблема, о которой здесь уже задавали ( Создайте простую неизмененную привязку ключа в 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. Это показано в приведенном выше коде.

Я должен сказать «Спасибо» за комментарии. Без помощи я бы не увидел своей ошибки в коде файла.

1 Ответ

0 голосов
/ 05 августа 2020

NotSupportedException: D ie Kombination aus Taste und Modifizierer "None + H" wird für KeyGesture nicht unterstützt.

Оба ваших решения работают для. NET Framework, как а также. NET Core 3.1. Это исключение явно касается KeyGesture. Вы создаете экземпляр KeyGesture с модификатором None, как показано ниже, при создании привязки клавиш, и это вызовет NotSupportedException. Удаление этой строки или назначение модификатора разрешит ее.

InputBindings.Add(new KeyBinding(MyRoutedCommand, Key.H, ModifierKeys.None));

В качестве ссылки из MSDN о KeyGesture и клавишах-модификаторах:

В большинстве случаях KeyGesture должен быть связан с одним или несколькими ModifierKeys. Исключением из этого правила являются функциональные клавиши и числовые c клавиши клавиатуры, которые сами по себе могут быть допустимым KeyGesture.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...