如何使用Xbox控制器在ListView中的几个GridView之间导航项目?

时间:2019-05-20 10:30:26

标签: xaml uwp uwp-xaml xbox xbox-one

我在xbox上运行uwp,但是在使用Dpad或Left Stick处理导航时遇到一些问题。

我的情况是这样的: 一个ListView,其中包含许多GridViews。每个GridView是使用xaml代码定义的一行。就像下面的图片一样。 enter image description here

按向下/向上键时,将聚焦最近的项目。例如,如果当前焦点位于Item1 of GridView1,则Atem1 in GridView2被聚焦。

如果GridView2已滚动到Atem11,Atem12,Atem13,Atem14。并且焦点将从Item1 of GridView1传输到Atem11 in GridView2enter image description here

那么,如何处理呢?

1 个答案:

答案 0 :(得分:0)

在Xbox One上,通过使用XY导航系统移动焦点,默认情况下,在Xbox One上运行的UWP应用程序启用了鼠标模式。要禁用鼠标模式并启用XY焦点导航,请设置Application.RequiresPointerMode=WhenRequested

请检查XY focus navigation and interaction

XY导航可能无法按照您期望的方式工作的三个常见原因:

  
      
  1. IsTabStop或Visibility属性设置错误。

  2.   
  3. 获得焦点的控件实际上比您想象的要大-XY导航着眼于控件的总大小(ActualWidth和ActualHeight),而不仅仅是控件中呈现有趣内容的部分。

    < / li>   
  4. 一个可聚焦控件位于另一个控件之上-XY导航不支持重叠的控件。

  5.   
     

如果在解决这些问题后XY导航仍无法按预期方式工作,则可以使用Overriding the default navigation中所述的方法手动指向要获得焦点的元素。

[于2019/5/23更新]

  

我不能使用XY焦点,因为所有GridView(启用了一行)都是动态生成的。因此,XY焦点无法处理从GridView1中的一个项目到GridView2中的另一个项目。

     

假设焦点位于GridView1中的项目1,按下按钮,焦点移至GridView2中的项目1。默认情况下,当按下向下按钮时,焦点将移至GridVew1中的项目2。

根据您的特定要求,您可以尝试监视keydown事件并检查事件处理程序中是否按下了游戏手柄下键。请参阅Nick Kramer [MSFT]对case的答复。

  

这里发生了两件事。首先,您永远不会获得带有e.Key == GamepadA / B / left / right / up / down的XAML KeyDown,它们都被翻译成与其最接近的等效键盘。而是可以使用e.OriginalKey属性获取游戏手柄键,然后再将其转换为等效的键盘。

在那之后,您需要检查当前的焦点控件是否为GridView1。您可以使用FocusManager.GetFocusedElement方法。如果当前的焦点控件是GridView1,则可以使用FocusManager.TryFocusAsync方法使GridView2焦点,并设置SelectedIndexSelectedItem来选择特定的项目。