ListBox
常用于导航
自定义ItemContainerStyle
在使用ListBox的时候,发现鼠标移入到item上,会有一个很宽的背景,想把它去除,我们自己定义鼠标移入的状态,可以通过 ItemContainerStyle
来定义模板,以下实现一个理论考试的题目选择样式,有如下需求:
- 题目有 未做、已做、正确、错误,四种状态,不同的状态显示不同的背景
- 鼠标移入有状态变化(因为这里有四种状态,采用鼠标移入的时候,先死一个透明度40的遮罩,或者显示一个边框,否则要基于4种颜色来设计4种不同的over 色)
- 注意:不能将
ItemContainerStyle
样式设定为:ItemContainerStyle="{x:Null}"
,会引起其他异常。
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Padding" Value="0"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Template" >
<Setter.Value>
<ControlTemplate >
<Border x:Name="_border" Style="{StaticResource subnum_border}">
<Grid>
<TextBlock Text="{Binding SubNum}" Style="{StaticResource subnum_text}"/>
<Border x:Name="_mask" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Visibility="Collapsed"
Opacity="0.4" Background="#FFF7E9C2"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<!--未做-->
<DataTrigger Binding="{Binding OperateState}" Value="0">
<Setter TargetName="_border" Property="Background" Value="#FFB9B9B9"/>
</DataTrigger>
<!--已做-->
<DataTrigger Binding="{Binding OperateState}" Value="1">
<Setter TargetName="_border" Property="Background" Value="#FF428DD2"/>
</DataTrigger>
<!--正确-->
<DataTrigger Binding="{Binding OperateState}" Value="2">
<Setter TargetName="_border" Property="Background" Value="Green"/>
</DataTrigger>
<!--错误-->
<DataTrigger Binding="{Binding OperateState}" Value="3">
<Setter TargetName="_border" Property="Background" Value="#FFAD1E1E"/>
</DataTrigger>
<!-- 鼠标悬停时,改变背景色 -->
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="_mask" Property="Visibility" Value="Visible" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<!-- 当鼠标移入时重置背景色为透明 -->
<Setter Property="Background" Value="Transparent"/>
<!-- 其他的属性重置 -->
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
设置ItemContainerStyle 为null(出现问题)
这种方式,我们可以单独定义我们的item 模板,如果不自定义模板,还需要,重置 ListItem的风格
<!-- 自定义 ListBoxItem 的控件模板 去除自带的模板样式-->
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ListBox ItemsSource="{Binding YourItems}"
ItemTemplateSelector="{StaticResource MyTemplateSelector}"
ItemContainerStyle="{x:Null}" />