You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何默认启用ListView选中项的键盘焦点边框?

解决WinUI/UWP ListView默认显示键盘焦点边框的问题

要让ListView的选中项默认显示键盘导航时的白色边框,且无需修改ItemTemplate里的Border属性,可以用以下两种方法:

方法一:通过代码给选中项设置键盘焦点

这是最直接的方式,利用系统默认的键盘焦点视觉样式,只需要在选中项变化或列表加载时,给对应的ListViewItem设置键盘焦点。

步骤:

  1. 在XAML中给ListView添加SelectionChanged和Loaded事件:
<ListView x:Name="TargetListView" 
          SelectionChanged="TargetListView_SelectionChanged"
          Loaded="TargetListView_Loaded">
    <!-- 你的ItemTemplate和数据源 -->
</ListView>
  1. 在后台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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:57:22