Как перемещаться между несколькими GridViews в ListView с помощью контроллера Xbox? - PullRequest
0 голосов
/ 20 мая 2019

Я запускаю uwp на xbox, но у меня есть некоторые проблемы при работе с навигацией с помощью Dpad или левой ручки.

Моя ситуация такова: A ListView, который содержит много GridViews.Каждый GridView является одной строкой, определенной с использованием кода xaml.Так же, как на картинке ниже.enter image description here

При нажатии клавиши Вниз / Вверх ближайший пункт будет сфокусирован.Например, если текущий фокус находится на Item1 of GridView1, тогда фокусируется Atem1 in GridView2.

Если GridView2 прокручивается до Atem11, Atem12, Atem13, Atem14.И Фокус будет перенесен с Item1 of GridView1 на Atem11 in GridView2.enter image description here

Итак, как с этим справиться?

1 Ответ

0 голосов
/ 21 мая 2019

На Xbox One фокус перемещается с помощью системы навигации XY, режим мыши включен по умолчанию для приложений UWP, работающих на Xbox One.Чтобы отключить режим мыши и включить навигацию по XY-фокусу, установите Application.RequiresPointerMode=WhenRequested.

Пожалуйста, проверьте Навигация по XY-фокусу и взаимодействие .

Существует три распространенных причины, по которым навигация по XYможет работать не так, как вы ожидаете:

  1. Неправильно установлено свойство IsTabStop или Visibility.

  2. Фактически элемент управления получает фокусбольше, чем вы думаете - XY-навигация смотрит на общий размер элемента управления (ActualWidth и ActualHeight), а не только на часть элемента управления, которая представляет что-то интересное.

  3. Один фокусируемый элемент управления включенповерх другого - XY-навигация не поддерживает элементы управления, которые перекрываются.

Если XY-навигация все еще не работает так, как вы ожидаете после исправления этих проблем, вы можете вручную указать на элементчто вы хотите получить фокус, используя метод, описанный в Переопределение навигации по умолчанию .

[Обновлено в 2019/5/23]

Я не могу использовать фокус XY, потому что все GridView (одна строка включена) генерируются динамически.Таким образом, фокус XY не может обрабатывать один элемент в GridView1 к другому элементу в GridView2.

Предположим, что фокус находится на элементе 1 в GridView1, нажмите кнопку «вниз», фокус переместится на элемент 1 в GridView2.По умолчанию при нажатии кнопки «вниз» фокус переходит к пункту 2 в GridVew1.

По вашему конкретному требованию вы можете попытаться отследить событие нажатия клавиши и проверить, нажата ли клавиша геймпада вобработчик события.См. Ответ Ника Крамера [MSFT] по этому делу .

Здесь происходит две вещи.Во-первых, вы никогда не получите ключ XAML KeyDown с e.Key == GamepadA / B / left / right / up / down - все они переведены в ближайший эквивалент клавиатуры.Вместо этого вы можете использовать свойство e.OriginalKey, чтобы получить клавишу геймпада до того, как она будет переведена в эквивалент клавиатуры.

После этого вам нужно проверить, является ли текущий сфокусированный элемент управления GridView1.Вы можете использовать FocusManager.GetFocusedElement метод.Если текущим сфокусированным элементом управления является GridView1, то вы можете использовать метод FocusManager.TryFocusAsync , чтобы сфокусировать GridView2, и установить SelectedIndex или SelectedItem, чтобы сделать выбранный конкретный элемент.

...