es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para vincular un keybind a algún comando en el patrón WPF MVVM con Prism, debes seguir estos pasos:

    1. En tu Vista, agrega un EventTrigger para los eventos PreviewKeyDown y KeyDown.
      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>
    2. En tu ViewModel, crea dos comandos, KeyDownCmd y KeyUpCmd, de tipo DelegateCommand<keyeventargs>.
      csharp
      public DelegateCommand<keyeventargs> KeyDownCmd { get; private set; }
      public DelegateCommand<keyeventargs> KeyUpCmd { get; private set; }
    3. Inicializa estos comandos en el constructor de tu ViewModel.
      csharp
      public GameViewModel()
      {
      KeyDownCmd = new DelegateCommand<keyeventargs>(KeyDownExecute);
      KeyUpCmd = new DelegateCommand<keyeventargs>(KeyUpExecute);
      }
    4. Implementa los métodos KeyDownExecute y KeyUpExecute en tu ViewModel.
      private void KeyUpExecute(KeyEventArgs obj)
      {
        // algún código aquí
      }
      
      private void KeyDownExecute(KeyEventArgs obj)
      {
        // algún código aquí
      }
      
    5. Asegúrate de que tu Vista y ViewModel estén correctamente conectados. Puedes hacer esto estableciendo el DataContext de tu Vista como una instancia de tu ViewModel.
    6. Si el keybind no funciona, intenta usar los eventos PreviewKeyDown y PreviewKeyUp en lugar de los eventos KeyDown y KeyUp.
    7. Si el keybind aún no funciona, intenta vincular el comando de tecla al grid que está sobre el canvas o al UserControl. Si estás navegando entre páginas con ViewInjection, asegúrate de que la Vista que contiene el canvas esté activa y visible.

Comments are closed.