WPF样式:如何在触发器中更改GradientStop颜色

8

我有一个按钮样式:

<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <Grid>
          <Path x:Name="path1" ... Data="...some data...">
            <Path.Fill>
              <LinearGradientBrush EndPoint="0.5,-0.3" StartPoint="0.5,0.8">
                <GradientStop x:Name="gs1" Color="Green" Offset="0.44"/>
                <GradientStop Color="Black" Offset="0.727"/>
              </LinearGradientBrush>
            </Path.Fill>
          </Path>                            
        <ContentPresenter ...properties...   />
      </Grid>

     <ControlTemplate.Triggers>
       <Trigger Property="IsMouseOver" Value="True">
         <Setter TargetName="???" Property="Color" Value="Green"></Setter>
       </Trigger>
     </ControlTemplate.Triggers>
   </ControlTemplate>
 </Setter.Value>

当鼠标悬停在按钮上时,我想改变x:Name="gs1"的GradientStop颜色,所以我使用了触发器IsMouseOver。但是如何在触发器中访问Color属性呢?我尝试了TargetName="gs1"和TargetName="path1.gs1",但都不起作用。有什么想法吗?

2个回答

9

试试这个:

<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
        <Style.Resources>
            <LinearGradientBrush x:Key="gs1" EndPoint="0.5,-0.3" StartPoint="0.5,0.8">
                <GradientStop Color="Green" Offset="0.44"/>
                <GradientStop Color="Black" Offset="0.727"/>
            </LinearGradientBrush>
            <LinearGradientBrush x:Key="gs2" EndPoint="0.5,-0.3" StartPoint="0.5,0.8">
                <GradientStop Color="White" Offset="0.44"/>
                <GradientStop Color="Black" Offset="0.727"/>
            </LinearGradientBrush>
        </Style.Resources>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid>
                        <Path x:Name="path1" ........... Fill="{StaticResource gs1}">
                        </Path>
                        <ContentPresenter  .........../>
                    </Grid>

                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="path1" Property="Fill" Value="{StaticResource gs2}"></Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>

        </Setter>
    </Style>

这将对您有所帮助。您还可以使用DataBinding,通过在代码中声明一个Color DependencyProperty,将其与GradientStop的Color属性绑定,并在需要时更新它。


2

我认为你需要更换整个画笔。这里有一个很好的例子,可以对按钮进行样式设置:点击这里

<ControlTemplate.Triggers>
   <Trigger Property="IsMouseOver" Value="True">
      <Setter Property="Fill" TargetName="path1">
         <Setter.Value>
            <LinearGradientBrush EndPoint="0.5,-0.3" StartPoint="0.5,0.8">
               <GradientStop Color="Black" Offset="0.44"/>
               <GradientStop Color="Green" Offset="0.727"/>
            </LinearGradientBrush>
         </Setter.Value>
       </Setter>
    </Trigger>
</ControlTemplate.Triggers>

还有一种在XAML中索引GradientStops的方法,但我无法让示例正常工作...类似于<Setter Property="Fill.GradientStops[0].Color" Value="Green" />,如http://books.google.com/books?id=XWu70Oqz6RIC&lpg=PA38&ots=FMR-4o3veZ&dq=pro%20wpf%202008%20with%20c%23%20gradientstops&pg=PA770#v=onepage&q=gradientstops&f=false所述。 - sourcenouveau
你可以用代码实现,没问题。我相信你也可以用动画来实现,但我从未见过在XAML中工作的任何索引器。 - Muad'Dib
2
我已经成功地使用它来执行<Border><Border.Style><Style TargetType="{x:Type Border}"><Style.Triggers><DataTrigger Binding="{Binding Path=SomeProperty}" Value="True"><Setter Property="BorderBrush"><DataTrigger.EnterActions><BeginStoryboard x:Name="SomeNmae"><Storyboard><DoubleAnimation Storyboard.TargetProperty="BorderBrush.GradientStops[0].Offset" /> - sourcenouveau

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