我正在尝试捕获向下和向上键(方向行),但是当我按下此键时,它不会引发事件keydown。
但是,如果我按任何其他键,则会引发该事件。例如,catlock被捕获。行键是特殊键吗?
我正在使用MVVMLight将事件转换为命令,并传递KeyEventArgs。
感谢。
编辑:添加一些代码
好。我真的有一个comboBox,并且是可编辑的,所以我可以在comboBox中编写文本。如何启用搜索选项,在我写作时,选择会被更改。
所以选择可能会因为很多原因而改变:我写了,comboBox因为搜索选项而改变选择,我可以用鼠标改变选择,我可以用箭头键改变选择。
我想知道选择更改的原因是什么。所以我需要知道在我的comboBox中我按下或向上按下箭头键。
我有这段代码:
AXML
<ComboBox DisplayMemberPath="Type" Height="23" HorizontalAlignment="Left" IsSynchronizedWithCurrentItem="True" Margin="0,16,0,0" Name="cmbType" VerticalAlignment="Top" Width="238"
ItemsSource="{Binding Path=Types}"
SelectedIndex="{Binding Path=TypesIndex}" IsEditable="True"
Text="{Binding TypesText}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="PreviewKeyDown">
<cmd:EventToCommand Command="{Binding TypesPreviewKeyDownCommand, Mode=OneWay}" PassEventArgsToCommand="True" />
</i:EventTrigger>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding TypesSelectionChangedCommand, Mode=OneWay}" CommandParameter="{Binding ElementName=cmbTypes, Path=SelectedItems}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
在我的viewModel中:
private RelayCommand<KeyEventArgs> _typesPreviewKeyDownCommand = null;
public RelayCommand<KeyEventArgs> typesPreviewKeyDownCommand
{
get
{
if (_typesPreviewKeyDownCommand == null)
{
_typesPreviewKeyDownCommand = new RelayCommand<KeyEventArgs>(typesPreviewKeyDownCommand);
}
return _typesPreviewKeyDownCommand;
}
}
private void typesPreviewKeyDownCommand(KeyEventArgs e)
{
if (e.Key == Key.Down || e.Key == Key.Up)
{
//my code
}
else
{
//more code
}
}
答案 0 :(得分:3)
不确定是否相关,但这是一篇关于CodeProject的文章,讨论了一个非常相似的问题/行为 Up/Down behavior on a DatePicker
在文章建议中处理Code Behind非常简单,但是如果你想要做MVVM风格,你需要使用i:Interaction
或InputBindings
。
我更喜欢交互,因为加上mvvm-light它似乎对我来说效果更好,而InputBindings
我发现上/下键不起作用,而像ALT这样的修饰符可以工作。
正如评论所说,它可能会在它到达你之前的某个地方处理。 (这就是为什么你想使用PreviewKeyDown
而不是KeyDown
)。