Etiqueta: xaml

  • Build Action de ficheros Xaml en aplicaciones de Windows Store

     

    Pues eso… que me voy a apuntar por aquí algunos de los valores que deben tener en la propiedad Build Action  "ciertos" ficheros de nuestros proyectos de Windows Store. Por ejemplo, el fichero App.xaml debe tener el valor ApplicationDefinition y el resto de los .xaml deben ser Page.
    Los ficheros de código deben tener Compile.

    Es que hoy me he vuelto a "enfangar" con estas cosas… no se si soy yo el que trastea o se trastean solo, pero el fichero MainPage (el que se carga desde App) tenía el valor CodeAnalysisDictionary y me daba error de que no encontraba el InitialiceComponent y por tanto, ninguno de los controles definidos en esa página.

     

    Build Action 01 - App.xaml ApplicationDefinition

     

    Después me fallaba la página de estilos (StandardStyles.xaml) con el dichoso error ese que cuando se para uno no sabe ni de qué va… aunque como ya te lo he comentado en un par de ocasiones se trata de que hay algo mal en el código XAML.
    La cuestión es que (aunque no lo decía) es que no podía cargar el famoso fichero de estilos, y es que resulta que tenía un valor diferente al que debía tener (ya no recuerdo cuál era, porque con el mosqueo que tenía ya, pues… en fin) pero el que debe tener es Page, como el resto.

     

    Build Action 02 - StandardStyles.xaml Page

     

    Y ya está. Te dejo, que sigo con lo que estaba haciendo.

     

    Nos vemos.
    Guillermo

    elGuille_luna300x200

    …

  • hay que ver… como es el Format con las llaves…

     

    Pues eso… que si usas Format, en cualquiera de sus encarnaciones: String.Format, StringBuilder.AppendFormat, Console.WriteLine, (incluso la función Format de Visual Basic) etc. y estas usando llaves para indicar parámetros (marcadores de posición que dicen en la documentación), mucho cuidado con que la cadena que estás formateando no tenga también llaves, porque entonces la hemos "pifiao".

     

    El problema

     

    Por ejemplo, si tienes esta cadena (o este código XAML):

     

    Dim xaml = <StackPanel Style="{StaticResource spImagen}">
                   <Image Source="ms-appx:///contenido/img/{0}"
                       Style="{StaticResource Imagen}"/>
               </StackPanel>
    
    

     

    Y pretendes usarlo con algo como esto:

    VB:

     

    sb.AppendFormat(xaml.ToString & "{1}",
                    sText.Replace(".tif", ".jpg"), vbCrLf)
    

     

    C#:

    Nota:

    En C# no se puede usar el contenido XML directamente, pero no es complicado adaptarlo, eso sí, es algo más laborioso que en Visual Basic, todo hay que decirlo. Pero para este caso que es poco código lo pasaremos por alto 😉

     

    string xaml = @"<StackPanel Style=""{StaticResource spImagen}"">
                        <Image Source=""ms-appx:///contenido/img/{0}""
                            Style=""{StaticResource Imagen}""/>
                    </StackPanel>";
    
    sb.AppendFormat(xaml + "\n",
                    sText.Replace(".tif", ".jpg"));
    

     

    Si usamos este código (ya sea con VB o con C#) el compilador producirá una excepción de formato no válido (FormatException) y es porque el "formateador" se encuentra con llaves (de inicio y/o de cierre) que no tienen un valor numérico asignado.

     

    FormatException

    Figura 1. El error en la aplicación de C# (es el mismo que en VB)

     

     

    La solución

     

    Pues… quitar las cadenas con las llaves que no sean "marcadores" y agregarlas en el propio AppendFormat:

     

    VB:

     

    Dim xaml = <Paragraph TextAlignment="Center">
                   <InlineUIContainer>
                       <StackPanel Style="{0}">
                           <Image Source="ms-appx:///contenido/img/{1}"
                               Style="{2}"/>
                       </StackPanel>
                   </InlineUIContainer>
               </Paragraph>
    
    sb.AppendFormat(xaml.ToString & "{3}",
                    "{StaticResource spImagen}",
                    sText.Replace(".tif", ".jpg"),
                    "{StaticResource Imagen}", vbCrLf)
    

     

    C#:

     

    string xaml = @"<StackPanel Style=""{0}"">
                        <Image Source=""ms-appx:///contenido/img/{1}""
                            Style=""{2}""/>
                    </StackPanel>";
    
    sb.AppendFormat(xaml + "\n","{StaticResource spImagen}",
                    sText.Replace(".tif", ".jpg"), "{StaticResource Imagen}");
    

     

    Es decir, ponemos para cada una de las "llaves fatídicas" una cadena con un marcador (de posición) y ponemos esas cadena (con sus llaves) en los parámetros de la función Format y asunto solucionado.

     

    Nota del Guille:

    Mira que esto mismo ya me pasó ayer (o hace un puñao de horas) y después me volvió a pasar, pero he estado un buen rato dándole vueltas al tema (se me olvidó que volví a cambiar el código XAML) y no daba con el dichoso error… eso me pasa por dos razones:

    1.- no tener buena memoria, no dormir lo suficiente, ser más cabezón que el Visual Studio

    2.- no usar suficientes Try/catch para "acorralar" el error…

    En fin… lo importante es que he dado con el error y que te lo cuento por si te pasa a ti.

     

    Si todo va bien, ya mismo te explicaré para qué estoy usando ese código (el de Visual Basic, ya que el de C# sólo lo he escrito para aquellos que les gustan los puntos y comas)…

     

    Lo dicho, espero que te pueda ser de ayuda… esa siempre es la intención 😉

     

    Nos vemos.

    Guillermo

    …

  • En ocasiones Visual Studio no avisa de los errores en XAML

     

    Pues eso… aunque al leer el título: "en ocasiones…" parece lo del niño ese de la peli Sexto Sentido (no del disco de Melendi), pero la realidad es que es así… y lo de "en ocasiones" lo he puesto como quien dice "presunto" asesino, por aquello de no pillarse los dedos…

    Te cuento… como últimamente estoy aburrío (jeje), pues me puse a trastear en los estilos de una de las páginas incluidas en los proyectos de tipo Windows Store, ya que en la ayuda vi que puedes modificar un estilo existente y agregarlo a varios sitios: la propia página en la que está el estilo original, en App.xaml y en otra página (del tipo resource dictionary) que tengas en tu proyecto.

    Todo esto es porque no daba con la tecla de cómo usar mi propio fichero de estilos que define estilos que usan otros estilos que están definidos en otra página… ¡QUIETOOOORRRR!
    ¡No te vayas!, que no es que te esté intentando liar… es que es así… sí, además, si estás leyendo esto lo mismo ya has leído lo que he publicado hace unos minutos y que precisamente soluciona el problema ese que te comento en este mismo párrafo:

    Crear un fichero de estilos XAML y acceder a estilos definidos en otro fichero

     

    Sigamos, pero veamos "gráficamente" lo que te comento, por ejemplo, abrimos (en modo diseño) la página SplitPage.xaml de un proyecto del tipo SplitApp (vale cualquier otra que tenga el botón para ir atrás), si seleccionas el botón de ir atrás y vas a las propiedades para acceder a la propiedad Styles (que está en el grupo Miscellaneous) verás que el estilo actual está indicado con un puntito verde a la derecha (ver figura 1), si pulsas en ese "punto" te mostrará un menú con varias opciones (ver figura 2)

    propiedades 1 – propiedades 2
    Figuras 1 y 2. Propiedades del estilo y convertir a nuevo recurso

     

    Si seleccionas Convert to New Resource te permitirá hacer una copia de ese recurso en el fichero que indiques, en mi caso (tal como vemos en la figura 3) lo quiero incluir en mi fichero de estilos.

     

    propiedades 3
    Figura 3. El cuadro de diálogo para indicar dónde estará el nuevo recurso

     

    Nota:
    Los ficheros mostrados en esa lista desplegable del cuadro de diálogo de crear un nuevo recurso de estilos, deben estar previamente agregados a MergedDictionary de App.xaml.
    Para saber cómo hacer esto que te comento, mira el enlace que te puse más arriba.

     

    Pues bien, eso hice yo. Agregué el nuevo recurso a mi fichero, e hice todo lo que te comenté en el post anterior. Ahora voy a probar los cambios (que no había sido nada, sólo lo de crear el recurso en otro fichero) y no funciona la aplicación.
    Bueno, funcionar si que funciona, de hecho me mostraba la página principal (ItemsPage) pero al pulsar en una de las opciones mostradas no me mostraba la otra página con los detalles… ¿adivinas cómo se llama la otra página! ¡BINGO! SplitPage.
    Pero claro, yo como iba a pensar que "yo" era el culpable (¿he sido yo? que diría Steve Urkel), así que… me puse a "debuguear" y nada, se quedaba en la llamada a esa página, pero no mostraba nada, ni daba error, ni ná de ná.
    Así que… aburrido (esta vez de probar y probar y no saber qué pasaba) quité ese proyecto y volví a crear otro del mismo tipo, pero sin cambiar nada del recurso… La pruebo y, claro, como es de esperar: ¡funciona!
    Eso sí, se paró en el mismo punto de interrupción que puse en la aplicación anterior ¿por qué? ni idea, lo que si te digo es que las dos aplicaciones se llamaban igual (sólo renombre el directorio para que no me diese error).

    Volví a probar sin el breakpoint y seguía funcionando. Así que… descargue ese proyecto y volví a cargar el anterior (el que estuve trasteando). Y me fije en cómo se llamaba el recurso que utilizaba el botón ese de la página SplitPage, y como era de esperar al hacer la copia del recurso se había cambiado el nombre y como resulta que yo había eliminado (en realidad quitado del proyecto) el fichero en el que se creó dicho recurso de estilos, pues… ¡no existía!

    Resumen, que ya es noche y me estoy alargando más de lo necesario:
    Si usas un estilo que no existe en un control XAML, "es posible" que Visual Studio no te alerte de ese "pequeño detalle".

    Y lo de es posible lo digo porque a mi otras veces si me ha avisado de que no existe, pero no avisando con un mensaje de alerta, si no , detallándolo en la ventana de errores, ya que si compilas y ejecutas si que funciona… es decir, no se para porque haya un error en el código XAML.

    Aunque también está la contrapartida, la de que te muestre cuadro de diálogo con un error (o que se pare la aplicación en el código oculto de la clase App) pero no veas el error en ningún sitio (ni en la ventana de errores), eso sí, con suerte puedes ver que el mensaje de error es:
    DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
    como ya te comenté en su día: Error al usar inadecuadamente el XAML.

     

    Pues nada, creo que ya está bien por hoy… y si esto te sirve para no tener los quebraderos de cabeza que he tenido por "no saber", pues… mejor, eso es de lo que se trata algunas veces: que los demás solucionen antes los errores que yo ya tuve… 😉

     

    Nos vemos.
    Guillermo

    …