Как перемещаться по элементам между несколькими GridViews в ListView с помощью контроллера Xbox?

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

Моя ситуация такова: ListView, который содержит много GridViews. Каждый GridView — это одна строка, определенная с помощью кода xaml. Так же, как на картинке ниже. введите здесь описание изображения

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

Если GridView2 прокрутил до Atem11, Atem12, Atem13, Atem14. А Фокус будет перевезен с Item1 of GridView1 на Atem11 in GridView2. введите здесь описание изображения

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


person Vincent    schedule 20.05.2019    source источник


Ответы (1)


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

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

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

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

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

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

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

[Обновлено 23 мая 2019 г.]

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

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

С вашим конкретным требованием вы можете попытаться отслеживать событие нажатия клавиши и проверить, нажата ли клавиша вниз геймпада в обработчике событий. См. ответ Ника Крамера [MSFT] на этот controller-and-keydown-event?forum=wpdevelop" rel="nofollow noreferrer">case.

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

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

person Xie Steven    schedule 21.05.2019
comment
Я не могу использовать фокус XY, потому что все GridViews (включена одна строка) генерируются динамически. Таким образом, фокус XY не может обрабатывать один элемент в GridView1 другому элементу в GridView2. - person Vincent; 22.05.2019
comment
@Vincent Итак, каково ожидаемое поведение одного элемента в GridView1 для другого элемента в GridView2? - person Xie Steven; 22.05.2019
comment
Предположим, что фокус находится на элементе 1 в GridView1, нажмите кнопку вниз, фокус переместится на элемент 1 в GridView2. По умолчанию при нажатии кнопки «вниз» фокус переходит на элемент 2 в GridVew1. - person Vincent; 22.05.2019
comment
Хорошо, я попытаюсь. - person Vincent; 23.05.2019
comment
Хорошо, я попытаюсь. - person Vincent; 23.05.2019