none
Animação WPF RRS feed

  • Pergunta

  •  Olá estou usando Visual Stuido 2010, estou querendo fazer umas animações em WPF C#, mas não consigo implementar a minha regra.

     Vou tentar explicar a minha necesside:

     Vou usar uma framework de RFID que me gera um evento, mas vou simular esse evento no evento click de um botão.

     Cada vez que o evento é chamado deve instanciar um TextBlock, então adiciono no Grid.

     Porém quando a lista "Children" do grid for maior que 5(por exemplo) eu quero pegar um objeto TextBlock instanciado, criar um evento nele e depois remove-lo (o primeiro a entrar, deve ser o primeiro a sair).

    Problema no código a baixo:

    a função "AnimacaoExcluirTextBlock" não executa enquanto não sair do evento button_Click

    não sei como criar a regra primeiro a entrar é o primeiro a sair na lista de "Children" do Grid

    preciso que mesmo ainda não tenha terminado de executar a animação e exluido o TextBlock eu consiga add outro TextBlock , a animação é só para dar um efeito para apagar o TextBlock, e preciso ir apagando para não encher demais a janela.

     Queria saber quais maneiras que poderia executar isso?

    <Window x:Class="WpfAnimation.MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="MainWindow" Height="700" Width="1000">
     <Grid Name="grid1">
      <Button Content="Button" Height="23" HorizontalAlignment="Left" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
     </Grid>
    </Window>
    
     public partial class MainWindow : Window
     {
      TextBlock textBlock1;
    
      Storyboard textBlkStoryboard;
      Random random;
    
      public MainWindow()
      {
       InitializeComponent();
    
       random = new Random();
      }
    
      private void button1_Click(object sender, RoutedEventArgs e)
      {
       if (this.grid1.Children.Count > 5)
       {
        AnimacaoExcluirTextBlock();
    
        this.grid1.Children.RemoveAt(1);
       }
    
       textBlock1 = new TextBlock();
    
       textBlock1.Background = Brushes.AntiqueWhite;
       textBlock1.TextAlignment = TextAlignment.Center;
       textBlock1.HorizontalAlignment = HorizontalAlignment.Center;
       textBlock1.VerticalAlignment = VerticalAlignment.Center;
    
       textBlock1.Text = "Textos";
    
       this.grid1.Children.Add(textBlock1);
    
       //Se move
       //***************************************************************
       NameScope.SetNameScope(this, new NameScope());
    
       this.RegisterName(
        "myAnimatedBorder", textBlock1);
    
       ThicknessAnimation myThicknessAnimation = new ThicknessAnimation();
       myThicknessAnimation.Duration = TimeSpan.FromSeconds(3);
       myThicknessAnimation.FillBehavior = FillBehavior.HoldEnd;
    
       myThicknessAnimation.From = new Thickness(1, 1, 0, 0);
       myThicknessAnimation.To = new Thickness(random.Next(1000), random.Next(700), 0, 0);
    
       Storyboard.SetTargetName(myThicknessAnimation, "myAnimatedBorder");
       Storyboard.SetTargetProperty(
        myThicknessAnimation, new PropertyPath(TextBlock.MarginProperty));
    
       textBlkStoryboard = new Storyboard();
       textBlkStoryboard.Children.Add(myThicknessAnimation);
       textBlkStoryboard.Begin(this);
      }
    
      private void AnimacaoExcluirTextBlock()
      {
       DoubleAnimation da = new DoubleAnimation();
       da.From = 0;
       da.To = 1440;
       da.Duration = new Duration(TimeSpan.FromSeconds(5));
       RotateTransform rt = new RotateTransform();
       this.grid1.Children[1].RenderTransform = rt;
       this.grid1.Children[1].RenderTransformOrigin = new Point(0.5, 0.5);
       rt.BeginAnimation(RotateTransform.AngleProperty, da);
    
       DoubleAnimation myDoubleAnimation = new DoubleAnimation();
       myDoubleAnimation.To = 0;
       myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));
       myDoubleAnimation.AutoReverse = false;
    
       this.grid1.Children[1].BeginAnimation(TextBlock.FontSizeProperty, myDoubleAnimation);
      }
     }

     Obrigado.

     


    terça-feira, 23 de agosto de 2011 21:26

Respostas

  • Bom consegui resolver, mas não sei se é a melhor maneira. Primeiro criei um Timer que executa a cada 3s, dentro do evento Tick tenho uma Thead que chama this.Dispatcher.BeginInvoke e dentro da função delegada eu chamo a animação. Para usar o evento Completed do StoreyBoard da animação, deve-se setar a propriedade Duration da StoryBoard, então dentro do evento eu removi o objeto da lista de Children do Window. Se alguém tiver idéias estou aberto a sugestões. Tenho pouca experiência na área então talvez não consiga me expressar bem, mas dúvidas é só entrar em contato. Até mais.
    quinta-feira, 25 de agosto de 2011 20:31

Todas as Respostas

  • Juliano,

    Não consegui entender a questão... Para fazer a remoção do último controle adicionado no Grid, não é só fazer um RemoveAt passando Children.Count - 1?


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    quarta-feira, 24 de agosto de 2011 00:12
    Moderador
  •  Então mas não funcionou muito bem, ele removeu antes de executar a animação. Isso que não consigo, chamar a animação e depois remover, sem impedir de adicionar mais TextBlock. Conseguiu enteder + ou -? Sou iniciante em programação ai talvez não consiga explicar direito.

     Vlw.


    quarta-feira, 24 de agosto de 2011 01:12
  • Bom consegui resolver, mas não sei se é a melhor maneira. Primeiro criei um Timer que executa a cada 3s, dentro do evento Tick tenho uma Thead que chama this.Dispatcher.BeginInvoke e dentro da função delegada eu chamo a animação. Para usar o evento Completed do StoreyBoard da animação, deve-se setar a propriedade Duration da StoryBoard, então dentro do evento eu removi o objeto da lista de Children do Window. Se alguém tiver idéias estou aberto a sugestões. Tenho pouca experiência na área então talvez não consiga me expressar bem, mas dúvidas é só entrar em contato. Até mais.
    quinta-feira, 25 de agosto de 2011 20:31