Usuário com melhor resposta
Animação WPF

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.
- Editado Juliano C. Pestili quarta-feira, 24 de agosto de 2011 01:22
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.
- Marcado como Resposta Juliano C. Pestili 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 -
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.
-
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.
- Marcado como Resposta Juliano C. Pestili quinta-feira, 25 de agosto de 2011 20:31