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
相关产品推荐
相关产品推荐

