Keydown事件:如何捕获向下和向上的关键行?

时间:2012-08-24 18:26:19

标签: wpf events mvvm-light

我正在尝试捕获向下和向上键(方向行),但是当我按下此键时,它不会引发事件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
            }
        }

1 个答案:

答案 0 :(得分:3)

不确定是否相关,但这是一篇关于CodeProject的文章,讨论了一个非常相似的问题/行为 Up/Down behavior on a DatePicker

在文章建议中处理Code Behind非常简单,但是如果你想要做MVVM风格,你需要使用i:InteractionInputBindings。 我更喜欢交互,因为加上mvvm-light它似乎对我来说效果更好,而InputBindings我发现上/下键不起作用,而像ALT这样的修饰符可以工作。

正如评论所说,它可能会在它到达你之前的某个地方处理。 (这就是为什么你想使用PreviewKeyDown而不是KeyDown)。