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

Esta entrada fue publicada en cosas técnicas, mis cosas y etiquetada , , , , , , . Guarda el enlace permanente.