示例#1
0
        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);
        }
示例#2
0
        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);
        }