2014-10-21 64 views
5

我想延迟基于绑定值的自定义控件的动画。在下面的例子中,我想在选择“SelectedAndHit”视觉状态5秒后开始动画。但是,在VisualStateManage中使用模板绑定似乎是不可能的。VisualBasicManager内是否支持Databinding或TemplateBinding?

TemplateBinding是否支持VisualStateManager?有什么解决方法吗?

<local:ButtonEx x:Name="Button01" AnimationBeginTime="00:00:05" /> 

public TimeSpan AnimationBeginTime 
{ 
    get { return (TimeSpan)base.GetValue(ButtonEx.AnimationBeginTimeProperty); } 
    set { base.SetValue(ButtonEx.AnimationBeginTimeProperty, value); } 
} 

public static readonly DependencyProperty AnimationBeginTimeProperty = 
    DependencyProperty.Register("AnimationBeginTime", typeof(TimeSpan), typeof(ButtonEx), new PropertyMetadata(TimeSpan.Zero)); 

<Style TargetType="local:ButtonEx"> 
    <!-- ... --> 

    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="local:ButtonEx"> 
       <Grid x:Name="Container" RenderTransformOrigin="0.5, 0.5"> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 
          <VisualState x:Name="Normal" /> 
          <VisualState x:Name="SelectedAndHit"> 
           <Storyboard> 
            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border" 
                    Storyboard.TargetProperty="Background"> 
             <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonBackgroundColorSelectedAndHit}" /> 
            </ObjectAnimationUsingKeyFrames> 

            <Storyboard> 
             <DoubleAnimation 
              Storyboard.TargetName="GridScaleTransform" 
              Storyboard.TargetProperty="(ScaleTransform.ScaleX)" 
              To="1.2" BeginTime="{TemplateBinding AnimationBeginTime}" Duration="00:00:00.300" AutoReverse="True"> 
              <DoubleAnimation.EasingFunction> 
               <ExponentialEase EasingMode="EaseIn" /> 
              </DoubleAnimation.EasingFunction> 
             </DoubleAnimation> 

             <DoubleAnimation 
              Storyboard.TargetName="GridScaleTransform" 
              Storyboard.TargetProperty="(ScaleTransform.ScaleY)" 
              To="1.2" BeginTime="{TemplateBinding AnimationBeginTime}" Duration="00:00:00.300" AutoReverse="True"> 
              <DoubleAnimation.EasingFunction> 
               <ExponentialEase EasingMode="EaseIn" /> 
              </DoubleAnimation.EasingFunction> 
             </DoubleAnimation> 
            </Storyboard> 
           </Storyboard> 
          </VisualState> 

         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 

        <Grid.RenderTransform> 
         <ScaleTransform x:Name="GridScaleTransform" /> 
        </Grid.RenderTransform> 

        <!-- ... --> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

回答

2

我确认WinRT不支持样式中的Binding/TemplateBinding。要解决此问题,我编写了代码以手动更新Storyboard的BeginTime。这样我就可以完全控制Storyboard开始的时间。

-1

我会看看Interactivity。我亲自使用了带有GoToStateAction的EventTrigger,这足以满足我的目的。从查看MSDN看来,您可能可以利用TimerTrigger和GoToStateAction来创建您要查找的效果。 TimerTrigger具有依赖属性,用于设置要触发操作的延迟。