Los eventos de pulsaciones de teclas no se ejecutan en C# WPF.
Estoy utilizando el patrón WPF MVVM con Prism
estoy intentando vincular una tecla a algún comando
—-Vista—
<canvas background="Red" grid.row="1">
<i:interaction.triggers>
<i:eventtrigger eventname="PreviewKeyDown">
<prism:invokecommandaction command="{Binding KeyDownCmd}"></prism:invokecommandaction>
</i:eventtrigger>
<i:eventtrigger eventname="KeyDown">
<prism:invokecommandaction command="{Binding KeyUpCmd}"></prism:invokecommandaction>
</i:eventtrigger>
</i:interaction.triggers>
</canvas>
—-Vista del modelo—-
#region Comandos
public DelegateCommand<keyeventargs> KeyDownCmd { get; private set; }
public DelegateCommand<keyeventargs> KeyUpCmd { get; private set; }
#endregion
#region Ctor
public GameViewModel()
{
KeyDownCmd = new DelegateCommand<keyeventargs>(KeyDownExecute);
KeyUpCmd = new DelegateCommand<keyeventargs>(KeyUpExecute);
}
private void KeyUpExecute(KeyEventArgs obj)
{
//algún código aquí
}
private void KeyDownExecute(KeyEventArgs obj)
{
//algún código aquí
}
También intenté vincularlo al código detrás de la siguiente manera KeyDown="Canvas_KeyDown"
y nada
Intenté usar PreviewKeyDown / PreviewKeyUp y nada
También intenté vincular el comando de tecla a la cuadrícula encima del lienzo y al control de usuario y nada
P.D.
Estoy navegando entre páginas con viewInjection según se describe aquí: enlace
davy.ai
Para vincular un keybind a algún comando en el patrón WPF MVVM con Prism, debes seguir estos pasos:
EventTrigger
para los eventosPreviewKeyDown
yKeyDown
.xml
<canvas background="Red" grid.row="1">
<i:interaction.triggers>
<i:eventtrigger eventname="PreviewKeyDown">
<prism:invokecommandaction command="{Binding KeyDownCmd}"></prism:invokecommandaction>
</i:eventtrigger>
<i:eventtrigger eventname="KeyDown">
<prism:invokecommandaction command="{Binding KeyUpCmd}"></prism:invokecommandaction>
</i:eventtrigger>
</i:interaction.triggers>
</canvas>
KeyDownCmd
yKeyUpCmd
, de tipoDelegateCommand<keyeventargs>
.csharp
public DelegateCommand<keyeventargs> KeyDownCmd { get; private set; }
public DelegateCommand<keyeventargs> KeyUpCmd { get; private set; }
csharp
public GameViewModel()
{
KeyDownCmd = new DelegateCommand<keyeventargs>(KeyDownExecute);
KeyUpCmd = new DelegateCommand<keyeventargs>(KeyUpExecute);
}
KeyDownExecute
yKeyUpExecute
en tu ViewModel.DataContext
de tu Vista como una instancia de tu ViewModel.PreviewKeyDown
yPreviewKeyUp
en lugar de los eventosKeyDown
yKeyUp
.