击键事件不在 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>
您可能应该重新考虑您的方法,改为处理父元素的 PreviewKeyDown
或 Canvas
的可聚焦子元素。
我在 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>
您可能应该重新考虑您的方法,改为处理父元素的 PreviewKeyDown
或 Canvas
的可聚焦子元素。