我在xbox上运行uwp,但是在使用Dpad或Left Stick处理导航时遇到一些问题。
我的情况是这样的:
一个ListView
,其中包含许多GridViews
。每个GridView
是使用xaml代码定义的一行。就像下面的图片一样。
按向下/向上键时,将聚焦最近的项目。例如,如果当前焦点位于Item1 of GridView1
,则Atem1 in GridView2
被聚焦。
如果GridView2
已滚动到Atem11,Atem12,Atem13,Atem14。并且焦点将从Item1 of GridView1
传输到Atem11 in GridView2
。
那么,如何处理呢?
答案 0 :(得分:0)
在Xbox One上,通过使用XY导航系统移动焦点,默认情况下,在Xbox One上运行的UWP应用程序启用了鼠标模式。要禁用鼠标模式并启用XY焦点导航,请设置Application.RequiresPointerMode=WhenRequested
。
请检查XY focus navigation and interaction。
XY导航可能无法按照您期望的方式工作的三个常见原因:
IsTabStop或Visibility属性设置错误。
获得焦点的控件实际上比您想象的要大-XY导航着眼于控件的总大小(ActualWidth和ActualHeight),而不仅仅是控件中呈现有趣内容的部分。
< / li>一个可聚焦控件位于另一个控件之上-XY导航不支持重叠的控件。
如果在解决这些问题后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焦点,并设置SelectedIndex
或SelectedItem
来选择特定的项目。