WPF按钮样式触发器

3

我在WPF中遇到样式问题。当用户将鼠标悬停在按钮上时,我需要更改背景渐变色,但我不知道如何进行更改。目前,这是我的代码:

    <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>

鼠标光标正常变化,但背景渐变不会改变。
2个回答

4

您需要将 setter 的目标设置为在 ControlTemplate 中定义的 Border 元素。目前,它的目标是 Button 自身的 Background 属性,此属性被您自定义的 ControlTemplate 隐藏了。

<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>

在这里,我添加了一个x:Name属性到Border元素中,以便可以通过Setter上的TargetName属性来引用它。

我遇到了这个错误:“无法在样式Setter上设置TargetName属性。” - ecnepsnai
此外,如果我将这段代码放在Application.xmal中(它在自己的资源字典中),我会收到以下错误提示:“属性'TargetName'不代表'Setter'的有效目标,因为未找到名为'MyBackgroundElement'的元素。请确保在使用它的任何Setter、Trigger或Condition之前声明目标。” - ecnepsnai
1
我认为你需要将Style触发器更改为ControlTemplate的模板触发器。我不认为父级Style知道在子模板中创建的元素。 - Steve
当然,作用于 ControlTemplate 中元素的 Trigger 需要在该模板的范围内定义。感谢您的指导,史蒂夫! - Mattias Buelens

0

将此代码片段从模板中更改

<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>

到这里(重要的部分是Background="{TemplateBinding Background}"):
<Border CornerRadius="2" BorderBrush="#387f38" BorderThickness="1" Background="{TemplateBinding 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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接