击键事件不在 C# WPF 中执行

key strokes events dont execute in C# WPF

我在 Prism 中使用 WPF MVVM 模式 我正在尝试将键绑定绑定到某个命令

----查看---

<Canvas Background="Red" Grid.Row="1">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="PreviewKeyDown">
                    <prism:InvokeCommandAction Command="{Binding KeyDownCmd}"/>
                </i:EventTrigger>
                <i:EventTrigger EventName="KeyDown">
                    <prism:InvokeCommandAction Command="{Binding KeyUpCmd}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>           
        </Canvas>

----查看模型----

       #region Commands
        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)
        {
           //some code here
        }

        private void KeyDownExecute(KeyEventArgs obj)
        {
             //some code here
        }

我也试过像这样绑定到代码隐藏 KeyDown="Canvas_KeyDown" 什么都没有

尝试使用 PreviewKeyDown /PreviewKeyUp 但什么也没有

还尝试将键盘命令绑定到 canvas 上方的网格和 userControl 上,什么都没有

P.S 我正在使用 viewInjection as described here

在页面之间导航

A Canvas 不会引发任何击键事件,除非它是 Focusable 并且已聚焦。

您可以通过在 XAML 中设置 属性 使其可聚焦,但您仍然必须在某些时候聚焦它,例如当它被点击时:

private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Canvas canvas = (Canvas)sender;
    Keyboard.Focus(canvas);
}

XAML:

<Canvas Focusable="True" Background="Red"
        PreviewKeyDown="Canvas_PreviewKeyDown"
        MouseLeftButtonDown="Canvas_MouseLeftButtonDown">
    ...
</Canvas>

您可能应该重新考虑您的方法,改为处理父元素的 PreviewKeyDownCanvas 的可聚焦子元素。