public Task actualizar(bool animar = false) { var tcs = new TaskCompletionSource <object>(); var task = tcs.Task; task.GetAwaiter().OnCompleted(() => { actualizando = false; this.SetValue(Panel.ZIndexProperty, DependencyProperty.UnsetValue); }); if (existeNodoPocision || actualizando) { tcs.SetResult(null); } else { actualizando = true; Panel.SetZIndex(this, -1); var parent = (Canvas)Parent; if (parent != null) { if (animar) { var pocision = new Point(Canvas.GetLeft(this), Canvas.GetTop(this)); if (double.IsNaN(pocision.X)) { pocision.X = 0; } if (double.IsNaN(pocision.Y)) { pocision.Y = 0; } var transformar = parent.TransformToVisual(paginaPadre); pocision = transformar.Transform(pocision); parent.Children.Remove(this); paginaPadre.Children.Add(this); Canvas.SetLeft(this, pocision.X); Canvas.SetTop(this, pocision.Y); var animacionArriba = Animaciones.slideAnimacionF(distanciaArriba); var animacionIzquierda = Animaciones.slideAnimacionF(distanciaIzquierda); animacionArriba.FillBehavior = animacionIzquierda.FillBehavior = FillBehavior.Stop; animacionArriba.Completed += (s, e) => { Canvas.SetTop(this, distanciaArriba); tcs.SetResult(null); }; animacionIzquierda.Completed += (s, e) => { Canvas.SetLeft(this, distanciaIzquierda); }; BeginAnimation(Canvas.LeftProperty, animacionIzquierda); BeginAnimation(Canvas.TopProperty, animacionArriba); } else { Canvas.SetLeft(this, distanciaIzquierda); Canvas.SetTop(this, distanciaArriba); tcs.SetResult(null); } } else { PaginaPadre.Children.Add(this); Canvas.SetLeft(this, distanciaIzquierda); Canvas.SetTop(this, distanciaArriba); if (animar) { Task.Delay(Animaciones.slideDuracion.TimeSpan) .GetAwaiter() .OnCompleted(() => tcs.SetResult(null)); } else { tcs.SetResult(null); } } } return(task); }
public Task reajustarPocision(bool animar = false) { var tcs = new TaskCompletionSource <object>(); if (existeNodoPocision) { tcs.SetResult(null); return(tcs.Task); } Canvas p = (Canvas)Parent; if (hijos.Count() > 0) { if (!animar) { Canvas.SetTop(this, distanciaArriba); Canvas.SetLeft(this, distanciaIzquierda); var tarea = new List <Task>(); foreach (var c in hijos) { if (c.pagina != null) { tarea.Add(c.pagina.reajustarPocision()); } } Task.WhenAll(tarea).GetAwaiter().OnCompleted(() => tcs.SetResult(null)); } else { var tarea = new List <Task>(); foreach (var c in hijos) { if (c.pagina != null) { tarea.Add(c.pagina.reajustarPocision(true)); } } var animacionArriba = Animaciones.slideAnimacionF(distanciaArriba); var animacionIzquierda = Animaciones.slideAnimacionF(distanciaIzquierda); if (double.IsNaN(Canvas.GetTop(this))) { animacionArriba.From = distanciaArriba; } if (double.IsNaN(Canvas.GetLeft(this))) { animacionIzquierda.From = distanciaIzquierda; } animacionArriba.FillBehavior = FillBehavior.Stop; animacionIzquierda.FillBehavior = FillBehavior.Stop; animacionArriba.Completed += (s, a) => { tcs.SetResult(null); Canvas.SetTop(this, distanciaArriba); }; animacionIzquierda.Completed += (s, a) => Canvas.SetLeft(this, distanciaIzquierda); BeginAnimation(Canvas.TopProperty, animacionArriba); BeginAnimation(Canvas.LeftProperty, animacionIzquierda); } } else { tcs.SetResult(null); } return(tcs.Task); }