为什么我的 Style.trigger 事件不适用于我的 WPF Datagrid?
Why is my Style.trigger event not working for my WPF Datagrid?
我在 WPF 中有一个 DataGrid,并在设置器中为它创建了一个 ControlTemplate。在创建此 ControlTemplate 之前,我的 Style.trigger 完美地处理了 IsMouseOver 事件。但是在放置 Controltemplate 之后它不再工作了。这是我的代码:
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="#292F3B"/>
<Setter Property="Foreground" Value="LightBlue"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Height" Value="30"/>
<Setter Property="FontSize" Value="15"/>
<Setter Property="BorderThickness" Value="0,0,2,0" />
<Setter Property="BorderBrush" Value="#333333"/>
<Setter Property="Padding" Value="10 0 0 0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Border Background="#242A36">
<Border BorderThickness="1"
CornerRadius="6"
Background="#2D2D30"
Padding="10,0,0,0"
Margin="2">
<ContentPresenter/>
</Border>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
所以我只希望 IsMouseOver 效果与 ControlTemplate 一起工作。
现在将您的 <Style.Triggers>
作为 <ControlTemplate.Triggers>
移动到 ControlTemplate 中,您应该会看到它再次更改背景。但是您必须使用 Target
属性来识别背景的目标,因为 WPF 不够智能,无法知道您在谈论哪个背景。
举个例子:
<Window.Resources>
<Style x:Key="mystyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="#292F3B"/>
<Setter Property="Foreground" Value="LightBlue"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Height" Value="30"/>
<Setter Property="FontSize" Value="15"/>
<Setter Property="BorderThickness" Value="0,0,2,0" />
<Setter Property="BorderBrush" Value="#333333"/>
<Setter Property="Padding" Value="10 0 0 0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Border x:Name="border" Background="#242A36">
<Border BorderThickness="1"
CornerRadius="6"
Background="#2D2D30"
Padding="10,0,0,0"
Margin="2">
<ContentPresenter/>
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<DataGrid CanUserAddRows="True" ItemsSource="{Binding Stuff}">
<DataGrid.Columns>
<DataGridTextColumn HeaderStyle="{StaticResource mystyle}" Header="Name"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
这是将鼠标悬停在 header 上时的样子。
注意:我不知道你到底想改变什么颜色,所以我只选择了你定义的外边框
我在 WPF 中有一个 DataGrid,并在设置器中为它创建了一个 ControlTemplate。在创建此 ControlTemplate 之前,我的 Style.trigger 完美地处理了 IsMouseOver 事件。但是在放置 Controltemplate 之后它不再工作了。这是我的代码:
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="#292F3B"/>
<Setter Property="Foreground" Value="LightBlue"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Height" Value="30"/>
<Setter Property="FontSize" Value="15"/>
<Setter Property="BorderThickness" Value="0,0,2,0" />
<Setter Property="BorderBrush" Value="#333333"/>
<Setter Property="Padding" Value="10 0 0 0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Border Background="#242A36">
<Border BorderThickness="1"
CornerRadius="6"
Background="#2D2D30"
Padding="10,0,0,0"
Margin="2">
<ContentPresenter/>
</Border>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
所以我只希望 IsMouseOver 效果与 ControlTemplate 一起工作。
现在将您的 <Style.Triggers>
作为 <ControlTemplate.Triggers>
移动到 ControlTemplate 中,您应该会看到它再次更改背景。但是您必须使用 Target
属性来识别背景的目标,因为 WPF 不够智能,无法知道您在谈论哪个背景。
举个例子:
<Window.Resources>
<Style x:Key="mystyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="#292F3B"/>
<Setter Property="Foreground" Value="LightBlue"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Height" Value="30"/>
<Setter Property="FontSize" Value="15"/>
<Setter Property="BorderThickness" Value="0,0,2,0" />
<Setter Property="BorderBrush" Value="#333333"/>
<Setter Property="Padding" Value="10 0 0 0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Border x:Name="border" Background="#242A36">
<Border BorderThickness="1"
CornerRadius="6"
Background="#2D2D30"
Padding="10,0,0,0"
Margin="2">
<ContentPresenter/>
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<DataGrid CanUserAddRows="True" ItemsSource="{Binding Stuff}">
<DataGrid.Columns>
<DataGridTextColumn HeaderStyle="{StaticResource mystyle}" Header="Name"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
这是将鼠标悬停在 header 上时的样子。
注意:我不知道你到底想改变什么颜色,所以我只选择了你定义的外边框