WPF 将触发器应用于列表视图项以更改背景
WPF apply triggers to listview items to change background
我正在尝试创建一种用于在桌面应用程序内导航的左侧菜单。我的想法是使用 Buttons 作为 Listview 项目,它应该以这种方式运行:当我将鼠标悬停在它们上面时,背景应该改变颜色(变成 darkCyan),当我点击其中一个时,它的背景颜色应该持续改变(变成 darkCyan)直到我点击在列表的另一个按钮上。问题是我正在使用 DataTemplate 属性 来指定按钮的外观,并且我正在尝试应用触发器来更改 ListView 的 ControlTemplate 上的背景颜色。结果是有时背景颜色会改变,但与按钮相关的命令在其他时候不会触发。我认为我在树视图的错误元素中做这些事情,但我对树视图的了解不够,所以我不明白我做错了什么。这是 XAML 的代码,我在其中定义了按钮和 ListView
的样式
<Window.Resources>
<DataTemplate DataType="{x:Type viewModels:TripViewModel}">
<views:TripView />
</DataTemplate>
<Style TargetType="{x:Type Button}">
<Setter Property="Height"
Value="50" />
<Setter Property="Background"
Value="#555D6F" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border>
<Grid Background="Transparent">
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<Border BorderBrush="Transparent"
BorderThickness="0"
Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<Setter Property="Background"
Value="DarkCyan" />
</Trigger>
<Trigger Property="IsSelected"
Value="True">
<Setter Property="Background"
Value="DarkCyan" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
这是我创建 ListView 的代码
<ListView Name="MenuButtons"
ItemsSource="{Binding PageViewModels}"
Background="Transparent"
IsSynchronizedWithCurrentItem="True">
<ListView.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Name}"
Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
Margin="0" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
有人可以帮忙吗?
谢谢
我已经通过使用 ListBox 而不是 ListView 并按以下方式将 ItemContainer 设置为按钮解决了这个问题
<ListBox.ItemTemplate>
<ItemContainerTemplate>
<Button Content="{Binding Name}"
Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
Margin="0" />
</ItemContainerTemplate>
</ListBox.ItemTemplate>
我正在尝试创建一种用于在桌面应用程序内导航的左侧菜单。我的想法是使用 Buttons 作为 Listview 项目,它应该以这种方式运行:当我将鼠标悬停在它们上面时,背景应该改变颜色(变成 darkCyan),当我点击其中一个时,它的背景颜色应该持续改变(变成 darkCyan)直到我点击在列表的另一个按钮上。问题是我正在使用 DataTemplate 属性 来指定按钮的外观,并且我正在尝试应用触发器来更改 ListView 的 ControlTemplate 上的背景颜色。结果是有时背景颜色会改变,但与按钮相关的命令在其他时候不会触发。我认为我在树视图的错误元素中做这些事情,但我对树视图的了解不够,所以我不明白我做错了什么。这是 XAML 的代码,我在其中定义了按钮和 ListView
的样式<Window.Resources>
<DataTemplate DataType="{x:Type viewModels:TripViewModel}">
<views:TripView />
</DataTemplate>
<Style TargetType="{x:Type Button}">
<Setter Property="Height"
Value="50" />
<Setter Property="Background"
Value="#555D6F" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border>
<Grid Background="Transparent">
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<Border BorderBrush="Transparent"
BorderThickness="0"
Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<Setter Property="Background"
Value="DarkCyan" />
</Trigger>
<Trigger Property="IsSelected"
Value="True">
<Setter Property="Background"
Value="DarkCyan" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
这是我创建 ListView 的代码
<ListView Name="MenuButtons"
ItemsSource="{Binding PageViewModels}"
Background="Transparent"
IsSynchronizedWithCurrentItem="True">
<ListView.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Name}"
Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
Margin="0" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
有人可以帮忙吗? 谢谢
我已经通过使用 ListBox 而不是 ListView 并按以下方式将 ItemContainer 设置为按钮解决了这个问题
<ListBox.ItemTemplate>
<ItemContainerTemplate>
<Button Content="{Binding Name}"
Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
Margin="0" />
</ItemContainerTemplate>
</ListBox.ItemTemplate>