在 XAML/C# (Windows 10) 中防止 ListView 的 Return(Enter)、向上和向下箭头键的默认行为

Preventing default behaviour of Return(Enter), Up and Down Arrow keys for a ListView in XAML/C# (Windows 10)

当列表视图具有焦点时,按回车键的默认行为是选择列表视图的第一个元素,向上和向下箭头键滚动列表视图。我试图阻止这种默认行为并连接我的自定义逻辑。

我能够使用 KeyDown 为列表视图实现访问键,如下所示:

代码隐藏方法:

CoreWindow.GetForCurrentThread().KeyDown += KeyDownHandler;

MVVM 方法:

<ListView SelectedIndex="{Binding IsSelected, Mode=TwoWay}"/>

触发 Keydown 属性:

<core:EventTriggerBehavior EventName="KeyDown">
        <core:InvokeCommandAction Command="{x:Bind VMDataContext.KeyDownCommand}" />
    </core:EventTriggerBehavior>

并使用行为将列表视图的滚动条滚动到选定的索引:

<corebehaviors:ListViewScrollBehaviour SelectedIndex="{x:Bind IsSelected, Mode=OneWay}"/>

当列表视图没有焦点时会触发上述处理程序。当列表视图具有焦点时,将触发向上箭头、向下箭头和 Enter 键的默认行为,而不是我的附加行为。有没有办法防止默认行为?

试试这个

CoreWindow.GetForCurrentThread().KeyDown += new KeyEventHandler(ListView_KeyDown);

private void ListView_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
        //do ur stuff
}

使用 PreviewKeyDown 事件而不是 KeyDown

会是更好的方法

回车键是所谓的 VirtualKey(单击 Link 查看 MSDN 文档)。这应该可以完成:

        private void UIElement_OnKeyDown(object sender, KeyRoutedEventArgs e)
        {
            if (e.Key == VirtualKey.Enter)
            {

            }
        }

希望对您有所帮助。

考虑扩展 ListView 控件并覆盖 OnKeyDown 处理程序。

public class ExtendedListView : ListView
{
    protected override void OnKeyDown(KeyRoutedEventArgs e)
    {
        if (e.Key == VirtualKey.Enter || e.Key == VirtualKey.Up || e.Key == VirtualKey.Down)
        {
            return;
        }

        base.OnKeyDown(e);
    }
}