ListView 内容上的样式正在应用于 ListView 本身
Posted
技术标签:
【中文标题】ListView 内容上的样式正在应用于 ListView 本身【英文标题】:Style on ListView Contents is getting applied to the ListView itself 【发布时间】:2021-12-22 11:04:40 【问题描述】:我在 WPF/XAML 中遇到了一个奇怪的行为。我的意图是使用Border
s、ListView
和Border
s 的样式创建类似的东西:
我认为代码应该是这样的:
<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>
但该代码实际上产生了这个:
这让我玩了一会儿,我发现了一些非常奇怪的东西。 Border
s 样式中的 Width
和 Height
值正在应用于 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
的值时,我的期望是它适用于 Border
s,然后他们忽略它,因为他们设置了自己的高度。换句话说,它应该没有效果。但是当我更改Height
时,ListView
的高度会发生变化。
为了让事情变得更奇怪,Background
值正确地应用于Border
s。我对这段代码的工作方式有误解吗?我发现了一个错误吗?做我想做的事情的正确方法是什么?
我正在使用 Visual Studio 2022、.NET 6、C# 10。
【问题讨论】:
【参考方案1】:我想通了。 ListView
在内部使用 Border
作为其背景。样式将应用于此 Border
,以及作为 ListView
中的项目的 Border
s。
解决方案是使用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 本身的主要内容,如果未能解决你的问题,请参考以下文章
通过list-style-image属性指定自己的图片作为列表项样式