ListView 内容上的样式正在应用于 ListView 本身

Posted

技术标签:

【中文标题】ListView 内容上的样式正在应用于 ListView 本身【英文标题】:Style on ListView Contents is getting applied to the ListView itself 【发布时间】:2021-12-22 11:04:40 【问题描述】:

我在 WPF/XAML 中遇到了一个奇怪的行为。我的意图是使用Borders、ListViewBorders 的样式创建类似的东西:

我认为代码应该是这样的:

<ListView HorizontalAlignment="Right" Margin="20">
     <ListView.Resources>
        <Style TargetType="Border">
           <Setter Property="Height" Value="20"/>
           <Setter Property="Width" Value="150"/>
           <Setter Property="Background" Value="Blue"/>
        </Style>
     </ListView.Resources>
     <Border/>
     <Border/>
  </ListView>

但该代码实际上产生了这个:

这让我玩了一会儿,我发现了一些非常奇怪的东西。 Borders 样式中的 WidthHeight 值正在应用于 ListView 本身!

例如这段代码:

 <ListView HorizontalAlignment="Right" Margin="20">
     <ListView.Resources>
        <Style TargetType="Border">
           <Setter Property="Height" Value="100"/>//this should do nothing because the borders set their own height
           <Setter Property="Background" Value="Blue"/>
        </Style>
     </ListView.Resources>
     <Border Height="20" Width="150"/>
     <Border Height="20" Width="150"/>
  </ListView>

产生这个:

ListView的高度为100像素)

当我在 Style 的值中更改 Height 的值时,我的期望是它适用于 Borders,然后他们忽略它,因为他们设置了自己的高度。换句话说,它应该没有效果。但是当我更改Height 时,ListView 的高度会发生变化。

为了让事情变得更奇怪,Background 值正确地应用于Borders。我对这段代码的工作方式有误解吗?我发现了一个错误吗?做我想做的事情的正确方法是什么?

我正在使用 Visual Studio 2022、.NET 6、C# 10。

【问题讨论】:

【参考方案1】:

我想通了。 ListView 在内部使用 Border 作为其背景。样式将应用于此 Border,以及作为 ListView 中的项目的 Borders。

解决方案是使用Border 以外的类型,或者制作一个包装Border 的用户控件。 Grid 工作正常:

<ListView HorizontalAlignment="Right" Margin="20">
     <ListView.Resources>
        <Style TargetType="Grid">
           <Setter Property="Height" Value="20"/>
           <Setter Property="Width" Value="150"/>
           <Setter Property="Background" Value="Blue"/>
        </Style>
     </ListView.Resources>
     <Grid/>
     <Grid/>
  </ListView>

产生这个:

【讨论】:

以上是关于ListView 内容上的样式正在应用于 ListView 本身的主要内容,如果未能解决你的问题,请参考以下文章

将悬停样式应用于任何孩子但不是父母

ListView WPF上的页脚

通过list-style-image属性指定自己的图片作为列表项样式

Android ListView 风格类似于 iPhone Grouped UITableView

listview添加长度不固定分割线

如何将样式应用于 Angular 中的自定义组件内容?