2011-02-03 21 views
6

Sto tentando di animare la proprietà 'Style' utilizzando ObjectAnimationUsingKeyFrames. Quando eseguo l'esempio qui sotto, vedo solo la finestra vuota e non ci sono eccezioni.Animare la proprietà 'Style' di Control utilizzando ObjectAnimationUsingKeyFrames in WPF

Quasi lo stesso campione funziona in Silverlight. In WPF funziona anche se assegno direttamente la proprietà 'Style' del controllo. Qualcuno sa se è possibile animare la proprietà 'Stile' in WPF?

Molte grazie.

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:this="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="350" Width="525" 
    > 
<Window.Resources> 
    <ResourceDictionary> 

     <Style x:Key="TestStyle" TargetType="Control"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <Canvas x:Name="Rectangle"> 
          <Rectangle Width="200" Height="150" Fill="Red"/> 
         </Canvas> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ResourceDictionary> 
</Window.Resources> 
<Canvas> 
    <Canvas.Triggers> 
     <EventTrigger RoutedEvent="Canvas.Loaded"> 
      <BeginStoryboard> 
       <Storyboard> 
        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Target" Storyboard.TargetProperty="Style" > 
         <DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="{StaticResource ResourceKey=TestStyle}" /> 
        </ObjectAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Canvas.Triggers> 

    <Canvas.Children> 
     <ContentControl x:Name="Target"/> 
    </Canvas.Children> 
</Canvas> 

+0

provare DynamicResource anziché StaticResource. – Bijan

risposta

1

Quando ObjectAnimationUsingKeyFrames tenta di animare per un valore che è derivato da DependencyObject, si tenta di freeze l'oggetto. Se l'oggetto non può essere congelato, genera un'eccezione e l'animazione non viene eseguita.

Se si sta animando un valore di un tipo personalizzato che è stato scritto, sembra che sia necessario derivare da Freezable o NON derivare da DependencyObject.

Per le proprietà che già esistono che derivano dalla DependencyObject e non Freezable, non si possono animare (StyleProperty o TemplateProperty sono casi in punto). Provare a utilizzare un setter di proprietà all'interno di uno stile:

<Style.Triggers> 
    <Trigger Property="IsEnabled" Value="True"> 
    <Setter Property="Template" Value="{StaticResource TestTemplate}"/> 
    </Trigger> 
</Style.Triggers> 

Corporatura tutta la logica di transizione nello stile, invece di passare da stili diversi. Una sfida che si può avere con questo è che la proprietà di destinazione deve essere una proprietà di dipendenza quindi non è possibile utilizzare IsLoaded.

Spero che questo sia utile.

Un ultimo pensiero: è possibile definire custom animations, anche se non l'ho fatto io stesso. Esiste un'opportunità esterna di poter scrivere il tuo personalizzato "ObjectAnimation" che non sarebbe limitato alle classi Freezable o non- DependencyObject.

+0

Se si forniscono maggiori informazioni sul motivo per cui si desidera animare uno stile, potrei essere in grado di suggerire altre alternative. Sebbene possa sembrare bello animare a uno stile diverso, sono sicuro che ci sono altri modi per ottenere l'effetto desiderato. –