触发属性以将故事板重新启动到第一个状态

时间:2014-02-13 09:17:03

标签: wpf xaml triggers storyboard wpf-animation

我有2个触发事件,包括<Trigger.EnterActions><Trigger.ExitActions>,这些事件是IsPressedIsMouseOver

当我点击一个按钮时,它将播放<Trigger Property="IsPressed" Value="True"> storyboard:

<Trigger Property="IsPressed" Value="True">
   <Trigger.EnterActions>
       <BeginStoryboard Storyboard="{StaticResource MouseDownTimeLine}"/>
   </Trigger.EnterActions>
   <Trigger.ExitActions>
        <BeginStoryboard Storyboard="{StaticResource MouseUpTimeLine}"/>
   </Trigger.ExitActions>
 </Trigger>

这与这个故事板有关:

<Storyboard x:Key="MouseDownTimeLine" >
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Pressed" Storyboard.TargetProperty="Opacity" >
        <SplineDoubleKeyFrame KeyTime="00:00:00.25" Value="1" />
     </DoubleAnimationUsingKeyFrames>
</Storyboard>

<Storyboard x:Key="MouseUpTimeLine">
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Pressed" Storyboard.TargetProperty="Opacity" >
        <SplineDoubleKeyFrame KeyTime="00:00:00.25" Value="1"/>
     </DoubleAnimationUsingKeyFrames>
</Storyboard>

另一个按钮也链接到同一个Storyboard。当单击第二个按钮时,我希望它像它一样播放故事板,但是然后第一个按钮返回到正常状态。这是故事板的这一部分。

<Storyboard x:Key="MouseExitTimeLine">
     <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Normal" Storyboard.TargetProperty="Opacity" >
          <SplineDoubleKeyFrame KeyTime="00:00:00.00" Value="1"/>
     </DoubleAnimationUsingKeyFrames>

      <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Hover" Storyboard.TargetProperty="Opacity" >
           <SplineDoubleKeyFrame KeyTime="00:00:00.00" Value="0"/>
       </DoubleAnimationUsingKeyFrames>
</Storyboard>

单击第二个按钮时,如何触发第一个按钮重置为正常

1 个答案:

答案 0 :(得分:1)

也许我在这里错了,但似乎你将单选按钮功能融入了按钮模板。当您单击按钮时,它会保持“单击”(或选中),当您单击另一个按钮时,它会从第一个按钮“释放”该单击。

我将模板的目标类型更改为RadioButton,并将触发器更改为:

<Trigger Property="IsChecked" Value="True">
   <Trigger.EnterActions>
       <BeginStoryboard x:Name="ButtonCheckedStoryboardBegin"
                        Storyboard="{StaticResource MouseDownTimeLine}"/>
   </Trigger.EnterActions>
   <Trigger.ExitActions>
       <StopStoryboard BeginStoryboardName="ButtonCheckedStoryboardBegin"/>
   </Trigger.ExitActions>
</Trigger>

使用StopStoryboard因为MouseExitTimeLine中的duratios为零。如果您确实需要退出动画的持续时间,请使用:

<Trigger Property="IsChecked" Value="True">
   <Trigger.EnterActions>
       <BeginStoryboard Storyboard="{StaticResource MouseDownTimeLine}"/>
   </Trigger.EnterActions>
   <Trigger.ExitActions>
       <BeginStoryboard Storyboard="{StaticResource MouseExitTimeLine}"/>
   </Trigger.ExitActions>
</Trigger>

[第二个选项可以按原样使用 - 持续时间为零,但不太优雅,IMO]

此外,MouseExitTimeLine中“Hover”的动画是多余的,可以删除,因为MouseDownTimeLine没有在“Hover”上设置任何内容。

现在,在布局中RadioButton的每个实例上添加GroupName="<Some string here>"。在任何给定的时间点,只能检查组中的一个单选按钮。