Поймать ряд символов с помощью клавиш в xaml - PullRequest
0 голосов
/ 03 июля 2018

Я разрабатываю функцию, в которой пользователь может нажать от 1 до 9 или от «а» до «z», которая выполняет команду в списке. Я создал поддержку чисел, но мне не очень нравится, как я это сделал.

<Grid.InputBindings>
    <KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D0" CommandParameter="0" />
    <KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D1" CommandParameter="1" />
    <KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D2" CommandParameter="2" />
    <KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D3" CommandParameter="3" />
    <KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D4" CommandParameter="4" />
    <KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D5" CommandParameter="5" />
    <KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D6" CommandParameter="6" />
    <KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D7" CommandParameter="7" />
    <KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D8" CommandParameter="8" />
    <KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D9" CommandParameter="9" />
</Grid.InputBindings>

Если я реализую оставшиеся символы таким же образом, у меня будет огромный список привязок. Не только для поддержки букв , но и numpad . Я бы предпочел проверить диапазоны символов, как я это делал с элементом управления Winform в другой части нашего приложения с кодом:

if (e.KeyValue >= '1' && e.KeyValue <= '9' ||
    e.KeyValue >= 'A' && e.KeyValue <= 'Z')
    {
        FavoriteShortcutKeyPressedCallBack.Raise(e.KeyValue);
    } 

Я действительно думаю, что это возможно, но я не могу найти решение или найти в Интернете решение, которое соответствует шаблону MVVM.

Итак, в основном мой вопрос , как это можно сделать в WPF / MVVM более общим и элегантным образом?

Как я это решил

Я взял предложение из ответа mm8 , чтобы использовать EventToCommandBinding. Это привело к следующему коду в XAML:

<i:Interaction.Behaviors>
    <behaviors:EventToCommandBehavior Event="PreviewTextInput"
                                      Command="{Binding TextInputCommand}"
                                      PassArguments="True" />
</i:Interaction.Behaviors>

ViewModel имеет TextInputCommand, который считывает текст из EventArgs и выбирает соответствующий элемент.

public RelayCommand<TextCompositionEventArgs> TextInputCommand { get; set; }

private void HandleTextInputCommand(TextCompositionEventArgs args)
{
   SelectItemBoundToShortcut(args.Text);
}

Сначала я использовал событие KeyDown в качестве user1672994 , предложенного в комментариях. Но выяснилось, что мне приходилось учитывать разные раскладки клавиатуры и отдельно проверять наличие символов numpad. Использование события PreviewTextInput просто отправляет набранный текст, а это именно то, что мне нужно.

1 Ответ

0 голосов
/ 03 июля 2018

Вы можете обработать событие PreviewKeyDown. Либо в программном обеспечении представления, откуда вы затем вызываете команду модели представления:

private void Grid_PreviewKeyDown(object sender, KeyEventArgs e)
{
    var viewModel = DataContext as YourViewModel;
    if (viewModel != null)
    {
        switch (e.Key)
        {
            case Key.D0:
                viewModel.ShortcutCharacterCommand.Execute("0");
                break;
            case Key.D1:
                viewModel.ShortcutCharacterCommand.Execute("1");
                break;
                //...
        }
    }
}

Или используя триггер взаимодействия, как описано здесь:

MVVM, передающий EventArgs в качестве параметра команды

Вы также можете обернуть функциональность, определенную в обработчике событий, в прикрепленное поведение .

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