2013-04-09 11 views
17

Il seguente codice funziona correttamente.Creazione di Storyboard nel codice sottostante in WPF

<Window.Triggers> 
    <EventTrigger RoutedEvent="Window.Loaded"> 
     <BeginStoryboard> 
      <Storyboard> 
       <DoubleAnimation Duration="0:0:.8" Storyboard.TargetProperty="Left" From="1920" To="0" AccelerationRatio=".1"/> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
</Window.Triggers> 

ma in questo From e To valori sono statica. Devo passare la risoluzione del sistema basata su valori dinamici. Quindi ho bisogno che venga creato nel codice. È possibile farlo ?

Come convertirlo in codebehind?

+1

Sì, è possibile creare un oggetto Storyboard nel codice e applicare le stesse proprietà di XAML. Tutto può essere riempito in modo dinamico in base all'input che ottieni. – Terry

+0

Hai provato a cercare, ci sono un sacco di esempi su internet (esempio: http://www.codeproject.com/Articles/23257/Beginner-s-WPF-Animation-Tutorial) – Terry

+0

sì lo stesso esempio che ho passato. trie this Storyboard sb = new Storyboard(); DoubleAnimation da_AngleAnimation = new DoubleAnimation(); Durata durata = nuova Durata (TimeSpan.FromSeconds (1)); da_AngleAnimation.Duration = durata; da_AngleAnimation.From = 1920; da_AngleAnimation.To = 100; sb.Duration = durata; sb.BeginAnimation (Window.LeftProperty, da_AngleAnimation); Non funziona. ho sbagliato da qualche parte? – Raj

risposta

34

Quando si lavora nel codice, non è necessario Storyboard in realtà, solo animazioni per le cose di base, come si mostra nella domanda. Ho fatto un piccolo esempio per mostrare quanto sia facile.

Questo è il codice completo dietro la MainWindow:

namespace WpfCSharpSandbox 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      WidenObject(150, TimeSpan.FromSeconds(1)); 
     } 

     private void WidenObject(int newWidth, TimeSpan duration) 
     { 
      DoubleAnimation animation = new DoubleAnimation(newWidth, duration); 
      rctMovingObject.BeginAnimation(Rectangle.WidthProperty, animation); 
     } 
    } 
} 

Questo è come il XAML assomiglia:

<Window x:Class="WpfCSharpSandbox.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Sandbox" Height="350" Width="525"> 
    <Grid Background="#333333"> 
     <Rectangle x:Name="rctMovingObject" Fill="LimeGreen" Width="50" Height="50"/> 
    </Grid> 
</Window> 

mettere questo in un'applicazione WPF e vedere come funziona, sperimentare e prova altre animazioni/proprietà.

+1

Ho provato questo invece del rettangolo Animazione DoubleAnimation = new DoubleAnimation (1920, 100, duration); page.BeginAnimation (Window.LeftProperty, animation); Funziona perfettamente secondo il mio requisito – Raj

+0

Immagino solo che l'animazione che hai agganciato allo storyboard non sia stata invocata correttamente, ma mettendo questa finestra sulla finestra funziona. – Terry

+0

Voglio interrompere l'animazione manualmente, quindi è necessario lo storyboard :( –

3

Aggiunta di codice di esempio il commento di djerry sarebbe simile a questa:

var anim = new DoubleAnimation { 
           From = 1920, 
           To = 1, 
           }; 

wnd.BeginAnimation(Window.LeftProperty, anim); 

e si dovrebbe avere questo codice nella finestra di caricamento gestore di eventi. Spero che questo ti aiuti.