如何为 Windows 10 个应用程序 (UWP) 强制关注 XAML ListView?
How to force focus on a XAML ListView for Windows 10 apps (UWP)?
我有一个枢轴控件,我正在使用 ItemSource 属性 为其传递数据。我还使用数据模板来填充数据透视项。
数据模板里面有一个listview。
<DataTemplate ..... >
<ListView ....></ListView>
</DataTemplate>
我正在尝试将键盘事件附加到页面中的 ListView。喜欢使用 Home 键滚动到顶部并使用 End 键滚动到底部。
由于 ListView 在 DataTemplate 中,我无法在编译时连接键盘事件。
克服这个问题的方法:
1) 在 Xaml 控件中使用 KeyDown 属性
Result: Too much delay for the event to trigger
2) 使用 VisualTree
Result: Traversing creates lot of overhead.
3) 使用 ListView 加载事件
Result: Called only once
目前采用的最佳解决方案:
1) 为 ListView 的 GotFocus 属性 附加键盘事件。
但我想在页面加载时强制关注 Listview。此外,当我更改数据透视项时,它应该会自动强制将焦点放在新的 ListView 上。
您可以共享 DataTemplate 中 ListView 的事件处理程序。然后使用事件的发送者获取触发事件的 ListView 实例。
然后您可以从该发件人处做您想做的事。例如,如果我共享 LoadedEvent,我会尝试这样的事情:
private void ListView_OnLoaded(object sender, RoutedEventArgs e)
{
var lv = sender as ListView;
if(lv != null)
lv.SelectedIndex = 0;
}
请注意,这可能无法按原样工作,因此请务必对其进行彻底测试,以确保它能满足您的需求。这是一种快速的方法。
如果您坚持严格的 MVVM 模式,另一种选择是使用 属性(依赖项或类似项)并对 ListView 的 SelectedIndex 使用 OneTime x:Bind。我没有测试过这种方法,但这个想法应该可行,因为您可以为所有 ListViews 绑定到相同的 属性。
我有一个枢轴控件,我正在使用 ItemSource 属性 为其传递数据。我还使用数据模板来填充数据透视项。
数据模板里面有一个listview。
<DataTemplate ..... >
<ListView ....></ListView>
</DataTemplate>
我正在尝试将键盘事件附加到页面中的 ListView。喜欢使用 Home 键滚动到顶部并使用 End 键滚动到底部。
由于 ListView 在 DataTemplate 中,我无法在编译时连接键盘事件。
克服这个问题的方法:
1) 在 Xaml 控件中使用 KeyDown 属性
Result: Too much delay for the event to trigger
2) 使用 VisualTree
Result: Traversing creates lot of overhead.
3) 使用 ListView 加载事件
Result: Called only once
目前采用的最佳解决方案:
1) 为 ListView 的 GotFocus 属性 附加键盘事件。
但我想在页面加载时强制关注 Listview。此外,当我更改数据透视项时,它应该会自动强制将焦点放在新的 ListView 上。
您可以共享 DataTemplate 中 ListView 的事件处理程序。然后使用事件的发送者获取触发事件的 ListView 实例。
然后您可以从该发件人处做您想做的事。例如,如果我共享 LoadedEvent,我会尝试这样的事情:
private void ListView_OnLoaded(object sender, RoutedEventArgs e)
{
var lv = sender as ListView;
if(lv != null)
lv.SelectedIndex = 0;
}
请注意,这可能无法按原样工作,因此请务必对其进行彻底测试,以确保它能满足您的需求。这是一种快速的方法。
如果您坚持严格的 MVVM 模式,另一种选择是使用 属性(依赖项或类似项)并对 ListView 的 SelectedIndex 使用 OneTime x:Bind。我没有测试过这种方法,但这个想法应该可行,因为您可以为所有 ListViews 绑定到相同的 属性。