wpf - ListboxItems 在鼠标悬停时使用数据模板更改颜色
问题描述
我有一个ListBox
看起来像:
<ListBox Grid.Row="1" Margin="25" ItemsSource="{x:Static constants:AppsToInstall.AllApps}" SelectionMode="Multiple" HorizontalAlignment="Center">
<ListBox.Resources>
<DataTemplate DataType="{x:Type models:InstallItem}">
<Grid x:Name="Grid">
<Border x:Name="PART_BORDER" HorizontalAlignment="Stretch">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
<CheckBox IsChecked="{Binding CanInstall}"></CheckBox>
<TextBlock Margin="10 0 0 0" Text="{Binding DisplayName}"></TextBlock>
</StackPanel>
</Border>
</Grid>
<DataTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Grid" Property="Background" Value="{StaticResource AccentColorBrush}"></Setter>
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.Resources>
</ListBox>
我添加了一个数据模板,允许我绑定到传入的项目源。
ListBoxItem
尽管如此,当我将鼠标悬停在它上面时,我似乎无法让它改变整体的颜色。
请看下图:
解决方案
这确实是一个编辑ListBoxItem
. 这种类型是托管数据模板的容器,它还定义了鼠标悬停效果。
只需使用 Visual Studio 或 Blend提取默认控件模板。两者都将提取所需的样式和资源,您可以将其放入资源字典或控件Resources
中。
<SolidColorBrush x:Key="Item.MouseOver.Background" Color="#1F26A0DA"/>
<SolidColorBrush x:Key="Item.MouseOver.Border" Color="#a826A0Da"/>
<SolidColorBrush x:Key="Item.SelectedActive.Background" Color="#3D26A0DA"/>
<SolidColorBrush x:Key="Item.SelectedActive.Border" Color="#FF26A0DA"/>
<SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="#3DDADADA"/>
<SolidColorBrush x:Key="Item.SelectedInactive.Border" Color="#FFDADADA"/>
<Style x:Key="ListBoxItemStyle" TargetType="{x:Type ListBoxItem}">
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="Padding" Value="4,1"/>
<Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
<Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border x:Name="Bd" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.MouseOver.Background}"/>
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.MouseOver.Border}"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsSelectionActive" Value="False"/>
<Condition Property="IsSelected" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Background}"/>
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Border}"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsSelectionActive" Value="True"/>
<Condition Property="IsSelected" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Background}"/>
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Border}"/>
</MultiTrigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
你现在要做的就是用你的颜色替换SolidColorBrush
for 。Item.MouseOver.Background
然后,将此样式应用ListBoxItemStyle
为ItemContainerStyle
您的ListBox
.
<ListBox Grid.Row="1"
Margin="25"
ItemsSource="{x:Static constants:AppsToInstall.AllApps}" SelectionMode="Multiple"
HorizontalAlignment="Center"
ItemContainerStyle="{StaticResource ListBoxItemStyle}">
<!-- ...your XAML code. -->
</ListBox>
结果看起来像这样。
推荐阅读
- java - JDK-11 SSLHandshakeException:没有适当的协议(协议被禁用或密码套件不合适)
- vb.net - 我的水晶报告只能在开发者版上运行而不是运行时 64 位,为什么?
- javascript - 使所有实例方法成为箭头函数以避免丢失绑定有什么缺点吗?
- php - MySql 和 PHP 的年份格式不同
- algorithm - 一个非常简单的算法的算法时间优化
- fractals - 以某种详细程度对 Mandelbrot 边缘点进行排序
- c++ - 通过指向数据成员的指针访问类成员是否被视为成员访问表达式?
- haskell - Xmonad 布局跟进
- typescript - Cucumber JS - 是否可以在 setDefinitionFunctionWrapper 中以编程方式设置 defaultTimeout 值?
- r - 在 R 中的函数中生成或处理缺少的参数