如何默认启用ListView选中项的键盘焦点边框?
解决WinUI/UWP ListView默认显示键盘焦点边框的问题
要让ListView的选中项默认显示键盘导航时的白色边框,且无需修改ItemTemplate里的Border属性,可以用以下两种方法:
方法一:通过代码给选中项设置键盘焦点
这是最直接的方式,利用系统默认的键盘焦点视觉样式,只需要在选中项变化或列表加载时,给对应的ListViewItem设置键盘焦点。
步骤:
- 在XAML中给ListView添加
SelectionChanged和Loaded事件:
<ListView x:Name="TargetListView" SelectionChanged="TargetListView_SelectionChanged" Loaded="TargetListView_Loaded"> <!-- 你的ItemTemplate和数据源 --> </ListView>
- 在后台C#代码中实现事件逻辑:
// 列表加载完成时,默认选中第一项并设置键盘焦点 private void TargetListView_Loaded(object sender, RoutedEventArgs e) { if (TargetListView.Items.Count <= 0) return; TargetListView.SelectedIndex = 0; var firstItem = TargetListView.ContainerFromIndex(0) as ListViewItem; firstItem?.Focus(FocusState.Keyboard); } // 选中项变化时,给新选中项设置键盘焦点 private void TargetListView_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (TargetListView.SelectedItem == null) return; var selectedItem = TargetListView.ContainerFromItem(TargetListView.SelectedItem) as ListViewItem; selectedItem?.Focus(FocusState.Keyboard); }
这样每次选中项切换时,都会触发系统的键盘焦点样式,显示白色边框,完全复用原生视觉效果,不需要自定义UI元素。
方法二:修改ListViewItem的默认样式(可选)
如果希望不依赖焦点状态,让边框始终显示,可以自定义ListViewItem的样式,调整焦点视觉的默认可见性。这种方式不需要代码逻辑,但需要修改控件模板:
<Page.Resources> <Style TargetType="ListViewItem" BasedOn="{StaticResource DefaultListViewItemStyle}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListViewItem"> <ListViewItemPresenter x:Name="RootPresenter" FocusVisualPrimaryBrush="{ThemeResource SystemControlFocusVisualPrimaryBrush}" FocusVisualSecondaryBrush="{ThemeResource SystemControlFocusVisualSecondaryBrush}" FocusVisualPrimaryThickness="2" FocusVisualSecondaryThickness="1"/> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="CommonStates"> <VisualState x:Name="Normal"> <Storyboard> <!-- 让Normal状态下焦点视觉也显示 --> <ObjectAnimationUsingKeyFrames Storyboard.TargetName="RootPresenter" Storyboard.TargetProperty="FocusVisualOpacity"> <DiscreteObjectKeyFrame KeyTime="0" Value="1"/> </ObjectAnimationUsingKeyFrames> </Storyboard> </VisualState> </VisualStateGroup> </VisualStateManager.VisualStateGroups> </ControlTemplate> </Setter.Value> </Setter> </Style> </Page.Resources>
这种方法会让所有ListViewItem默认显示焦点边框,不管是否选中或获得焦点,适合需要全局显示边框的场景。
内容的提问来源于stack exchange,提问作者Chibako
相关产品推荐
相关产品推荐

