[WINRT] AppBar autoocultable

Continuando un poco con la estela del post anterior en el que hablaba de los Behaviors, en este vamos a ver como agregar una funcionalidad que puede ser bastante interesante en nuestras aplicaciones para Windows Store.

Lo que vamos a abordar, es como auto ocultar la barra de aplicación, según el tiempo deseado. Para resolver esta problematica vamos a agregar dos Dependency Properties a los controles de tipo AppBar:

– La primera una propiedad de tipo Booleana que será la encargada de indicar si se aplica el auto cierre o no. Dentro del establecimiento de esta propiedad vamos a agregar los manejadores de eventos para cuando se abrá la AppBar y cuando entre y salga el cursor dentro de ella (para parar el contador si el cursor está dentro de la AppBar)

– La segunda una propiedad de tipo Integer que servirá para expresar en segundos cuando se va a llevar a cabo el cierre de la AppBar. El valor por defecto de esta propiedad va a ser 5.

Al lio:

   1: public class AppBarExtensions

   2:     {

   3:         public static AppBar appBar;

   4:  

   5:         public static readonly DependencyProperty AutoCloseTimeProperty = DependencyProperty.RegisterAttached("AutoCloseTime", typeof(int), typeof(AppBarExtensions),

   6:             new PropertyMetadata(5));

   7:  

   8:         public static int GetAutoCloseTime(UIElement element)

   9:         {

  10:             return (int)element.GetValue(AutoCloseTimeProperty);

  11:         }

  12:  

  13:         public static void SetAutoCloseTime(UIElement element, int value)

  14:         {

  15:             element.SetValue(AutoCloseTimeProperty, value);

  16:         }

  17:  

  18:         public static readonly DependencyProperty AutoCloseProperty = DependencyProperty.RegisterAttached("AutoClose", typeof(bool), typeof(AppBarExtensions),

  19:        new PropertyMetadata(DependencyProperty.UnsetValue,

  20:        (o, e) =>

  21:        {

  22:            var control = o as AppBar;

  23:  

  24:            appBar = control;

  25:            if (control != null)

  26:            {

  27:                if ((bool)e.NewValue)

  28:                {

  29:                    control.Opened += AppBarOpened;

  30:                    control.PointerEntered += control_PointerEntered;

  31:                    control.PointerExited += control_PointerExited;

  32:                }

  33:                else

  34:                {

  35:                    control.Opened -= AppBarOpened;

  36:                    control.PointerEntered -= control_PointerEntered;

  37:                    control.PointerExited -= control_PointerExited;

  38:                }

  39:            }

  40:        }));

  41:  

  42:         static void control_PointerExited(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)

  43:         {

  44:             timer.Tick += timer_Tick;

  45:             timer.Start();

  46:             Elapsed = 1;

  47:         }

  48:  

  49:         static void control_PointerEntered(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)

  50:         {

  51:             timer.Stop();

  52:             timer.Tick -= timer_Tick;

  53:             Elapsed = 1;

  54:         }

  55:  

  56:         private static DispatcherTimer timer;

  57:  

  58:         private static int Elapsed = 1;

  59:  

  60:         static void AppBarOpened(object sender, object e)

  61:         {

  62:             timer = new DispatcherTimer();

  63:             timer.Interval = TimeSpan.FromSeconds(1);

  64:             timer.Tick += timer_Tick;

  65:             timer.Start();

  66:         }

  67:  

  68:         static void timer_Tick(object sender, object e)

  69:         {

  70:             if (Elapsed == GetAutoCloseTime((UIElement)appBar))

  71:             {

  72:                

  73:                 Elapsed = 1;

  74:                 appBar.IsOpen = false;

  75:                 timer.Stop();

  76:             }

  77:             else

  78:                 Elapsed++;

  79:         }

  80:         public static bool GetAutoClose(UIElement element)

  81:         {

  82:             return (bool)element.GetValue(AutoCloseProperty);

  83:         }

  84:         public static void SetAutoClose(UIElement element, bool value)

  85:         {

  86:             element.SetValue(AutoCloseProperty, value);

  87:         }

  88:     }

Del mismo modo que en el ejemplo del post anterior, vamos a ver como usarlo dentro de nuestro código:

 

   1: xmlns:appbar="using:AppBarExtensions"

De esa manera podremos empezar a utilizarlo en nuestra AppBar:

   1: <AppBar x:Name="appbar" appbar:AppBarExtensions.AutoClose="True" appbar:AppBarExtensions.AutoCloseTime="3" />

Espero que os resulte de utilidad.

 

Saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *