.net WPF按钮样式触发器
我被WPF中的样式卡住了。当用户将鼠标悬停在按钮上时,我需要更改背景渐变,但我不知道如何进行更改。这是我目前掌握的代码:.net WPF按钮样式触发器,.net,wpf,.net,Wpf,我被WPF中的样式卡住了。当用户将鼠标悬停在按钮上时,我需要更改背景渐变,但我不知道如何进行更改。这是我目前掌握的代码: <Style x:Key="Button_Green" TargetType="{x:Type Button}"> <Setter Property="FontSize" Value="11" /> <Setter Property="Foreground" Value="White"/> <Sette
<Style x:Key="Button_Green" TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="11" />
<Setter Property="Foreground" Value="White"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border CornerRadius="2" BorderBrush="#387f38" BorderThickness="1">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF5BB75B" Offset="0" />
<GradientStop Color="#FF449B44" Offset="1" />
</LinearGradientBrush>
</Border.Background>
<ContentPresenter x:Name="ButtonContentPresenter" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF5BB75B" Offset="0" />
<GradientStop Color="#FF398239" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Cursor" Value="Hand" />
</Trigger>
</Style.Triggers>
</Style>
鼠标光标会正确更改,但背景渐变不会更改。您需要将setter的目标设置为在
控制模板
中定义的边框
元素。目前,它的目标是按钮本身的后台
属性,该属性由自定义控制模板
隐藏
<Style x:Key="Button_Green" TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="11" />
<Setter Property="Foreground" Value="White"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="MyBackgroundElement" CornerRadius="2" BorderBrush="#387f38" BorderThickness="1">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF5BB75B" Offset="0" />
<GradientStop Color="#FF449B44" Offset="1" />
</LinearGradientBrush>
</Border.Background>
<ContentPresenter x:Name="ButtonContentPresenter" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="MyBackgroundElement" Property="Background">
<Setter.Value>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF5BB75B" Offset="0" />
<GradientStop Color="#FF398239" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Cursor" Value="Hand" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
在这里,我在Border
元素中添加了x:Name
属性,这样就可以使用Setter
上的TargetName
属性对其进行引用,从而从模板中更改此片段
<Border CornerRadius="2" BorderBrush="#387f38" BorderThickness="1">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF5BB75B" Offset="0" />
<GradientStop Color="#FF449B44" Offset="1" />
</LinearGradientBrush>
</Border.Background>
<ContentPresenter x:Name="ButtonContentPresenter" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
然后在样式中添加一个额外的setter,如下所示:
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF5BB75B" Offset="0" />
<GradientStop Color="#FF449B44" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
我得到了这个错误:“不能在样式设置器上设置TargetName属性。”另外,如果我将这个代码放在Application.xmal中(它在自己的资源字典中),我会得到这个错误:“属性'TargetName'不代表'Setter'的有效目标,因为找不到名为'MyBackgroundElement'的元素。确保目标在使用它的任何设置器、触发器或条件之前声明。“我认为您需要将样式触发器更改为模板触发器,作为ControlTemplate的一部分。我认为父样式不知道在子模板中创建的元素。当然,Trigger
s作用于ControlTemplate
中的元素需要在该模板的范围内定义。谢谢你,史蒂夫!
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF5BB75B" Offset="0" />
<GradientStop Color="#FF449B44" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>