如何在 UWP 中覆盖 ListView 的 KeyDown:Space 或 Enter 或对其进行操作?

Nil*_*zor 5 winrt-xaml uwp

我已将该KeyDown事件附加到ListView我的 Win 10 UWP 应用程序中。我想要产生VirtualKey.Enter特殊效果,但该事件不会针对该特定键触发。空格、向上或向下箭头也没有。我猜这是因为列表视图已经为这些键定义了特殊行为。

不过,我想覆盖其中一些键,或者至少触发其他操作。即使使用修饰符(例如 Shift+ArrowDown)将事件附加到这些键也不起作用,因为事件仍然没有触发。

我读到,对于 WPF,有一个PreviewKeyDown可以附加的事件。但我找不到 UWP 的该事件。还有其他选择吗?

Cor*_*cus 5

斯蒂芬妮的答案很好,并且适用于一般情况。然而,正如 Nilzor 观察到的那样,它在 ListView 的 Enter 键的情况下不起作用。由于某种原因,ListView 会在按下 Enter 时处理 KeyDown 事件。

正如问题所要求的,在处理 ListView 时处理关键事件的更好方法是这样。

 private void ListView_Loaded(object sender, RoutedEventArgs e)
    {
        (sender as ListView).AddHandler(UIElement.KeyDownEvent, new KeyEventHandler(ListView_KeyDown), true);
    }

 private void ListView_KeyDown(object sender, KeyRoutedEventArgs args)
    {
        if (args.Key == Windows.System.VirtualKey.Enter)
        {

        }
    }
Run Code Online (Sandbox Code Playgroud)

请注意 AddHandler 函数中的最后一个参数。这指定我们是否要处理已经由可视化树中的前一个元素处理的事件。当然,不要忘记在适当的时候取消订阅活动


Sté*_*ich 1

这是一种方法:订阅全局 Window.Current.CoreWindow.KeyDown 事件。然后保存列表视图的焦点状态并做出相应的反应。

这是代码:

public sealed partial class MainPage : Page
{
    bool hasFocus = false;
    public MainPage()
    {
        this.InitializeComponent();
        Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;
    }

    private void CoreWindow_KeyDown(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.KeyEventArgs args)
    {
        if(hasFocus)
        {
            Debug.Write("Key down on list");
        }
    }

    private void myList_GotFocus(object sender, RoutedEventArgs e)
    {
        hasFocus = true;

    }

    private void myList_LostFocus(object sender, RoutedEventArgs e)
    {
        hasFocus = false;
    }
Run Code Online (Sandbox Code Playgroud)

您还需要为您的 ListView 订阅 xaml 中的焦点事件:

<ListView .... GotFocus="myList_GotFocus" LostFocus="myList_LostFocus"/>
Run Code Online (Sandbox Code Playgroud)