如何在 WPF 中使用 Prism 6 处理 ViewModel 中的按键事件?

How to handle a key press event in ViewModel using Prism 6 in WPF?

我有一种情况需要处理按键事件,它可以是 A-Z、0-9 中的任何一个,但我需要在 ViewModel 中处理它。按下哪个键应该传递给 ViewModel。我使用的是 prism 6.0,因此 View1ViewModel 与 view1 自动关联。

我知道我可以处理特定的键,但如何对所有键执行相同的操作。

我在 ViewModel "KeyPressed" 中有一个 属性,我在代码隐藏中尝试了以下代码

private void Window_PreviewKeyUp(object sender, KeyEventArgs e)
{
    _mainWindowViewModel.KeyPressed = e.Key;
}

但是此代码不会更新 View1ViewModel,因为在 Prism 框架视图模型中,视图绑定是通过框架进行的。 我尝试使用交互,我将下面的代码放在根 Grid 部分。

<i:Interaction.Triggers >
   <i:EventTrigger EventName="KeyUp">
      <i:InvokeCommandAction Command="{Binding KeyUpEventCommand}" 
        CommandParameter="..."/>
    </i:EventTrigger>
</i:Interaction.Triggers>

事件被触发,但由于没有 Command 参数,因此它为空。我需要传递一个命令参数,但不知道它应该是什么!

在 ViewModel 中:

public DelegateCommand KeyUpEventCommand { get; private set; }

private string strAlphabet;
public string Alphabets
{
     get { return strAlphabet; }
     set { SetProperty(ref strAlphabet, value); }
}

public MainWindowViewModel(IEventAggregator eventAggregator)
{
     KeyUpEventCommand = new DelegateCommand(KeyUpEventHandler);
}

public void KeyUpEventHandler()
{
     //This logic can be changed
     if (Alphabets == "A")
     {
         // Perform some action
     }
     if (Alphabets == "B")
     {
         // Perform some other action
     }
}

任何 ideas/suggestions 我该如何处理?

命令的类型属性应该是DelegateCommand<KeyEventArgs>:

public DelegateCommand<KeyEventArgs> KeyUpEventCommand { get; private set; }

private string strAlphabet;
public string Alphabets
{
    get { return strAlphabet; }
    set { SetProperty(ref strAlphabet, value); }
}

public MainWindowViewModel(IEventAggregator eventAggregator)
{
    KeyUpEventCommand = new DelegateCommand<KeyEventArgs>(KeyUpEventHandler);
}

public void KeyUpEventHandler(KeyEventArgs args)
{
    //...
}

还要确保您使用的是 Prism 自己的 InvokeCommandAction class 并且不要设置它的 CommandParameter 属性:

xmlns:prism="http://prismlibrary.com/"
...
<i:Interaction.Triggers >
    <i:EventTrigger EventName="PreviewKeyDown">
        <prism:InvokeCommandAction Command="{Binding KeyUpEventCommand}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

那么KeyEventArgs应该默认作为命令参数传递。

试试 KeyTriger

    <i:Interaction.Triggers>
        <ei:KeyTrigger Key="Escape">
            <i:InvokeCommandAction Command="{Binding KeyDownCommand}" />
        </ei:KeyTrigger>
    </i:Interaction.Triggers>





public ICommand KeyDownCommand
    {
        get { return new RelayCommand(KeyboardKeyDownCommand, true); }
    }

    private void KeyboardKeyDownCommand()
    {
        ///code
    }