2014-10-21 7 views
5

Ich versuche, eine Animation eines benutzerdefinierten Steuerelements basierend auf einem Bindungswert zu verzögern. Im folgenden Beispiel möchte ich, dass die Animation 5 Sekunden nach dem Auswählen des visuellen Status "SelectedAndHit" beginnt. Es scheint jedoch nicht möglich, Vorlagenbindung innerhalb von VisualStateManage zu verwenden.Wird Databinding oder TemplateBinding im VisualStateManager unterstützt?

Wird TemplateBinding im VisualStateManager unterstützt? Gibt es eine Problemumgehung?

<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> 

Antwort

2

Ich bestätige, dass WinRT Binding/TemplateBinding innerhalb eines Stils nicht unterstützt. Zur Umgehung des Problems habe ich Code geschrieben, um die BeginTime des Storyboards manuell zu aktualisieren. So hatte ich die volle Kontrolle über das Storyboard.

-1

Ich würde Interactivity betrachten. Ich habe den EventTrigger mit GoToStateAction persönlich benutzt, was für meine Zwecke ausreichend war. Wenn Sie sich MSDN ansehen, können Sie möglicherweise TimerTrigger und GoToStateAction verwenden, um den gewünschten Effekt zu erzielen. TimerTrigger verfügt über Abhängigkeitseigenschaften zum Festlegen der Verzögerung für das Auslösen der Aktion.