如何在 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
}
我有一种情况需要处理按键事件,它可以是 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
}