Etiqueta: xaml

  • Ejemplo sencillo de notificaciones (toast) para Windows Store

     

    Pues eso… que aunque aún no son horas de toastar nada, pero te voy a poner un par de ejemplos (o uno solo) de cómo mostrar las notificaciones del sistema (toast notifications), que no son otra cosa que los mensajes (o notificaciones) que aparecen en los laterales de la parte superior de la pantalla de Windows (ver la figura 1).

     

    toast01
    Figura 1.

     

    En principio este tipo de notificaciones están pensadas para eso, notificar al usuario de algo en un momento concreto (ahora te explico esto), pero sobre todo, que el usuario se entere de que eso está ocurriendo (lo están avisando), así que… este tipo de notificaciones se mostrarán siempre encima de lo que haya en ese momento en la pantalla… y cuando digo pantalla me refiero a la pantalla tanto de inicio de Windows 8 como a la "pantalla del escritorio".

     

    Lo del par de ejemplos que te comentaba antes es porque hay dos formas de notificar (o mostrar las notificaciones). Una es de forma inmediata, es decir: ¡ya!. La otra es para que se muestre en el momento que indiquemos, ya sean unos segundos después o más tiempo… no sé exactamente cuanto tiempo, pero incluso días y meses después. La tercera (sí, ya se que te dije que había dos, pero…) es una especie de variación de la segunda, ya que también se puede indicar la periodicidad de dicha notificación (si se repite, etc.)

    Es decir, que hay muchas posibilidades de usar las notificaciones del sistema (o toast notifications), así que, si además de lo que te explique aquí quieres saber más: Introducción a las notificaciones del sistema (Toast notification overview)

     

    Lo primero que debes saber es que esto es para usarlo en las aplicaciones de Windows Store y que en el manifiesto de la aplicación tienes que indicar que quieres usar este tipo de notificaciones.

    Abre el fichero Package.appxmanifest y en la primera ficha (Application UI) en la lista de las imágenes busca Badge Logo y selecciónala, en la parte de la derecha tendrás las opciones de notificaciones (notifications) en la lista Toast capable selecciona Yes tal como puedes ver en la figura 2.
    De no hacerlo, las notificaciones simplemente ¡¡¡ NO APARECERÁN !!!

     

    toast03
    Figura 2

     

    Una vez que tenemos esto, vamos a ver el código (en principio de Visual Basic, ya también el de C# o lo pongo más tarde o te pongo un enlace a Pastebin para cuando esté listo), de todas formas, los que usáis C# no os podéis quejar mucho, ya que la mayoría de los ejemplos de la documentación y otros sitios web están en C#, algo que no es tan habitual para los que prefieren usar Visual Basic, en fin…

     

    Los pasos a seguir:

    Crea un proyecto para la tienda de Windows (yo he creado el m´s básico).

    Abre el fichero del manifiesto de la aplicación (Package.appxmanifest) y selecciona Yes en Toast capable (ver figura 2).

    En MainPage.xaml vamos a crear una barra de aplicación (AppBar) con tres botones.
    El diseño de esos botones los tomaremos del fichero StandardStyles.xaml (en la carpeta Common), pero como quiero cambiarles el texto para que me lo muestre en castellano, los he copiado y pegado en los recursos de la página (cambiándoles el nombre para que no haya conflictos, aunque en esta caso no los habría ya que los botones del fichero StandarStyles suelen estar comentados, al menos en la plantilla de las aplicaciones básicas.

    Esos tres botones usarán distintos tipos de notificaciones, con idea de que sepas manejarte con varias de las posibilidades que tiene esto de los "toast notifications".

    El primer botón envía una notificación inmediata usando un periodo largo, es decir, la notificación tardará más de lo habitual en quitarse, también está desactivado el audio (es una notificación silenciosa y de larga duración, jeje).

    Al pulsar en el segundo botón mostrará una notificación a los 3 segundos y esta si que será con sonido y de duración normal.

    El tercer botón se notificará de forma inmediata y otra más a los 10 segundos, ambas serán de larga duración y con sonido.

     

    Aquí tienes una captura en pleno funcionamiento:

     

    toast05
    Figura 3. La aplicación en funcionamiento

     

    Este es el código XAML completo, con la definición de los estilos de los tres botones.

     

    <Page
        x:Class="Toast_notifications.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Toast_notifications"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Page.Resources>
            <Style x:Key="PlayEsAppBarButtonStyle" TargetType="ButtonBase" 
                   BasedOn="{StaticResource AppBarButtonStyle}">
                <Setter Property="AutomationProperties.AutomationId" Value="PlayAppBarButton"/>
                <Setter Property="AutomationProperties.Name" Value="Inmediato"/>
                <Setter Property="Content" Value="&#xE102;"/>
            </Style>
    
            <Style x:Key="HelpEsAppBarButtonStyle" TargetType="ButtonBase" 
                   BasedOn="{StaticResource AppBarButtonStyle}">
                <Setter Property="AutomationProperties.AutomationId" Value="HelpAppBarButton"/>
                <Setter Property="AutomationProperties.Name" Value="Ayuda"/>
                <Setter Property="Content" Value="&#xE11B;"/>
            </Style>
            <Style x:Key="ClockEsAppBarButtonStyle" TargetType="ButtonBase" 
                   BasedOn="{StaticResource AppBarButtonStyle}">
                <Setter Property="AutomationProperties.AutomationId" Value="ClockAppBarButton"/>
                <Setter Property="AutomationProperties.Name" Value="Programado"/>
                <Setter Property="Content" Value="&#xE121;"/>
            </Style>
        </Page.Resources>
        
        <Page.BottomAppBar>
            <AppBar x:Name="bottomAppBar1" Padding="10,0,10,0">
                <Grid>
                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                        <Button Style="{StaticResource PlayEsAppBarButtonStyle}" 
                                Click="ButtonPlay_Click" />
                        <Button Style="{StaticResource ClockEsAppBarButtonStyle}" 
                                Click="ButtonClock_Click" />
                    </StackPanel>
                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
                        <Button Style="{StaticResource HelpEsAppBarButtonStyle}" 
                                Click="ButtonHelp_Click" />
                    </StackPanel>
                    
                </Grid>
            </AppBar>
        </Page.BottomAppBar>
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <Grid.RowDefinitions>
                <RowDefinition Height="80" />
                <RowDefinition />
            </Grid.RowDefinitions>
    
            <!-- El título de la página -->
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="120"/>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <TextBlock x:Name="pageTitle" Grid.Column="1" Text="Prueba de toast notifications" 
                           IsHitTestVisible="false" 
                           Style="{StaticResource PageHeaderTextStyle}" />
                <Image x:Name="imgLogo" Grid.Column="2" Margin="10" 
                       Source="///Assets/SmallLogo.png" Stretch="Uniform" />
            </Grid>
    
        </Grid>
    </Page>
    
    

     

    Y este es el código de los tres botones Visual Basic:

    Primero te pongo las dos importaciones que hay que añadir:

     

    Imports Windows.UI.Notifications
    Imports Windows.Data.Xml.Dom
    

     

    Y este es el código de los tres botones, las explicaciones están en los comentarios.

     

    Private Sub ButtonPlay_Click(sender As Object, e As RoutedEventArgs)
    
        ' La plantilla a usar, esta Text03 es:
        ' un texto de cabecera que puede ocupar dos líneas y una línea de texto normal
        Dim toastTemplate As ToastTemplateType = ToastTemplateType.ToastText03
        ' Asignamos el template a un documento Xml
        Dim toastXml As XmlDocument = ToastNotificationManager.GetTemplateContent(toastTemplate)
    
        ' El texto para el primero elemento de la pantilla
        Dim toastTextElements As XmlNodeList = toastXml.GetElementsByTagName("text")
        toastTextElements(0).AppendChild(toastXml.CreateTextNode("Cargando ..."))
    
        ' Si queremos que la duración sea larga
        ' Puede ser corta o larga, corta es la predeterminada
        Dim toastNode As IXmlNode = toastXml.SelectSingleNode("/toast")
        TryCast(toastNode, XmlElement).SetAttribute("duration", "long")
    
        ' Si queremos quitar el sonido
        ' (o indicar alguno en particular)
        ' tenemos que usar el elemento "audio"
        'Dim toastNode As IXmlNode = toastXml.SelectSingleNode("/toast")
        Dim audio As XmlElement = toastXml.CreateElement("audio")
        audio.SetAttribute("silent", "true")
        toastNode.AppendChild(audio)
    
    
        Dim toast As New ToastNotification(toastXml)
        ToastNotificationManager.CreateToastNotifier().Show(toast)
    End Sub
    
    Private Sub ButtonClock_Click(sender As Object, e As RoutedEventArgs)
    
        ' La plantilla a usar, esta Text03 es:
        ' un texto de cabecera que puede ocupar dos líneas y una línea de texto normal
        Dim toastTemplate As ToastTemplateType = ToastTemplateType.ToastText03
        ' Asignamos el template a un documento Xml
        Dim toastXml As XmlDocument = ToastNotificationManager.GetTemplateContent(toastTemplate)
    
        ' El texto para el primero elemento de la pantilla
        Dim toastTextElements As XmlNodeList = toastXml.GetElementsByTagName("text")
        toastTextElements(0).AppendChild(
            toastXml.CreateTextNode("A los 3 segundos después de haber pulsado en el botón."))
        toastTextElements(1).AppendChild(
            toastXml.CreateTextNode("Segundo texto."))
    
        ' Esto es para indicar que esta notificación se hará en el momento indicado
        Dim dueTime As DateTime = DateTime.Now.AddSeconds(3)
        Dim scheduledToast As New ScheduledToastNotification(toastXml, dueTime)
    
        ToastNotificationManager.CreateToastNotifier().AddToSchedule(scheduledToast)
    
    End Sub
    
    Private Sub ButtonHelp_Click(sender As Object, e As RoutedEventArgs)
        ' La plantilla a usar, esta Text02 es:
        ' un texto de cabecera y un texto normal que puede ocupar dos líneas
        Dim toastTemplate As ToastTemplateType = ToastTemplateType.ToastText02
        ' Asignamos el template a un documento Xml
        Dim toastXml As XmlDocument = ToastNotificationManager.GetTemplateContent(toastTemplate)
    
        ' El texto para el primero elemento de la pantilla
        Dim toastTextElements As XmlNodeList = toastXml.GetElementsByTagName("text")
        toastTextElements(0).AppendChild(
            toastXml.CreateTextNode("Esto se mostrará durante más tiempo ..."))
        toastTextElements(1).AppendChild(
            toastXml.CreateTextNode("Siempre puedes cerrar las notificaciones en la X superior."))
    
        ' Si queremos que la duración sea larga
        ' Puede ser corta o larga, corta es la predeterminada
        Dim toastNode As IXmlNode = toastXml.SelectSingleNode("/toast")
        TryCast(toastNode, XmlElement).SetAttribute("duration", "long")
    
        ' Esto es para indicar que esta notificación se hará en el momento indicado
        Dim dueTime As DateTime = DateTime.Now.AddSeconds(10)
        Dim scheduledToast As New ScheduledToastNotification(toastXml, dueTime)
    
        ToastNotificationManager.CreateToastNotifier().AddToSchedule(scheduledToast)
    
        Dim toast As New ToastNotification(toastXml)
        ToastNotificationManager.CreateToastNotifier().Show(toast)
    
    

     

    Ese es el código para C# (no he tardado tanto, ¿verdad? son las 06.35 y lo publiqué a eso de las 6.05)

     

    Añade estas dos importaciones:

     

    using Windows.UI.Notifications;
    using Windows.Data.Xml.Dom;
    

     

    private void ButtonPlay_Click(object sender, RoutedEventArgs e)
    {
        // La plantilla a usar, esta Text03 es:
        // un texto de cabecera que puede ocupar dos líneas y una línea de texto normal
        ToastTemplateType toastTemplate = ToastTemplateType.ToastText03;
    
        // Asignamos el template a un documento Xml
        XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
    
        // El texto para el primer elemento de la pantilla
        XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");
        toastTextElements[0].AppendChild(toastXml.CreateTextNode("Cargando ..."));
    
        // Si queremos que la duración sea larga
        // Puede ser corta o larga, corta es la predeterminada
        IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
        ((XmlElement)toastNode).SetAttribute("duration", "long");
    
        // Si queremos quitar el sonido
        // (o indicar alguno en particular)
        // tenemos que usar el elemento "audio"
        // IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
        XmlElement audio = toastXml.CreateElement("audio");
        audio.SetAttribute("silent", "true");
        toastNode.AppendChild(audio);
    
        ToastNotification toast = new ToastNotification(toastXml);
        ToastNotificationManager.CreateToastNotifier().Show(toast);
    }
    
    private void ButtonClock_Click(object sender, RoutedEventArgs e)
    {
        // La plantilla a usar, esta Text03 es:
        // un texto de cabecera que puede ocupar dos líneas y una línea de texto normal
        ToastTemplateType toastTemplate = ToastTemplateType.ToastText03;
    
        // Asignamos el template a un documento Xml
        XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
    
        // El texto para el primer elemento de la pantilla
        XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");
        toastTextElements[0].AppendChild(
            toastXml.CreateTextNode("A los 3 segundos después de haber pulsado en el botón."));
        toastTextElements[1].AppendChild(
            toastXml.CreateTextNode("Segundo texto."));
    
        // Esto es para indicar que esta notificación se hará en el momento indicado
        DateTime dueTime = DateTime.Now.AddSeconds(3);
        ScheduledToastNotification scheduledToast = new ScheduledToastNotification(toastXml, dueTime);
    
        ToastNotificationManager.CreateToastNotifier().AddToSchedule(scheduledToast);
    }
    
    private void ButtonHelp_Click(object sender, RoutedEventArgs e)
    {
        // La plantilla a usar, esta Text02 es:
        // un texto de cabecera y un texto normal que puede ocupar dos líneas
        ToastTemplateType toastTemplate = ToastTemplateType.ToastText02;
        // Asignamos el template a un documento Xml
        XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
    
        // El texto para el primero elemento de la pantilla
        XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");
        toastTextElements[0].AppendChild(
            toastXml.CreateTextNode("Esto se mostrará durante más tiempo ..."));
        toastTextElements[1].AppendChild(
            toastXml.CreateTextNode("Siempre puedes cerrar las notificaciones en la X superior."));
    
        // Si queremos que la duración sea larga
        // Puede ser corta o larga, corta es la predeterminada
        IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
        (toastNode as XmlElement).SetAttribute("duration", "long");
    
        // Esto es para indicar que esta notificación se hará en el momento indicado
        DateTime dueTime = DateTime.Now.AddSeconds(10);
        ScheduledToastNotification scheduledToast = new ScheduledToastNotification(toastXml, dueTime);
    
        ToastNotificationManager.CreateToastNotifier().AddToSchedule(scheduledToast);
    
        ToastNotification toast = new ToastNotification(toastXml);
        ToastNotificationManager.CreateToastNotifier().Show(toast);
    }
    
    

     

     

    Como comentario adicional, decirte que podemos "detener" una notificación si tenemos a nuestra disposición el objeto con la que se creó, ya que para detenerla tenemos que usar el método Hide de la función compartida CreateToastNotifier. A ese método Hide le tenemos que pasar una referencia al objeto que queremos detener. Yo esto lo he usado en la aplicación que he mandado a la tienda de Windows, en la que muestro la notificación mientras se carga una página web en el control WebView y la oculto cuando dicha página se ha terminado de cargar o lo que es lo mismo, intercepto el evento LoadComplete del control WebView, y ahí es donde quito la notificación.

    Como es natural, el objeto "toast" usado para esa notificación no puede estar definido dentro de un sub, ya que así no sería accesible desde otra parte del código. Por tanto, en ese caso, el objeto toast usado para poder ocultarlo cuando queramos, lo tendríamos que definir fuera de cualquier método.

     

    Espero que todo esto te sea de utilidad y para los que prefieren el C#, dadme unos minutos a que cree el proyecto en ese lenguaje y convierta el código, lo tacho porque ya está publicado.

     

    Nos vemos.

    Guillermo

    …

  • El misterio de los controles desaparecidos

     

    Pues eso… aunque los controles más que desparecidos están o son invisibles…
    Y es curioso porque "supuestamente" estoy usando lo mismo en ambas versiones…
    Ah.. que no te he explicado de qué va la cosa…

    Pues resulta que la primera vez que quise hacer un panel para la configuración me basé en un ejemplo de la documentación en línea: Quickstart: Add app settings, pero al mostrar el código del panel (en el que había solo un ToggleSwitch) dicho control no era visible, pero estaba.

     

    La solución

     

    En esa misma página hay un enlace a un ejemplo del SDK:

    App settings sample. En el que, al menos en el código de C#, hay un panel de configuración (SettingsFlyout.xaml) con un montón de controles (ver la figura 1), y todos ellos son visibles… es decir, están y se puede demostrar.

     

    settingsFlyout sdk
    Figura 1. El panel de configuración del ejemplo de C# en App settings sample

     

    Sin embargo, he copiado esa página en otro proyecto (tanto de VB como de C#) y no hay forma de que se vean los controles, que están, pero no se puede demostrar… y para muestra, la figura 2.

     

    settingsFlyout blanco
    Figura 2. La misma página usada para la captura de la figura 1 en otro proyecto

     

    He mirado los estilos, he comprobado que todo está como en el proyecto original y nada… no hay forma de que se vean dichos controles. Primero pensé que era porque estaba usando Visual Basic y que faltaba algo del código usado en C#, pero no… también lo he probado en un proyecto de C# y tampoco soy capaz de mostrar los controles.
    De todas formas, en el ejemplo del SDK sólo he visto que esa página esté en el proyecto de C# pero no en el de Visual Basic… lo mismo es que a ellos les pasó lo mismo… hum… aunque no me sirve de consuelo… no… 🙁

    Seguramente será algo simple, pero no doy con la tecla… y lo publico por si por casualidad alguien lo ve y sabe cuál es el problema… porque yo no soy capaz de encontrarlo… en fin…

     

    Lo dicho, si sabes cómo solucionarlo, me lo dices.
    Gracias.

     

     

     

    La solución:

    En el fichero App.xaml (en la definición de <Application) añadir lo siguiente:

    RequestedTheme="Light"

    ¡¡¡Y ya se ven los dichosos controles!!!

    La inspiración vino al leer el artículo Windows Store App Settings Flyout de Mohamed Mahmoud El-Geish en el que explica cómo hay que diseñar uno de estos paneles y al indicar que el fondo del panel debe ser blanco indica el problema de los colores… y lo de indicar el RequestedTheme.

    Después de encontrar esta solución, vi que en mi facebook, Omar del Valle había puesto un enlace en el que explican esto de los temas claros y oscuros (Light y Dark):
    Mixing themes in XAML Metro apps.

    En fin…

     

     

    Nos vemos.
    Guillermo

    …

  • Como mostrar paneles en el panel de configuración (Windows Store)

     

    Pues eso… que ahora necesito crear un panel de configuración y como quiero hacerlo "al estilo metro" pues… he ido a mirar por aquí y resulta que no lo tenía publicado… así que… ahora te voy a explicar lo que yo sé sobre cómo mostrar un panel personalizado en el panel de configuración de las aplicaciones para Windows 8 o Windows Store.

    Hace un mes o así ya te expliqué cómo o, mejor dicho, dónde se deben poner las opciones de configuración de nuestras aplicaciones para la tienda de Windows.

    Ahora lo que toca es saber hacerlo nosotros, que eso de que otros lo hagan está muy bien… pero… si lo necesitamos en nuestra aplicación, pues…

    Cuando hice mi panel de configuración me basé en este ejemplo: Quickstart: Add app settings (Windows Store apps using C#/VB/C++ and XAML) (Windows).

    Y a partir de ahí lo fui adaptando… y aquí te dejo una forma simplificada de eso mismo que explican en ese "inicio rápido".

    En mi caso, me compliqué un poco más, ya que necesitaba varias opciones de configuración, bueno, en realidad sólo dos: la configuración de opciones en sí misma y mostrar "acerca de". Había una tercera opción que era mostrar la ayuda, pero esa ayuda no se mostraba dentro del panel de configuración, si no que desde ese panel se llamaba a la página de ayuda.
    No sé porqué estoy con el pretérito… en fin… seguramente porque es algo que "hice" hace unas semanas…

    Básicamente vamos a usar el código mostrado en el Quickstart que te he comentado hace unos párrafos, pero modificándolo un poco.

    Lo primero es crear una aplicación para Windows Store, usa la sencilla (Blank App) y en el lenguaje de tu preferencia, yo la crearé usando Visual Basic, pero lo mismo da (al menos en estos primeros pasos). En la figura 1 estoy creando el proyecto.

     

    settings 01
    Figura 1. Creamos un nuevo proyecto básico para la tienda de Windows

    Si estás usando Visual Basic y tienes activado Option Strict On, tendrás que modificar la declaración de rootFrame en el método OnLaunched de App.xaml.vb ya que la plantilla usada no tiene en cuenta la comprobación estricta y dará erro (ver la figura 2).

     

    settings 02
    Figura 2. Si tienes activado Option Strict debes hacer la conversión correcta en la asignación a rootFrame

     

    Acepta el cambio que propone y ahora lo modificamos para que sea más preciso y así también será como el indicado en el código de C# en el que se utiliza as para hacer la conversión, que como seguramente ya sabrás en VB se corresponde con TryCast. Por tanto el código debe quedar así:

     

    ' En VB debe quedar de esta forma:
    Dim rootFrame As Frame = TryCast(Window.Current.Content, Frame)
    
    
    // En C# la asignación es de esta forma:
    Frame rootFrame = Window.Current.Content as Frame;
    
    

     

    Ahora agregamos un nuevo elemento, en este caso un UserControl (figura 3) al que llamaremos Settings.xaml.

     

    settings 03

    Figura 3. Añadimos un user control

     

    Y pegamos el código del User Control que nos muestra en la página del Quickstart y le hacemos estos cambios:

    Truco:

    Si copias a partir de xmlns:local="using:SettingsExample" y lo pegas después del xmlns:local de nuestro control de usuario, tendrás que modificar menos.

     

    Debes fijarte que xClass tenga el valor de nuestro proyecto en el formato espacio de nombres punto nombre del control, después en xmlns:local debes indicar el espacio de nombres raíz del proyecto, que en mi caso es: Ejemplo_settings_charm tal como puse en la figura 1.

    Después, vamos a modificar el color de fondo del título, eso lo podemos hacer buscando la cadena "Orange" y cambiándola por "Navy" (o el color que quieras usar).

    El título lo vamos a hacer modificable, por tanto hay que indicarle un nombre al TextBlock que contiene la cadena "Sound Options", que estará casi al final del código:

     

    <TextBlock x:Name="txtTitulo"
    
    

    Abre la parte del código del control de usuario para crear el método MySettingsBackClicked, éste sería el de Visual Basic, el de C# será el mismo que se muestra en el Quickstart pero agregándole la condición que si está en modo Snapped no se muestre (la condición que le he agregado al final).

     

    Private Sub MySettingsBackClicked(sender As Object, e As RoutedEventArgs)
        If TypeOf Me.Parent Is Popup Then
            TryCast(Me.Parent, Popup).IsOpen = False
        End If
    
        ' Si no está en modo snapped...
        If ApplicationView.Value <> ApplicationViewState.Snapped Then
            SettingsPane.Show()
        End If
    
    
    End Sub
    

    En C# vendría a ser algo así:

    //  Si no está  en modo snapped...
    if( ApplicationView.Value !=  ApplicationViewState.Snapped )
    {
        SettingsPane.Show();
    }
    
    

     

    Todo eso es para que si está en modo Snapped, es decir, se muestra en un área estrecha a la derecha o a la izquierda, que no se muestre el panel de configuración, ya que ese "trozo" de pantalla suele ser de 320 pixel y… bueno, que es muy estrecha.

     

    Debido a que el TextBlock txtTitulo es interno a la clase Settings, tendremos que crear una propiedad pública para que podamos acceder a ese contenido desde otra clase de nuestro proyecto.

    No te muestro el código para que lo hagas tú.

    Pero es simple, utiliza la propiedad Text del control interno (txtTitulo) para asignar el valor y devolver el contenido de esa propiedad a la que llamaremos Titulo.

     

    En el código XAML del control debemos hacer unos cambios, ya que utilizan valores de recursos que ya no están definidos, así que… busca los valores indicados a la izquierda y los reemplazas por los indicados a la derecha o después de –> por si no cabe en la misma línea:

    BackButtonBackgroundBrush –> BackButtonBackgroundThemeBrush,

    BackButtonGlyphBrush –> BackButtonForegroundThemeBrush,

    BackButtonPressedGlyphBrush –> BackButtonPressedForegroundThemeBrush,

    FocusVisualWhiteStrokeBrush –> FocusVisualWhiteStrokeThemeBrush,

    FocusVisualBlackStrokeBrush –> FocusVisualBlackStrokeThemeBrush,

    BackButtonHoverBackgroundBrush –> BackButtonPointerOverBackgroundThemeBrush,

    BackButtonHoverGlyphBrush –> BackButtonPointerOverForegroundThemeBrush,

    Nota:

    La clase SettingsPane está definida en el espacio de nombres Windows.UI.ApplicationSettings

     

    Ahora vamos a agregar el código en la clase MainPage.

    Para los que han elegido Visual Basic:

    Añade el constructor (un método con el nombre New) al código de la clase, de forma que podamos agregar código a ese método. Para agregarlo, en la lista desplegable de la derecha busca New, si no te muestra nada, asegúrate de que en la lista de la izquierda esté seleccionada la clase MainPage.

    En C# no es necesario ya que siempre se agrega el constructor (un método con el mismo nombre que la clase)

    En el constructor hay que añadir una llamada al método inicializarPopup() que será el encargado de hacer algunas "cosillas" de inicialización.

    Añadir al principio importaciones a estos espacios de nombres: Windows.UI.ApplicationSettings y Windows.UI.Core.

    El primero es para las clases: SettingsPane, la clase de evento SettingsPaneCommandsRequestedEventArgs y la clase de creación de comandos SettingsCommand.

    La segunda importación es para poder usar la clase WindowSizeChangedEventArgs del método de evento OnWindowSizeChanged.

    De todas formas, esas importaciones las puedes hacer automáticamente si utilizas el corrector de errores de Visual Studio (tanto para Visual Basic como Visual C#).

     

    Ahora pega el código xaml de MainPage (de la famosa página de inicio rápido).

    Fíjate que te mostrará un error indicando que ApplicationPageBackgroundBrush no está definido, no lo busques porque no lo está, lo que debes hacer es cambiarlo por este otro valor: ApplicationPageBackgroundThemeBrush.

     

    Nota:

    En esta página puedes encontrar algunos de los valores usados antes en los recursos de estilos que ya no están y te muestra el que le corresponde ahora:

    Upgrade Metro App From Beta To RC.

     

    Añade también el código que te muestra, ah.. que está en C#, vale… aquí lo tienes si estás usando VB:

    (el código te lo dejo en Pastebin que si no, se llena esto demasiado)

     

     

    Una cosilla… ahora no tengo "capacidad" para saber porqué, pero en el ejemplo este que estamos haciendo, no se muestra el control que debería mostrarse en el panel de opciones… y la verdad es que no sé porqué… he mirado otros ejemplos, particularmente el de App Settings Sample y ahí si que se ven… aunque en ese caso utilizan una página en lugar de un UserControl… pero ni idea de porqué no se muestra el dichoso control. Bueno, si se muestra, pero no se ve… que es casi lo mismo, pero no es igual…

    Lo mismo otro día con más calma lo miro… yo por ahora lo he resuelto cambiando el color de fondo del panel… una chapuza, sí, pero funciona… 😉

    <Grid Background="Navy" en lugar de White.

    Lo mismo habrá que trastear con los estilos del ToggleSwitch. No sé…

     

    Nota del 15/Ene 13.10:

    La solución para que se vean los controles es usar RequestedTheme="Light" en App.xaml.

    Aquí tienes la explicación de cómo lo he averiguado.

     

    Espero que te sea de utilidad.

    Nos vemos.

    Guillermo

    …