2014-10-21 63 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具有依賴屬性,用於設置要觸發操作的延遲。