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

WinUI 3中如何禁用ListViewItem激活时的侧边高亮效果

WinUI 3 ListView 禁用侧边选中高亮且保持布局对齐

你遇到的侧边高亮是ListViewItem默认的SelectionIndicator(选中指示器),直接修改BorderBrush会破坏布局,是因为默认ListViewItem的Border和Padding参数是与这个指示器配合设计的。正确的做法是针对性隐藏该指示器,同时保留原有布局参数:

方法一:直接隐藏选中指示器(推荐)

通过ItemContainerStyle设置SelectionIndicatorVisibility为Collapsed,同时保留默认的BorderThickness和Padding,避免布局错乱:

<ListView>
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="x:String">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{x:Bind}" Grid.Column="0"/>
                <Button Grid.Column="1" Content="Button 1"/>
                <Button Grid.Column="2" Content="Button 2"/>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <!-- 隐藏选中时的侧边指示器 -->
            <Setter Property="SelectionIndicatorVisibility" Value="Collapsed"/>
            <!-- 保留默认布局参数,防止按钮对齐错乱 -->
            <Setter Property="BorderThickness" Value="0,0,0,1"/>
            <Setter Property="Padding" Value="12,0,12,0"/>
        </Style>
    </ListView.ItemContainerStyle>
    <x:String>Hello!</x:String>
    <x:String>Hello!</x:String>
    <x:String>Hello!</x:String>
</ListView>

方法二:自定义ControlTemplate彻底移除指示器

如果方法一不生效(部分WinUI版本兼容问题),可以通过重写ListViewItem的ControlTemplate,明确关闭选中指示器:

<ListView>
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="x:String">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{x:Bind}" Grid.Column="0"/>
                <Button Grid.Column="1" Content="Button 1"/>
                <Button Grid.Column="2" Content="Button 2"/>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListViewItem">
                        <ListViewItemPresenter
                            ContentTransitions="{TemplateBinding ContentTransitions}"
                            SelectionCheckMarkVisualEnabled="False"
                            PointerOverBackground="{ThemeResource ListViewItemPointerOverBackground}"
                            SelectedBackground="{ThemeResource ListViewItemSelectedBackground}"
                            SelectedPointerOverBackground="{ThemeResource ListViewItemSelectedPointerOverBackground}"
                            PressedBackground="{ThemeResource ListViewItemPressedBackground}"
                            SelectedPressedBackground="{ThemeResource ListViewItemSelectedPressedBackground}"
                            DisabledOpacity="{ThemeResource ListViewItemDisabledThemeOpacity}"
                            HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                            VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
                            ContentMargin="{TemplateBinding Padding}"
                            CheckBrush="{ThemeResource ListViewItemCheckBrush}"
                            CheckBoxBrush="{ThemeResource ListViewItemCheckBoxBrush}"
                            DragForeground="{ThemeResource ListViewItemDragForeground}"
                            DragOpacity="{ThemeResource ListViewItemDragThemeOpacity}"
                            DragBackground="{ThemeResource ListViewItemDragBackground}"
                            ReorderHintOffset="{ThemeResource ListViewItemReorderHintThemeOffset}"
                            HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
                            VerticalAlignment="{TemplateBinding VerticalAlignment}"
                            Margin="{TemplateBinding Margin}"
                            CornerRadius="{TemplateBinding CornerRadius}"
                            <!-- 关键:隐藏侧边选中指示器 -->
                            SelectionIndicatorVisibility="Collapsed"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListView.ItemContainerStyle>
    <x:String>Hello!</x:String>
    <x:String>Hello!</x:String>
    <x:String>Hello!</x:String>
</ListView>

核心逻辑:不要通过修改BorderBrush来隐藏高亮,而是直接关闭专门的侧边选中指示器组件,同时保留ListViewItem原有的布局参数,这样就能在禁用高亮的同时保证按钮对齐正常。

内容的提问来源于stack exchange,提问作者Lime

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:53:17