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

Posted

技术标签:

【中文标题】WPF 样式:如何更改触发器中的 GradientStop 颜色【英文标题】:WPF Style: how to change GradientStop Color in Trigger 【发布时间】:2011-01-30 01:50:59 【问题描述】:

我有一个按钮样式:

<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 的颜色,所以我使用 Trigger IsMouseOver。如何访问触发器中的颜色属性?我试过 TargetName="gs1" 和 TargetName="path1.gs1" 但它不起作用。有什么想法吗?

【问题讨论】:

【参考方案1】:

我认为您将不得不更换整个刷子。 Here is a good example 的按钮样式。

<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 进行索引,但我无法找到一个可以工作的示例......类似于 ,如books.google.com/… 所述 你可以在代码中做到这一点,NP,我很确定你可以用动画做到这一点,但我从未见过任何索引器在 xaml 中工作 我已经用它成功做了 【参考方案2】:

试试这个:

<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 属性绑定并随时更新。

【讨论】:

以上是关于WPF 样式:如何更改触发器中的 GradientStop 颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WPF 按钮的参数或绑定来更改 XAML 样式中的 fa 图标

通过 WPF 样式或触发器设置 TaskbarItemInfo

你能在数据绑定的 WPF 样式中做“数学”吗

如果样式已经设置,如何覆盖 WPF 子控件样式?

如何在不覆盖现有样式的情况下向 WPF 自定义控件添加触发器?

WPF: WPF 中的 Triggers 和 VisualStateManager