2010-09-14 4 views
2

Je suis nouveau sur WPF. Je crée une animation pour un résultat de test en ligne. Où j'aime montrer Non de la question assistée, Non de la réponse correcte comme animation. J'ai besoin de créer un petit délai entre AttendedQuestionEffect() et RightAnswerEffect();Besoin de créer un délai entre deux effets dans Wpf

code CodeBehind ici

 public int TotalNoQuestion { get; set; } 
     public int NoOfQuestionAttended { get; set; } 
     public int NoOfRightAnswer { get; set; } 

    public Window1() 
    { 
     InitializeComponent(); 

     TotalNoQuestion = 100; 
     NoOfQuestionAttended = 18; 
     NoOfRightAnswer = 10; 

     stkpnl.Background = CreateLinearGradientBrush(); 

     Storyboard strBrd = new Storyboard(); 
     strBrd.Completed += new EventHandler(strBrd_Completed); 
     DoubleAnimation myDoubleAnimation = new DoubleAnimation(); 
     myDoubleAnimation.From = 10; 
     myDoubleAnimation.To = (TotalNoQuestion *15); 
     myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(2)); 
     Storyboard.SetTargetName(myDoubleAnimation, stkpnl.Name); 
     Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(StackPanel.HeightProperty)); 
     strBrd.Children.Add(myDoubleAnimation); 
     strBrd.Begin(stkpnl); 

    }  

    void strBrd_Completed(object sender, EventArgs e) 
    { 

     for (int i = 1; i < TotalNoQuestion; i++) 
     { 
      Border brd = new Border(); 
      brd.BorderBrush = Brushes.Black; 
      brd.BorderThickness = new Thickness(1.0); 
      TextBlock txt = new TextBlock(); 
      txt.Text = i.ToString(); 
      txt.Height = 15; 
      txt.Width = 200; 
      brd.Child = txt; 
      txt.FontSize = 12; 
      txt.Foreground = Brushes.Black; 
      stkpnl.Children.Add(brd); 
      txt.Background = CreateLinearGradientBrush(); 
      txt.Tag = i.ToString(); 
     } 

     AttendedQuestionEffect(); 
     // Here i need to create delay. 
     RightAnswerEffect(); 
    } 
    void AttendedQuestionEffect() 
    { 
     int index = 1; 
     UIElementCollection ulCollection = stkpnl.Children; 
     foreach (UIElement uiElement in ulCollection) 
     { 
      if (index <= NoOfQuestionAttended) 
      { 
       Border brd = (Border)uiElement; 
       TextBlock txt = (TextBlock)brd.Child; 
       txt.Background = BlinkEffect(Colors.Blue, Colors.SteelBlue, 3000); 
       brd.Child = txt; 
      } 
      index++; 
     } 

    } 

    void RightAnswerEffect() 
    { 
     int index = 1; 
     UIElementCollection ulCollection = stkpnl.Children; 
     foreach (UIElement uiElement in ulCollection) 
     { 
      if (index <= NoOfRightAnswer) 
      { 
       Border brd = (Border)uiElement; 
       TextBlock txt = (TextBlock)brd.Child; 
       txt.Background = BlinkEffect(Colors.Red, Colors.Blue, 1500); 
       brd.Child = txt; 
      } 
      index++; 
     } 

    } 

    private LinearGradientBrush CreateLinearGradientBrush() 
    { 
     LinearGradientBrush brush = new LinearGradientBrush(); 
     brush.StartPoint = new Point(0, 0); 
     brush.EndPoint = new Point(1, 1); 
     brush.GradientStops.Add(new GradientStop(Colors.LightCoral, 0.1)); 
     brush.GradientStops.Add(new GradientStop(Colors.YellowGreen, 0.35)); 
     brush.GradientStops.Add(new GradientStop(Colors.Yellow, 0.86)); 
     return brush; 
    } 

    private SolidColorBrush BlinkEffect(Color startColor, Color endColor,int time) 
    { 
     ColorAnimation myColorAnimation = new ColorAnimation(); 
     myColorAnimation.From = startColor; 
     myColorAnimation.To = endColor; 
     myColorAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(time)); 
     myColorAnimation.AutoReverse = true; 
     myColorAnimation.RepeatBehavior = RepeatBehavior.Forever; 
     SolidColorBrush myBrush = new SolidColorBrush(); 
     myBrush.BeginAnimation(SolidColorBrush.ColorProperty, myColorAnimation); 
     return myBrush; 
    } 







**Xaml code here..** 

<Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="10"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <Border BorderBrush="Black" Grid.Column="1" BorderThickness="1" Width="200" VerticalAlignment="Bottom" HorizontalAlignment="Left"> 
     <StackPanel x:Name="stkpnl" Grid.Column="1" VerticalAlignment="Bottom" HorizontalAlignment="Left" Background="BlueViolet" Width="200" MaxHeight="450" > 
     </StackPanel> 
      </Border> 
    </Grid> 

`

Répondre

6

Votre devrait rechercher des animations de story-board en utilisant par exemple KeyFrames here.

En XAML cela pourrait ressembler à ce qui suit ... il vous suffit de traduire le code et l'adapter à vos needes:

<Storyboard> 
    <DoubleAnimationUsingKeyFrames BeginTime="0:0:0" Storyboard.TargetProperty="Opacity"> 
     <SplineDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/> 
    </DoubleAnimationUsingKeyFrames> 
    <ObjectAnimationUsingKeyFrames BeginTime="0:0:0.5" Storyboard.TargetProperty="Visibility"> 
     <DiscreteObjectKeyFrame KeyTime="0:0:0.5" Value="{x:Static Visibility.Collapsed}"/> 
    </ObjectAnimationUsingKeyFrames> 
</Storyboard> 

Cet échantillon tfirst disparaît un contrôle, puis le cache. Vous pouvez ajouter un délai en modifiant l'attribut BeginTime.

Questions connexes