<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>La Liga SilverlightLa Liga Silverlight | La Liga Silverlight</title>
	<atom:link href="http://blogs.ligasilverlight.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.ligasilverlight.com</link>
	<description>La primera Comunidad en Español acerca de Silverlight y tecnologías relacionadas</description>
	<lastBuildDate>Sun, 21 Apr 2013 20:44:18 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>31 d&#237;as de Windows 8 &#124; D&#237;a 16: Men&#250; contextual</title>
		<link>http://blogs.ligasilverlight.com/2013/04/31-das-de-windows-8-da-16-men-contextual/</link>
		<comments>http://blogs.ligasilverlight.com/2013/04/31-das-de-windows-8-da-16-men-contextual/#comments</comments>
		<pubDate>Sun, 21 Apr 2013 20:09:38 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=4024</guid>
		<description><![CDATA[Este artículo es una traducción de “Día 16: Menú contextual” de Jeff Blakenburg. Puedes encontrar aquí la versión en inglés. Hoy nuestro foco es en menús contextuales. Estos son aquellos pequeños comandos que se muestran ocasionalmente en tu aplicación cuando das un clic derecho o algo similar. Microsoft ofrece una guía muy especial en cuanto al uso de menús contextuales y cuando usar un control de AppBar en su lugar y seguiremos estas reglas en este artículo. ¿Qué es un menú contextual? Si has usado Windows 8, probablemente los hayas encontrado. Comúnmente ellos se muestran al momento de dar clic derecho en algo que no puedas seleccionar o texto con el que quieras interactuar. Aquí hay un ejemplo de menú contextual: (imagen de: http://msdn.microsoft.com/library/windows/apps/Hh465308) Podrías también lanzar un menú contextual desde un elemento en tu página que no sea seleccionable como esta imagen en mi aplicación de ejemplo: Dar clic derecho en la imagen lanza el menú contextual a la derecha. (Te mostraré como hacer que esto suceda a continuación). Cada uno de los comandos tendrán una función asignada a ella, el cual es ejecutado cuando el elemento sea presionado. Determinando la ubicación de un elemento. Quizá hayas notado que [...]]]></description>
				<content:encoded><![CDATA[<p>Este artículo es una traducción de “Día 16: Menú contextual” de Jeff Blakenburg. <a href="http://www.jeffblankenburg.com/2012/11/16/31-days-of-windows-8-day-16-context-menus" target="_blank">Puedes encontrar aquí la versión en inglés.</a></p>
<p>Hoy nuestro foco es en menús contextuales. Estos son aquellos pequeños comandos que se muestran ocasionalmente en tu aplicación cuando das un clic derecho o algo similar. <a href="http://msdn.microsoft.com/library/windows/apps/Hh465308" target="_blank">Microsoft ofrece una guía muy especial en cuanto al uso de menús contextuales</a> y cuando usar un control de AppBar en su lugar y seguiremos estas reglas en este artículo.</p>
<h2>¿Qué es un menú contextual?</h2>
<p>Si has usado Windows 8, probablemente los hayas encontrado. Comúnmente ellos se muestran al momento de dar clic derecho en algo que no puedas seleccionar o texto con el que quieras interactuar. Aquí hay un ejemplo de menú contextual:</p>
<p><img title="An image of the context menu for text shown over editable text while there is no text in the clipboard to paste." alt="An image of the context menu for text shown over editable text while there is no text in the clipboard to paste." src="http://i.msdn.microsoft.com/dynimg/IC600668.png" /></p>
<p>(imagen de: <a title="http://msdn.microsoft.com/library/windows/apps/Hh465308" href="http://msdn.microsoft.com/library/windows/apps/Hh465308">http://msdn.microsoft.com/library/windows/apps/Hh465308</a>)</p>
<p>Podrías también lanzar un menú contextual desde un elemento en tu página que no sea seleccionable como esta imagen en mi aplicación de ejemplo:</p>
<p><img title="16-XAML-ContextMenuExample" alt="16-XAML-ContextMenuExample" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/16XAMLContextMenuExample.png" width="507" height="255" border="0" /></p>
<p>Dar clic derecho en la imagen lanza el menú contextual a la derecha. (Te mostraré como hacer que esto suceda a continuación). Cada uno de los comandos tendrán una función asignada a ella, el cual es ejecutado cuando el elemento sea presionado.</p>
<h2>Determinando la ubicación de un elemento.</h2>
<p>Quizá hayas notado que los menús contextuales aparecen adyacentes directamente al elemento que ha sido seleccionado. Esto no sucede por magia. De hecho deberemos determinar la posición del elemento seleccionado por nosotros mismos (así como su tamaño) y pasarlo a nuestro control menú cuando lo creamos en forma de un objeto de Rectángulo. Aquí esta el método que he creado para determinar su ubicación.</p>
<pre class="brush: csharp">private Rect ObtenerRect(object sender)
{
FrameworkElement elemento = sender as FrameworkElement;
GeneralTransform transformacionElemento = elemento.TransformToVisual(null);
Point point = transformacionElemento.TransformPoint(new Point());
return new Rect(point, new Size(elemento.ActualWidth, elemento.ActualHeight));
}</pre>
<p>Como puedes ver, seré capaz de para mi “sender” en este método y regresar un objeto Rectángulo con un punto (la ubicación de la esquina superior derecha de nuestro elemento) y tamaño (las dimensiones de nuestro objeto llamado).</p>
<h2>Creando un menú contextual</h2>
<p>Una vez que ya tengo el método ObtenerRect() en su lugar creando un menú contextual cerca de nuestros controles es simple. En este ejemplo, he agregado un evento Right Tapped a mi imagen el cual llama a este método.</p>
<pre class="brush: csharp">private async void Element_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
PopupMenu menuContextual = new PopupMenu();
menuContextual.Commands.Add(new UICommand(&amp;quot;La liga silverlight&amp;quot;, (command) =&amp;gt; { ((Grid)Logo.Parent).Background = new SolidColorBrush(Colors.Red); }));
await menuContextual.ShowForSelectionAsync(ObtenerRect(sender), Placement.Right);
}</pre>
<p>Como puedes ver arriba, esto simplemente crea un nuevo control de tipo PopupMenu, agrega un comando a el (con el código de ejecución especificado en la expresión lambda) y llama al método ShowForSelectionAsync() para mostrarlo. Este método toma dos parámetros.</p>
<p>* El primero es el valor de Rectángulo que estamos obteniendo de nuestro método ObtenerRect(). Pasa el sender y obtiene el rectángulo apropiado de regreso.</p>
<p>* El segundo es la ubicación del menú contextual. En mi ejemplo, coloqué Placement.Right como mi valor. Tienes cuatro opciones pero no pierdas tiempo en esto. La guía de Microsoft en menús contextuales es que “aparezcan sobre el objeto sobre el que están actuando a menos que se interponga sobre otros elementos de la interfaz en cuyo caso se debe colocar a un lado o por debajo del objeto”. Mantén la experiencia en Windows 8 consistente para tus usuarios a menos de que tengas una buena razón para hacerlo de otra manera.</p>
<p>Ejecutar este código, como se muestra arriba, resultará en un menú que lucirá como esto:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/04/image.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/04/image_thumb.png" width="300" height="158" border="0" /></a></p>
<p>Y cuando yo ejecute esta opción, el fondo de la página se volverá rojo. Como esto.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/04/image1.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/04/image_thumb1.png" width="300" height="152" border="0" /></a></p>
<p>Así que así es como mostramos un menú contextual. Pero ¿cuántos comandos podemos tener a la vez? La respuesta es SEIS. Agregar más de 6 elementos a tu menú PopupMenu resultará en un error cuando trates de crearlo. Lo mostré antes pero aquí está un ejemplo de un menú de cinco elementos.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/04/image2.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/04/image_thumb2.png" width="300" height="182" border="0" /></a></p>
<p>Finalmente, también tienes la opción de crear un UICommandSeparator() el cual es simplemente una línea horizontal en lugar de un comando. Los separadores tomarán lugar en uno de tus seis espacios disponibles sin embargo; así que ten esto en cuenta cuando lo uses, esto lucirá así.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/04/image3.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/04/image_thumb3.png" width="300" height="194" border="0" /></a></p>
<p>Para hacer esto, tu sentencia de creación del comando debería lucir como esto:</p>
<pre class="brush: csharp">menuContextual.Commands.Add(new UICommand(&amp;quot;31 Días de Windows 8&amp;quot;, (command) =&amp;gt; { ((Grid)Logo.Parent).Background = new SolidColorBrush(Colors.Orange); }));
menuContextual.Commands.Add(new UICommandSeparator());</pre>
<p>¡Esto es todo! Ahora deberías ser capaz de agregar menús contextuales a tus aplicaciones cuando las AppBars y otros elementos no tienen sentido. Pero ¿qué hay acerca interactuar con algo de texto en una caja de texto?</p>
<h2>Lanzar un menú contextual desde una caja de texto</h2>
<p>Actualmente, cerca de todo en este proceso es el mismo, excepto por las matemáticas de donde surge la la caja contextual. Inicialmente al comenzar a resolver este problema, estaba esperando agregarla en un menú contextual que ya apareciera cuando des clic derecho en el texto.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/04/image4.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/04/image_thumb4.png" width="261" height="293" border="0" /></a></p>
<p align="left">Mientras aparece no puede. Así que para nuestro ejemplo, vamos a decir que queremos mantener todas esas opciones, pero también agregar algunas nuevas. Para hacerlo, primero necesitamos sobre escribir el menú contextual creando un manejador de eventos para cancelar el pre establecido y recrear toda su funcionalidad.</p>
<p align="left">Para hacer esto, creamos un manejador de eventos como el siguiente.</p>
<pre class="brush: csharp">protected override void OnNavigatedTo(NavigationEventArgs e)
{
txtLipsum.ContextMenuOpening += txtLipsum_ContextMenuOpening;
}

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
txtLipsum.ContextMenuOpening -= txtLipsum_ContextMenuOpening;
}</pre>
<p>También cree una sentencia para retirar el manejador de eventos cuando deje la página.</p>
<p>En el método que este manejador de eventos llama, cancelaremos la llamada inicial con Handled = true, y después crear nuestro propio menú contextual que aún haga algunas de las llamadas apropiadas al portapapeles. Solo vamos a cubrir esta parte brevemente en este artículo pero consumiremos el artículo entero de mañana para las diferentes formas de usar esta gran herramienta.</p>
<p>En suma, encontrar el lugar adecuado para mostrar un menú contextual dentro de un TextBox es diferente a solo determinar la posición de un control en la página. Aquí está mi método ObtenerRectanguloTexto().</p>
<pre class="brush: csharp">private Rect ObtenerRectanguloTexto(TextBox cajaTexto)
{
Rect contenedorDatos = cajaTexto.GetRectFromCharacterIndex(cajaTexto.SelectionStart, false);

GeneralTransform transform = cajaTexto.TransformToVisual(null);
Point punto = transform.TransformPoint(new Point());
punto.X = punto.X + contenedorDatos.X;
punto.Y = punto.Y + contenedorDatos.Y;

return new Rect(punto, new Size(contenedorDatos.Width, contenedorDatos.Height));
}</pre>
<p>Y aquí esta el método para crear nuestro menú Popup (notarás que he usado un método secundario para determinar que comando es presionado que no use expresiones lambdas en esta ocasión. Es más fácil para lectura pero deberías también notar que el método es mucho más largo).</p>
<pre class="brush: csharp">async void txtLipsum_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
e.Handled = true;
TextBox textoResaltado = (TextBox)sender;

PopupMenu menuContextual = new PopupMenu();
menuContextual.Commands.Add(new UICommand(&amp;quot;Cortar&amp;quot;, null, 0));
menuContextual.Commands.Add(new UICommand(&amp;quot;Copiar&amp;quot;, null, 1));
menuContextual.Commands.Add(new UICommand(&amp;quot;Pegar&amp;quot;, null, 2));
menuContextual.Commands.Add(new UICommand(&amp;quot;Seleccionar todo&amp;quot;, null, 3));
menuContextual.Commands.Add(new UICommandSeparator());
menuContextual.Commands.Add(new UICommand(&amp;quot;Borrar&amp;quot;, null, 4));

var comandoElegido = await menuContextual.ShowForSelectionAsync(ObtenerRectanguloTexto(textoResaltado));

if (comandoElegido != null)
{
String texto;
DataPackage paqueteDatos;

switch ((int)comandoElegido.Id)
{
case 0: //Cortar
texto = textoResaltado.SelectedText;
textoResaltado.SelectedText = &amp;quot;&amp;quot;;
paqueteDatos = new DataPackage();
paqueteDatos.SetText(texto);
Clipboard.SetContent(paqueteDatos);
break;
case 1: //Copiar
texto = textoResaltado.SelectedText;
paqueteDatos = new DataPackage();
paqueteDatos.SetText(texto);
Clipboard.SetContent(paqueteDatos);
break;
case 2: //Pegar
texto = await Clipboard.GetContent().GetTextAsync();
textoResaltado.SelectedText = texto;
break;
case 3: //Seleccionar todo
textoResaltado.SelectAll();
break;
case 4: //Borrar
textoResaltado.SelectedText = &amp;quot;&amp;quot;;
break;
}
}
}</pre>
<p>Si estás siguiendo tu propio proyecto, deberías ahora ser capaz de resaltar algo de texto en tu caja de texto y obtener un menú similar al de la imagen de arriba.</p>
<h2>En resumen</h2>
<p>Hoy vimos el arte de crear menús contextuales para nuestros usuarios. Hay una manera excelente de proveer interacciones con elementos que no sean seleccionables o para comandos que tengan más sentido estando directamente adyacentes al elemento con el que se está interactuando.</p>
<p>Si quisieras ver el código de ejemplo completo para este artículo, presiona sobre el ícono de abajo.</p>
<p>&nbsp;</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia16.zip" target="_blank"><img class="alignnone" alt="" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadXAML5.png" width="150" height="150" /></a></p>
<p>&nbsp;</p>
<p>Mañana, como prometí, nos aventuraremos en la funcionalidad del portapepeles disponible para nosotros en el desarrollo de Windows 8. ¡Nos vemos entonces!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/04/31-das-de-windows-8-da-16-men-contextual/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 d&#237;as de Windows 8 &#124; D&#237;a 15: El teclado en pantalla</title>
		<link>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-15-el-teclado-en-pantalla/</link>
		<comments>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-15-el-teclado-en-pantalla/#comments</comments>
		<pubDate>Fri, 29 Mar 2013 16:28:00 +0000</pubDate>
		<dc:creator>Jorge Castro</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=4013</guid>
		<description><![CDATA[Este artículo es una traducción del día #15 en la serie 31 días de Windows 8 de Jeff Blakenburg. Hoy vamos a dar un vistazo al teclado en pantalla de Windows 8. Microsoft no parece hacer una distinción de nombres entre el teclado que aparece cuando haces tap con tu dedo en un control TextBox y el que encuentras en el Centro de Accesibilidad. Vamos a enfocarnos hoy en el teclado que se ve como esto: Por otro lado, el teclado de Accesibilidad, es una herramienta diseñada para hacer más fácil el uso de la computadora a quienes no pudieran usar el teclado de ninguna forma. Lo puedes encontrar abriendo el centro de Accesibilidad en tu maquina… Y haciendo click en la opción de “Iniciar Teclado en Pantalla” vas a descubrir un teclado que se ve como este: El enfoque principal de este teclado es permitir al usuario usar Windows completamente sin tener un teclado conectado a su computadora. No es personalizable, y no responde a ningún código que escribamos en este artículo. El teclado es también una de las pocas ventana que pueden ser puestas sobre la pantalla de Inicio. Míralo aquí: OK, así hemos usado los primeros párrafos [...]]]></description>
				<content:encoded><![CDATA[<p>Este artículo es una traducción del día #15 en la serie <a href="http://31daysofwindows8.com/">31 días de Windows 8</a> de Jeff Blakenburg.</p>
<p>Hoy vamos a dar un vistazo al teclado en pantalla de Windows 8. Microsoft no parece hacer una distinción de nombres entre el teclado que aparece cuando haces tap con tu dedo en un control TextBox y el que encuentras en el Centro de Accesibilidad. Vamos a enfocarnos hoy en el teclado que se ve como esto:</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLNormalKeyboard.png"><img title="15-XAML-NormalKeyboard" border="0" alt="15-XAML-NormalKeyboard" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLNormalKeyboard_thumb.png" width="500" height="144" /></a></p>
<p>Por otro lado, el teclado de Accesibilidad, es una herramienta diseñada para hacer más fácil el uso de la computadora a quienes no pudieran usar el teclado de ninguna forma. Lo puedes encontrar abriendo el centro de Accesibilidad en tu maquina…</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLEaseOfAccessCenter.png"><img title="15-XAML-EaseOfAccessCenter" border="0" alt="15-XAML-EaseOfAccessCenter" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLEaseOfAccessCenter_thumb.png" width="500" height="523" /></a></p>
<p>Y haciendo click en la opción de “Iniciar Teclado en Pantalla” vas a descubrir un teclado que se ve como este:</p>
<p><img title="15-XAML-EaseOfAccessKeyboard" border="0" alt="15-XAML-EaseOfAccessKeyboard" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLEaseOfAccessKeyboard.png" width="500" height="143" /></p>
<p>El enfoque principal de este teclado es permitir al usuario usar Windows completamente sin tener un teclado conectado a su computadora. No es personalizable, y no responde a ningún código que escribamos en este artículo. El teclado es también una de las pocas ventana que pueden ser puestas sobre la pantalla de Inicio. Míralo aquí:</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLOnScreenKeyboardStartScreen.png"><img title="15-XAML-OnScreenKeyboardStartScreen" border="0" alt="15-XAML-OnScreenKeyboardStartScreen" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLOnScreenKeyboardStartScreen_thumb.png" width="500" height="312" /></a></p>
<p>OK, así hemos usado los primeros párrafos de este artículo hablando acerca de un teclado que NO es el objetivo de este artículo. <strong>¿Porque? </strong>Hay dos razones:</p>
<ol>
<li>Si estas usando dispositivos no touch mientras trabajas con este artículo (o en tu propia app y quieres usar las características del teclado regular touch), te encontraras con que los clicks del mouse no lanzan el teclado touch en tu máquina. Así que buscaras en la web una solución para hacer que se muestren. </li>
<li>Mientras buscas por la web más información sobre manipular el teclado en pantalla en Windows 8, vas a encontrar varios artículos sobre el de la versión de Accesibilidad, que es el que no necesitas. Si encuentras un artículo apropiado sobre como lanzar el teclado touch, probablemente sea este, porque no pude hallar una forma de hacerlo funcionar. </li>
</ol>
<p>La primera razón de esto es porque este es uno de las pocas veces que Windows 8 hace distinción entre un click de mouse y un tap de dedo. Si das click en un TExtBox, Windows 8 asume que estas usando un teclado real, incluso si estas usando una máquina habilitada para touch. Un tap de dedo, sin embargo, mostrara el teclado que vamos a usar hoy.</p>
<p>Para ahorrarte algo de frustración, al desarrollar tu aplicación que tomara ventaja de el teclado en pantalla, usa el simulador si no estas trabajando en una maquina touch. Te permite simular “taps” con tu mouse. Aquí es donde lo puedes ver:</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLSimulatorTapButton.png"><img title="15-XAML-SimulatorTapButton" border="0" alt="15-XAML-SimulatorTapButton" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLSimulatorTapButton_thumb.png" width="500" height="319" /></a></p>
<p>OK, ahora que hemos hecho a un lado todo eso, iniciemos de una vez este artículo.</p>
<p>&#160;</p>
<h2></h2>
<h2>Usando el teclado en pantalla</h2>
<p>Primero, demos un vistazo a los estados por defecto del teclado en pantalla que el usuario puede navegar en cualquier momento cuando la pantalla está abierta. Hemos visto ya la vista QWERTY standard:</p>
<p><img title="15-XAML-NormalKeyboard" border="0" alt="15-XAML-NormalKeyboard" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLNormalKeyboard1.png" width="500" height="144" /></p>
<p>Pero hay muchas más. Cuando construimos una aplicación, nuestro primer enfoque, mas que cualquier otro, debe ser el hacer que las tareas que el usuario necesita hacer sean lo más fácil de cumplir que se pueda. (Eso ESTÁ en tus prioridades, correcto?) En ese sentido, el teclado en pantalla puede ser manipulado para que eso sea posible. Hay una propiedad que puede establecerse en los controles TextBox llamada InputScrope que nos permite mostrar el teclado apropiado para la tarea a realizar. Si un InputScope no se especifica, el teclado normal se mostrará. Aquí está como luce el código:</p>
<p>&lt;TextBox InputScope=&quot;EmailSmtpAddress&quot; /&gt;</p>
<p>&#160;</p>
<p>Vas a encontrar, mienstra empiezas a jugar con el InputScope, que hay de hecho 18 diferentes valores de InputScope que pueden ser usados (pero para usuarios Anglo-parlantes, hay de hecho solo tres teclados diferentes por ahora). Estos son (en orden alfabético):</p>
<ul>
<li>AlphanumericFullWidth </li>
<li>AlphaNumericHalfWidth </li>
<li>ChineseFullWidth </li>
<li>ChineseHalfWidth </li>
<li>Default </li>
<li>EmailSmtpAddress </li>
<li>HangulFullWidth </li>
<li>HangulHalfWidth </li>
<li>Hanja </li>
<li>Hiragana </li>
<li>KatakanaFullWidth </li>
<li>KatakanaHalfWidth </li>
<li>NativeScript </li>
<li>Number </li>
<li>NumberFullWidth </li>
<li>Search </li>
<li>TelephoneNumber </li>
<li>Url </li>
</ul>
<p>Los únicos valores de ámbito de entrada que responden a computadoras con el lenguaje Inglés de pantalla son: Default, EmailSmtpAddress, Number, Search, TelephoneNumber, y Url. Aquí está como se ven:</p>
<p><strong>EmailSmtpAddress </strong>(agrega el botón “@” y “.com”)</p>
<p><strong><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15-XAML-EmailKeyboard.png"><img title="15-XAML-EmailKeyboard" border="0" alt="15-XAML-EmailKeyboard" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15-XAML-EmailKeyboard_thumb.png" width="500" height="143" /></a></strong></p>
<p><strong>Url </strong>(agrega botones “/” y “.com”, barra de espacio más pequeña, tecla Go)</p>
<p><img title="15-XAML-URL" border="0" alt="15-XAML-URL" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLURL.png" width="500" height="144" /></p>
<p><strong>Number y TelephoneNumber </strong>(muestra el teclado numérico)</p>
<p><img title="15-XAML-Number" border="0" alt="15-XAML-Number" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLNumber.png" width="500" height="144" /></p>
<p><strong>Búsqueda </strong>(lo mismo que el teclado por defecto, pero la tecla Enter remplazada por Search o Búsqueda)</p>
<p><img title="15-XAML-Search" border="0" alt="15-XAML-Search" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLSearch.png" width="500" height="144" /></p>
<p>El resto de los valores InputScope están generalmente enfocados a los lenguajes Asiatico Orientales, y aunque no les quiero faltar al respeto, no se lo suficiente acerca de esos conjuntos de caracteres para tener una discusión inteligente acerca de las pequeñas diferencias entre caracteres FullWidth y HalfWidth.</p>
<p>Sumado a nuestros valores InputScope, es importante entender las otras opciones que nuestros usuarios pueden navegar en cualquier momento cuando el teclado esta en la pantalla del usuario. Aquí las tienes:</p>
<p><strong>Letras Mayúsculas</strong></p>
<p><img title="15-XAML-CAPS" border="0" alt="15-XAML-CAPS" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLCAPS.png" width="500" height="144" /></p>
<p><strong>Emoji </strong>(<a href="http://jeffblankenburg.com/downloads/31daysofwindows8/emoji.png">hay de hecho 30 PAGINAS de emoji, haz click aquí para verlos todos</a>)</p>
<p><img title="15-XAML-Emoji" border="0" alt="15-XAML-Emoji" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLEmoji.png" width="500" height="144" /></p>
<p><strong>Simbolos </strong>(un segundo set de simbolos después del que se muestra con el teclado Number)</p>
<p><img title="15-XAML-Symbols2" border="0" alt="15-XAML-Symbols2" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLSymbols2.png" width="500" height="144" /></p>
<p><strong>Teclado dividido</strong> (una opción del usuario, este teclado esta optimizado para escritura con pulgar)</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLSplitKeyboard.png"><img title="15-XAML-SplitKeyboard" border="0" alt="15-XAML-SplitKeyboard" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLSplitKeyboard_thumb.png" width="500" height="93" /></a></p>
<p><strong>Teclado de tinta </strong>(Este teclado hace reconocimiento de escritura a mano)</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLInkingKeyboard.png"><img title="15-XAML-InkingKeyboard" border="0" alt="15-XAML-InkingKeyboard" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLInkingKeyboard_thumb.png" width="500" height="92" /></a></p>
<p>Obviamente, este es un gran conjunto de puntos de entrada para nosotros como desarrolladores, y proporcionando el teclado adecuado para el trabajo hará tu app más útil para tus usuarios. Hay también una distribución de teclado más, y es el del control PasswordBox. Un control PasswordBox muestra símbolos en vez de los caracteres que se escribieron, y el teclado se ve como esto:</p>
<p><img title="15-XAML-PasswordBox" border="0" alt="15-XAML-PasswordBox" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/15XAMLPasswordBox.png" width="500" height="144" /></p>
<p>Notaras que también tiene un botón “Ocultar presión de teclas”. Hay veces cuando la gente puede ver tu máquina (especialmente si la estás proyectando a una audiencia) y no quieres que sean capaces de ver los teclazos de tu password. Este botón no resalta los botones cuando son tocados. (Vas a notar también que el botón de Emoji esta deshabilitado, porque esos caracteres no deben ser usados para un password.)</p>
<p>En el pasado, he escrito artículo acerca de <a href="http://www.jeffblankenburg.com/2010/10/10/31-days-of-windows-phone-day-10-inputscope-textboxes/">TextBoxes y teclados virtuales</a>, y revise cada uno de los casos de uso donde quieras mostrar el teclado sin mostrar lo que escribe el usuario. Un gran ejemplo de esto podría ser el juego de Ahorcado. Quieres que el usuario sea capaz de elegir una letra, pero también ocultar el teclado así el usuario puede ver su progreso.</p>
<p>En Windows 8, esto no es posible ya. No puedes lanzar el teclado en pantalla vía código. De hecho, establecer el foco a un control TextBox no hara nada más que hacer el cursor intermitente. Específicamente requiere que un evento tap (no un click de mouse) ocurra en el TextBox antes que aparezca el teclado en pantalla. (Esa es la misma razón de porque debes usar el Simulador al depurar este tipo de funcionalidad en tus apps.)</p>
<h2></h2>
<h2>Resúmen</h2>
<p>Hot, hemos cubierto una variedad de teclado que están disponibles a nuestros usuarios. Podemos aprovechar los valores InputScop para mostrar el teclado correcto en el momento correcto. Adicionalmente, aprendí que hay 30 paginas completa de caracteres Emoji para usar también. (Si no es obvio, me beneficio mucho de escribir estos artículos también!)</p>
<p>Si quieres ver una aplicación funcional que usa cada uno de los valores InputSCop, haz click en el icono para descargarlo:</p>
<p><a href="https://github.com/csell5/31DaysOfWindows8/tree/master/source/XAML/Day15-OnScreenKeyboard"><img title="downloadXAML" border="0" alt="downloadXAML" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadXAML17.png" width="150" height="150" /></a></p>
<p>Mañana, vamos a echarnos un clavado a usar los Menus Contextuales para ofrecer a nuestro usuario comandos contextuales directamente en la pantalla de la app. ¡Hasta entonces!</p>
<p><a href="http://bit.ly/win8devgear"><img title="downloadTheTools" border="0" alt="downloadTheTools" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadTheTools17.png" width="500" height="61" /></a></p>
<p>Aquí esta la lista enorme de Emoji, en caso de que hayas olvidado hacerle click:</p>
<p><a href="http://jeffblankenburg.com/downloads/31daysofwindows8/emoji.png"><img title="Emoji" border="0" alt="Emoji" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/Emoji.png" width="500" height="4376" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-15-el-teclado-en-pantalla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 d&#237;as de Windows 8 &#124; D&#237;a 14: Geo localizaci&#243;n</title>
		<link>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-14-geo-localizacin/</link>
		<comments>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-14-geo-localizacin/#comments</comments>
		<pubDate>Fri, 29 Mar 2013 15:00:26 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=4006</guid>
		<description><![CDATA[Este artículo es una traducción de “Día 14: Geo localización” de Jeff Blakenburg. Puedes encontrar aquí la versión original en inglés. Hoy vamos a hablar acerca de uno de mis elementos favoritos e cualquier plataforma de desarrollo. Tener el conocimiento de la ubicación del usuario (o más específicamente, del dispositivo) hace mejor a cualqueir aplicación. Aquí están algunos ejemplos de como: Aplicaciones de línea de negocios Conoce que planta estará visitando tu gerente hoy de modo que el tenga toda la documentación apropiada para la maquinaria en esa instalación. Además tu aplicación podrá navegar e fotos y nombres de los empleados en ese lugar así ellos estarán más preparados cuando el llegue. Juegos Identifica otros jugadores cercanos y ten la oportunidad de retarlos a un juego. No solo mejorará potencialmente la latencia de red para ellos sino que también podrás formar un gremio de nada. Crea un juego global de parejas, basado únicamente en la proximidad, no en contacto. Mapas Duh. Haremos esto como una parte del código de ejemplo de hoy. Viajes Reconoce la distancia del usuario y tiempo de viaje potencial desde el aeropuerto y alértalos  de caer en la urgencia de perder su vuelo. Además, una vez [...]]]></description>
				<content:encoded><![CDATA[<p>Este artículo es una traducción de “Día 14: Geo localización” de Jeff Blakenburg. <a href="http://www.jeffblankenburg.com/2012/11/14/31-days-of-windows-8-day-14-geolocation" target="_blank">Puedes encontrar aquí la versión original en inglés.</a></p>
<p>Hoy vamos a hablar acerca de uno de mis elementos favoritos e cualquier plataforma de desarrollo. Tener el conocimiento de la ubicación del usuario (o más específicamente, del dispositivo) hace mejor a cualqueir aplicación. Aquí están algunos ejemplos de como:</p>
<p><strong>Aplicaciones de línea de negocios</strong></p>
<p>Conoce que planta estará visitando tu gerente hoy de modo que el tenga toda la documentación apropiada para la maquinaria en esa instalación. Además tu aplicación podrá navegar e fotos y nombres de los empleados en ese lugar así ellos estarán más preparados cuando el llegue.</p>
<p><strong>Juegos</strong></p>
<p>Identifica otros jugadores cercanos y ten la oportunidad de retarlos a un juego. No solo mejorará potencialmente la latencia de red para ellos sino que también podrás formar un gremio de nada. Crea un juego global de parejas, basado únicamente en la proximidad, no en contacto.</p>
<p><strong>Mapas</strong></p>
<p>Duh. Haremos esto como una parte del código de ejemplo de hoy.</p>
<p><strong>Viajes</strong></p>
<p>Reconoce la distancia del usuario y tiempo de viaje potencial desde el aeropuerto y alértalos  de caer en la urgencia de perder su vuelo. Además, una vez que has establecido que no llegarán a tiempo podrás ayudarlos a encontrar el siguiente vuelo disponible sin que el usuario lo tenga que hacer por sí solo.</p>
<p><strong>Ejercicio</strong></p>
<p>Hay toneladas de aplicaciones disponibles para seguir tu ruta de ejercicio. Piensa en correr, ciclismo, etcétera. La aplicación de geolocalización obvia de estas aplicaciones es la habilidad de mapear la ruta que tomaste durante tus viajes. Una más importante, sin embargo, creo que es la responsabilidad que probablemente cae en los fabricantes de SO mismos, es la habilidad de reconocer un accidente. En promedio, 4500 ciclistas al año son víctimas de situaciones de accidentes, donde ellos son abandonados lastimados (o peor) en un lado del camino. En el mundo de hoy, casi todo el mundo tiene un teléfono con ellos, incluso al correr o andar en bicicleta. Imagina que tu teléfono es capaz de reconocer un impacto grande (usando información del acelerómetro o giroscopio), seguido de ningún movimiento. Después de 30 segundos de movimiento nulo, tu teléfono te incita a llamar a un número de emergencia y enviar mensajes de texto a una lista pre seleccionada de contactos con un mensaje de ayuda y tu ubicación. Después de otros 30 segundos inmediatamente llama a emergencias y envía la información. Esta funcionalidad podría salvar vidas, tantas como esos ciclistas que fallecen sin ayuda solo porque nadie sabe donde están. Siento ser tan crudo, pero es una razón importante en la cual pensar.</p>
<p>Como puedes ver, hay siempre una razón por la cual tomar información de ubicación y hacer tu aplicación incluso mejor. Además, si amas las ideas que te doy arriba eres completamente libre de robarlas en tu favor. Probablemente yo nunca cree ninguna de estas aplicaciones. Necesitaría haber 48 horas en un día para hacer que eso sucediera.</p>
<h2>Actualizando nuestro manifiesto</h2>
<p>Afortunadamente, obtener la información de nuestra ubicación geográfica es muy sencillo y como de costumbre, tenemos que declarar que la Ubicación es una de nuestras capacidades a usar. Para hacer esto, abre la sección de Capacidades de tu archivo package.appxmanifest y selecciona la caja de Ubicación.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image22.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb22.png" width="500" height="246" border="0" /></a></p>
<p>Si omites este paso y solo tratas de implementar el código del resto del artículo no tendrás ningún error pero tampoco obtendrás ninguna información.</p>
<h2>Obteniendo nuestra ubicación geográfica</h2>
<p>En este ejemplo, he construido una aplicación que monitoree constantemente la ubicación del dispositivo del usuario. Lo primero que me confundió en este proceso fue como preguntar al usuario por permiso para iniciar la localización en la aplicación. Si revisas el Día #11 Pantalla de bloqueo, necesitamos pedir un permiso explícito del usuario para acceder a su pantalla de bloqueo. Con la ubicación, sin embargo no. El simple acto de tratar de acceder a la información le preguntará a tu usuario por ti. Para hacer esto increíblemente más fácil, aquí está TODO el código que necesitarás para acceder a la ubicación de un dispositivo desde tu aplicación (Ten en cuenta que estoy enviando todos mis valores a cajas de texto en mi MainPage.xaml que muestran la información. Todas están nombradas como [DataType]Value para hacerlo obvio).</p>
<pre class="brush: csharp">Geolocator ubicacion;

protected override void OnNavigatedTo(NavigationEventArgs e)
{
ubicacion = new Geolocator();
ubicacion.PositionChanged += location_PositionChanged;
ubicacion.StatusChanged += location_StatusChanged;
}

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
ubicacion.PositionChanged -= location_PositionChanged;
ubicacion.StatusChanged -= location_StatusChanged;
}

async void location_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =&gt;
{
Geoposition posicion = args.Position;

LatitudeValue.Text = posicion.Coordinate.Latitude.ToString();
LongitudeValue.Text = posicion.Coordinate.Longitude.ToString();
AccuracyValue.Text = posicion.Coordinate.Accuracy.ToString();

TimestampValue.Text = posicion.Coordinate.Timestamp.ToString();

if (posicion.Coordinate.Altitude != null)
AltitudeValue.Text = posicion.Coordinate.Altitude.ToString()
+ &quot;(+- &quot; + posicion.Coordinate.AltitudeAccuracy.ToString() + &quot;)&quot;;
if (posicion.Coordinate.Heading != null)
HeadingValue.Text = posicion.Coordinate.Heading.ToString();
if (posicion.Coordinate.Speed != null)
SpeedValue.Text = posicion.Coordinate.Speed.ToString();
});
}

async void location_StatusChanged(Geolocator sender, StatusChangedEventArgs args)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =&gt;
{
StatusValue.Text = args.Status.ToString();
});
}</pre>
<p>Como podrás haber adivinado, esta es una operación manejada por eventos. Cuando mi página se carga, creo un nuevo objeto de tipo Geolocator y agrego dos eventos: PositionChanged y StatusChanged.</p>
<p>PositionChanged es el importante. Aquí es donde obtenemos toda la información útil como Latitud, Longitud y Precisión. Todos estos valores vienen de la clase <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.geolocation.geocoordinate.aspx" target="_blank">Geocoordinate</a> y como puedes ver en el código de arriba, hay muchas más.</p>
<p>* <strong>Accuracy</strong> es la medida, en metros, del radio de un círculo que tenga nuestros valores de latitud y longitud como punto central. Como esto.</p>
<p><img title="14-XAML-Accuracy" alt="14-XAML-Accuracy" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/14XAMLAccuracy.png" width="415" height="388" border="0" /></p>
<p>* <strong>Timestamp </strong>es el tiempo actual en el que el valor de la ubicación fue leído. Esto incluye información de la zona horaria así que tendrás que convertir los tiempos para almacenar todo en UTC.</p>
<p>* <strong>Altitude</strong> es la elevación del dispositivo, en metros. Este es probablemente encontrado en dispositivos con un barómetro (cubriremos los sensores más tarde en esta serie) pero es una pieza valiosa de información si la puedes tener.</p>
<p>*<strong>AltitudeAccuracy </strong>es como nuestro otro valor de precisión, excepto que es el simple margen de error para el valor de altitud. Es decir, que estás en + o – estos metros.</p>
<p>* <strong>Heading</strong> también será mostrado con el sensor adecuado, la brújula. Esto mide en grados relativos a nuestro norte verdadero.</p>
<p>* <strong>Speed</strong> puede ser técnicamente calculado al monitorear los valores de latitud/longitud cada determinado tiempo, pero ellos nos lo han hecho increíblemente fácil para nosotros. Es medido en metros/segundo pero es un valor opcional que el dispositivo GPS puede dar. Esto significa que no todos los dispositivos pueden regresar un valor.</p>
<p>El otro código, del ejemplo de arriba del que me gustaría hablar es acerca de la cosa async/await. Quizá hayas notado que ambos manejadores de eventos tienen async en el inicio, y que después tenemos algo como esto:</p>
<pre class="brush: csharp">await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =&gt; { });</pre>
<p>Dado que la adquisición de nuestra ubicación sucede en un hilo en segundo plano, necestiamos usar un Dispatcher para regresar a nuestro hilo primario para poder escribir nuestros valores en la pantalla. Sin este código tendremos un error en el momento que tratamos de manipular la capa de la UI dado que los hilos en segundo plano no tienen acceso a esto directamente. Aquí está como luce mi UI básica (no, no es ahí donde vivo pero podrías saberlo si checas esa ubicación):</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image23.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb23.png" width="500" height="292" border="0" /></a></p>
<p>Así que hemos obtenido nuesta información de ubicación pero aún está el manejador de eventos de StatusChanged que creamos antes. Esto no es algo a lo que generalmente le damos acceso a nuestro usuario es más como información administrativa para nosotros pero es un conjunto importante de información de cualquier manera. Puede tener seis diferentes valores.</p>
<p>* <strong>notInitialized</strong> es regresado cuando tu aplicación no ha solicitado permiso para acceder a la información de ubicación.</p>
<p>* <strong>disabled</strong> es el valor que obtendrás cuando el usuario rechace tu solicitud de acceder a su información de ubicación.</p>
<p>* <strong>notAvailable</strong> es regresado si el dispositivo del usuario no soporta la ubicación espacial.</p>
<p>* <strong>noData </strong>es regresado si el dispositivo del usuario soporta la ubicación pero no puede obtener ninguna. Esto podría pasar en un escenario donde el dispositivo no está conectado a Wi-Fi y está dentro de un edificio por ejemplo.</p>
<p>* <strong>initializing</strong> es el valor del estado que recibirás entre el momento en que el usuario autorice el acceso a su ubicación y el momento en que comiences a recibir esa información. En usos futuros de tu aplicación, este también se mandará cuando tu aplicación esté esperando a acceder a los datos de ubicación por primera vez.</p>
<p>* <strong>ready</strong> es la respuesta de oro y te permite saber que la información esta disponible para tu uso.</p>
<p>Así que el ejemplo que te he dado en este artículo te permite reconocer cada vez que la ubicación de tu usuario cambie y todas las veces que eso suceda. Si solo necesitas obtener esta información UNA SOLA VEZ, digamos, para etiquetar una imagen que el usuario acaba de tomar, solo haces una solicitud al objeto de tipo Geolocator sin tener que crear todos los eventos que he marcado arriba. En el método de abajo, podemos hacer una llamada simple al método ObtenerPosicionUnaVez en su lugar.</p>
<pre class="brush: csharp">async private void ObtenerUbicacionUnaVez()
{
Geoposition posicion = await ubicacion.GetGeopositionAsync().AsTask();

LatitudeValue.Text = posicion.Coordinate.Latitude.ToString();
LongitudeValue.Text = posicion.Coordinate.Longitude.ToString();
AccuracyValue.Text = posicion.Coordinate.Accuracy.ToString();
}</pre>
<p>En este caso, solo necesitamos un valor simple, una ocasión. No crees un ciclo que haga esta llamada una y otra vez, es mucho más lento y ahorrarás toneladas de recursos de la máquina siguiendo el ejemplo anterior que registró nuestros manejadores de eventos.</p>
<h2>Usar el simulador para para fingir ubicación</h2>
<p>Si estás usando una PC de escritorio tradicional, quizá ya has notado que tu máquina no hace un gran trabajo determinando tu posición. La ubicación por red puede ser decente pero es poco probable que tus coordenadas latitud y longitud sean muy acertadas. Entra al simulador. Puedes ajustar una ubicación específica en el simulador sin tener que estar en un avión. Para hacer esto solo abre los ajustes de ubicación del simulador.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/14XAMLSimulatorOption.png"><img title="14-XAML-SimulatorOption" alt="14-XAML-SimulatorOption" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/14XAMLSimulatorOption_thumb.png" width="500" height="319" border="0" /></a></p>
<p>En este punto, puedes darle los valores de latitud, longitud, altitud y valores de precisión:</p>
<p><img title="14-XAML-SimulatorSettings" alt="14-XAML-SimulatorSettings" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/14XAMLSimulatorSettings.png" width="400" height="214" border="0" /></p>
<p>¡Ahí tienes! Puedes ahora escribir una aplicación que pueda determinar donde se encuentra el dispositivo del usuario y mientras la estás construyendo, puedes pretender que estás en cualquier parte de la tierra. No es una forma mala de viajar ¡al menos los costos son menores!</p>
<h2>En resumen</h2>
<p>Hoy hablamos acerca de los datos de geo localización y que tan importante puede ser para cualquier aplicación en el mercado. Vimos como seguir la ruta de un usuario, también obtener su ubicación una sola vez para aplicaciones que solo necesitan la ubicación específica “justo ahora” pero no todo el tiempo.</p>
<p>Si quisieras descargar una aplicación de ejemplo que incluya todo el código de este artículo, da clic en el ícono de abajo.</p>
<p>&nbsp;</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia14.zip" target="_blank"><img class="alignnone" alt="" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadXAML5.png" width="150" height="150" /></a></p>
<p>&nbsp;</p>
<p>Mañana, vamos a ver el teclado en pantalla, InputScopes y cajas de texto. ¡Nos vemos entonces!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-14-geo-localizacin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 d&#237;as de Windows 8 &#124; D&#237;a 13: Navegaci&#243;n</title>
		<link>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-13-navegacin/</link>
		<comments>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-13-navegacin/#comments</comments>
		<pubDate>Thu, 28 Mar 2013 19:15:04 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3998</guid>
		<description><![CDATA[Este artículo es una traducción de “Día 13: Navegación” de Jeff Blakenburg. Puedes encontrar aquí la versión original en inglés. Hemos pasado los últimos días enfocándonos mucho en actualizar el sistema con información para permitirle saber al usuario que es lo que sucede. De hecho, en los primeros 12 días esta serie hemos pasado muy poco tiempo hablando de una de las actividades más comunes que vamos a encontrar en el desarrollo de Windows 8: La navegación entre páginas con XAML. Hoy corregiremos lo que estaba incorrecto metiéndonos en este tema. Hay tres escenarios específicos que quiero asegurarme de cubrir en este artículo: * El simple acto de navegación de la página A a la página B. ¿Qué sucede entonces y qué información está disponible para nosotros? * Pasar información de una página a otra. Esto no solo incluye cadenas y enteros, podemos pasar también objetos enteros entre páginas. * Guardar el caché de las páginas. Cuando un usuario presiona el botón de retroceso, ellos no quieren descubrir que toda la información que ingresaron ha desaparecido. Discutiremos esto más adelante. Navegar entre páginas en Windows 8 XAML Parece que cada vez que encontramos una nueva plataforma hay también una nueva [...]]]></description>
				<content:encoded><![CDATA[<p>Este artículo es una traducción de “Día 13: Navegación” de Jeff Blakenburg. Puedes encontrar <a href="http://www.jeffblankenburg.com/2012/11/13/31-days-of-windows-8-day-13-navigation" target="_blank">aquí</a> la versión original en inglés.</p>
<p>Hemos pasado los últimos días enfocándonos mucho en actualizar el sistema con información para permitirle saber al usuario que es lo que sucede. De hecho, en los primeros 12 días esta serie hemos pasado muy poco tiempo hablando de una de las actividades más comunes que vamos a encontrar en el desarrollo de Windows 8: La navegación entre páginas con XAML.</p>
<p>Hoy corregiremos lo que estaba incorrecto metiéndonos en este tema. Hay tres escenarios específicos que quiero asegurarme de cubrir en este artículo:</p>
<p>* El simple acto de navegación de la página A a la página B. ¿Qué sucede entonces y qué información está disponible para nosotros?</p>
<p>* Pasar información de una página a otra. Esto no solo incluye cadenas y enteros, podemos pasar también objetos enteros entre páginas.</p>
<p>* Guardar el caché de las páginas. Cuando un usuario presiona el botón de retroceso, ellos no quieren descubrir que toda la información que ingresaron ha desaparecido. Discutiremos esto más adelante.</p>
<h2>Navegar entre páginas en Windows 8 XAML</h2>
<p>Parece que cada vez que encontramos una nueva plataforma hay también una nueva manera de navegar entre páginas en una aplicación XAML. Windows 8 no es diferente en ese aspecto. Este proceso es fácilmente explicado guiándote al momento de crear algunas páginas, así que iniciemos ahí.</p>
<p>Crea una nueva aplicación en blanco y después agrega dos nuevas páginas básicas en ella. Para este ejemplo puedes llamarlas PaginaA.xaml y PaginaB.xaml</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image19.png"><img style="background-image: none; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; margin-right: auto; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb19.png" width="500" height="306" border="0" /></a></p>
<p>En cada una de esas páginas, hay una línea de XAML que ajusta el el AppName.</p>
<pre class="brush: xml">&lt;page .Resources&gt;
&lt;x:string x:Key=&quot;AppName&quot;&gt;My Application&lt;/x:string&gt;
&lt;/page&gt;</pre>
<p>Normalmente, moveríamos esto a nuesto archivo App.xaml y lo haríamos aplicar a todas las páginas de nuestra aplicación. Por hoy, vamos a usar este mecanismo simple para darle a cara una de nuestras páginas un nombre distinto que podamos ver cuando esté cargada. Ajusta el valor de PaginaA a “Página A” y el de PaginaB a “´Página B” de modo que tus páginas luzcan así:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image20.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb20.png" width="240" height="144" border="0" /></a> <a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image21.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb21.png" width="240" height="145" border="0" /></a></p>
<p>Para hacer el ejemplo sencillo de usar, también vamos a hacer un cambio rápido a nuestro archivo App.xaml.cs. Cerca del fondo del método OnLaunched() está algo de código que luce como lo siguiente.</p>
<pre class="brush: csharp">if (rootFrame.Content == null)
{
if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
{
throw new Exception(&quot;Failed to create initial page&quot;);
}
}</pre>
<p>Vamos a querer cambiar la referencia de typeof(MainPage) a typeof(PaginaA). Como se muestra a continuación:</p>
<pre class="brush: csharp">if (rootFrame.Content == null)
{
if (!rootFrame.Navigate(typeof(PaginaA), args.Arguments))
{
throw new Exception(&quot;Failed to create initial page&quot;);
}
}</pre>
<p>Esto causará que tu aplicacion arranque con PaginaA como página inicial. Hasta este punto, ejecuta tu proyecto. Verás que comienza la <a href="http://blogs.ligasilverlight.com/2013/01/31-das-de-windows-8-da-3-la-pantalla-de-inicio-splash-screen/" target="_blank">pantalla de inicio</a> y después PaginaA aparecerá. Deberías notar que incluso aún cuando en Visual Studio apareceuna flecha cerca del título de nuestra página esta enlazada a si es posible o no la página de “ir hacia atrás” con la propiedad Frame.GoBack. Hablaremos de ello más adelante.</p>
<p>Por ahora, vamos a la navegación. Has visto técnicamente como hacerlo desde App.xaml.cs pero luce un poco diferente cuando vayas de página en página. He agregado un control de tipo botón a mi archivo PaginaA.xaml.cs justo antes de la sección VisualStateManager. El XAML luce así:</p>
<pre class="brush: xml">&lt;button x:Name=&quot;btnPagina&quot;
Grid.Row =&quot;1&quot;
Content=&quot;A página B&quot;
Width=&quot;150&quot;
Height=&quot;150&quot;
Click=&quot;btnPagina_Click&quot;&gt;&lt;/button&gt;</pre>
<p>&nbsp;</p>
<p>En el manejador de eventos para el botón, escribimos nuestra primera sentencia de navegación (¡finalmente!).</p>
<pre class="brush: csharp">private void btnPagina_Click(object sender, RoutedEventArgs e)
{
Frame.Navigate(typeof(PaginaB));
}</pre>
<p>Como puedes ver es un proceso muy sencillo. Lo vamos a hacer más complicado ahora al agregar a un nuevo botón a la página B. Esto podría parecer una tarea repetitiva pero notarás que podemos meternos en problemas rápidamente (deberías ejecutar tu proyecto en este momento para asegurar que de hecho navegas a tu página B). Agrega el mismo botón y su manejador de eventos en Pagina B pero obviamente apuntando a página A en esta ocasión. Ahora tienes un botón en cada página que apunta a la otra. Si tu solo usas estos botones para hacer tu navegación vas a terminar creando una GRAN fila de navegación de retroceso y esto hará al concepto del botón de regreso completamente irrelevante. Lo que necesitamos hacer en este caso es implementar un manejador de eventos para GoHome que es parte del objeto LayoutAwarePage que estamos usando. Para ilustrar efectivamente este ejemplo, agrega un segundo botón en tu PaginaB.xaml con un nuevo manejador de eventos. En este manejador de eventos, sin embargo no vamos a navegar a una página. En su lugar vamos a crear un evento GoHome y llamarlo. Lucirá así:</p>
<pre class="brush: csharp">private void btnPagina_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
if (this.Frame != null)
{
while (this.Frame.CanGoBack) Frame.GoBack();
}
}

private void btnHome_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
base.GoHome(sender, e);
}</pre>
<p>Como puedes ver, nuestro método GoHome ejecuta un ciclo rápido intentando “Volver” hasta que ya no pueda más. En este punto, terminamos en la cima de la fila de navegación en nuestra página inicial. Es un buen truco, pero creo que se ilustrará mejor con un video breve.</p>
<div class="wlWriterEditableSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:1a85de48-13ad-4839-85ce-ac37fbcc078e" style="float: none; margin: 0px; display: inline; padding: 0px;">
<div><object width="448" height="252" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/G0iEwr2SwA4?hl=en&amp;hd=1" /><embed width="448" height="252" type="application/x-shockwave-flash" src="http://www.youtube.com/v/G0iEwr2SwA4?hl=en&amp;hd=1" /></object></div>
</div>
<h2>Pasar información entra páginas en Windows 8</h2>
<p>Después, vamos a querer pasar información entre páginas. Quizá un objeto, quizá una cadena, información en todo caso. Mientras se retira, nuestro método Frame.Navigate() es sobrecargado para poder aceptar un parámetro de información. Para este ejemplo he agregado un TextBox y un Button a mi página A pero ahora voy a asumir que sabes como hacer esto. La parte importante de esto es donde tengo un manejador de eventos que envíe el valor del texto del TextBox y lo envíe como parte del método Navigate(). Como lo siguiente:</p>
<pre class="brush: csharp">private void btnPagina_Click(object sender, RoutedEventArgs e)
{
Frame.Navigate(typeof(PaginaB), txtMensaje.Text);
}</pre>
<p>Por otro lado, en la páginaB necesitamos atrapar esta información y desplegarla. De nuevo, he agregado un TextBlock en mi código de ejemplo (el cual podrás descartar al final del artículo) pero la pieza importante es mi nuevo manejador para el evento OnNavigatedTo() y atrapar la información cuando llegue.</p>
<pre class="brush: csharp">protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);

string mensaje = e.Parameter as string;

if (!string.IsNullOrWhiteSpace(mensaje))
{
txtRecibido.Text = mensaje;
}
else
{
txtRecibido.Text = &quot;Necesitas recibir una cadena. Regresa e ingresa un valor&quot;;
}
}</pre>
<p>En la página B podremos recoger el valor obtenido de <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.navigation.navigationeventargs.parameter.aspx" target="_blank">NavigationEventArgs.Parameter</a>, donde lo estoy convirtiendo a valor de cadena. Necesitarás convertir tu valor a un tipo apropiado antes de que puedas utilizarlo, pero una vez que lo hayas hecho, podrás ¡pasar datos de una página a otra!</p>
<p>Además, mencionéantes que puedes pasar objetos completos, usando este mecanismo también. ¿Recuerdas nuestra clase Elemento del <a href="http://blogs.ligasilverlight.com/2013/01/31-das-de-windows-8-da-4-controles-nuevos/" target="_blank">Día 4</a>? Voy a pasar un Elemento personalizado de la página A a la página B en el siguiente ejemplo. Aquí está el código de la página A:</p>
<pre class="brush: csharp">private void btnGalio_Click(object sender, RoutedEventArgs e)
{
Frame.Navigate(typeof(PaginaB), new Elemento
{
NumeroAtomico = 31,
PesoAtomico = 69.72,
Categoria = &quot;Otros metales&quot;,
Nombre = &quot;Galio&quot;,
Simbolo = &quot;Ga&quot;,
Estado = &quot;Sólido&quot;
});
}</pre>
<p>Puedes ver claramente que estamos pasando un elemento completamente nuevo a la página B. Aquí está la manera de atrapar esta información en la página B.</p>
<pre class="brush: csharp">protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);

Elemento elementoRecibido = e.Parameter as Elemento;
txtRecibido.Text = elementoRecibido.Categoria;
}</pre>
<h2>Creando caché de páginas para un mejor rendimiento del botón de regreso</h2>
<p>La última cosa que queremos manejar relacionado a la navegación es el caché de las páginas. Para este ejemplo final estoy usando nuestra aplicación de ejemplo en el estado donde estaba pasando valores de cadenas hacia atrás y adelante. Quizá hayas notado, si construiste tu propia aplicación de ejemplo que si escribes algo en el texto de la página A y envías la información a la página B, cuando presiones el botón de volver y regreses a la página A, esta no recordará lo que has escrito en la caja. Este es un patrón de experiencia de usuario increíblemente frustrante que puedes ver en la web todo el tiempo.</p>
<p>Podemos evitar esto con una simple línea en el constructor de las páginas a las que queremos crearles caché.</p>
<pre class="brush: csharp">public PaginaA()
{
this.InitializeComponent();
NavigationCacheMode = NavigationCacheMode.Enabled;
}</pre>
<p>Después de que ajustes el NavigationCacheMode, encontrarás que los valores del TextBox (y todo lo demás en tu página) permanecerán al momento de regresar. Dale una prueba, es una mucho mejor experiencia y no requiere que nosotros llenemos y rellenemos la forma cada vez que el usuario regrese a la página.</p>
<h2>En resumen</h2>
<p>Esta es una vista extensa de la nevegación en aplicaciones XAML para Windows 8. Cubrimos la manera de movernos entre páginas, pasar datos entre páginas y atrapar estas páginas para cuando el usuario de clic en los botones de volver.</p>
<p>Si quisieras descargar el código completo de este artículo, puedes dar clic sobre el ícono de abajo. (Nota por favor que el botón del Galio está deshabilitado, necesitarás eliminar los comentarios para el manejador de eventos para este botón, también como el código en la página B para hacerlo funcionar. La página B solo puede aceptar un tipo de parámetro a la vez y está actualmente listo para la cadena).</p>
<p>&nbsp;</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia13.zip" target="_blank"><img class="alignnone" alt="" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadXAML5.png" width="150" height="150" /></a></p>
<p>&nbsp;</p>
<p>Mañana, vamos a iniciar nuestra conversación determinando la ubicación actual de un usuario usando GeoLocalización, incluyendo las reglas que van al usar esta tecnología. ¡Nos vemos entonces!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-13-navegacin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 d&#237;as de Windows 8 &#124; D&#237;a 12:  Tareas en segundo plano</title>
		<link>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-12-tareas-en-segundo-plano/</link>
		<comments>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-12-tareas-en-segundo-plano/#comments</comments>
		<pubDate>Thu, 21 Mar 2013 07:28:30 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3986</guid>
		<description><![CDATA[Este artículo es una traducción de “Día 12: Tareas en segundo plano” de Jeff Blakenburg. Puedes encontrar aquí la versión original en inglés. Hoy, vamos a hablar acerca de las tareas en segundo plano. La vía pequeña para describir una tarea en segundo plano es esta: Una tarea en segundo plano es el código que corre cuando tu aplicación no. Piensa en estos escenarios. * Audio vía streaming continuo, incluso cuando el usuario esta ejecutando otra aplicación. * Actualizar el mosaico de la aplicación para reflejar nuevos datos. * Mostrar una notificación toast para hacerle saber al usuario que nueva información ha sucedido. * Actualizar la pantalla de bloqueo, incluso cuando el dispositivo esta bloqueado. Obtener una tarea en segundo plano establecida y registrada con el sistema es un proceso de dos pasos. Primero, tienes que registrar la tarea en segundo plano en tu archivo package.appxmanifest. Una vez que ha sido hecho, aún necesitas registrar los eventos de la tarea con el sistema del código de tu aplicación y después están los eventos adicionales para controlar lo que sucede cuando la tarea en segundo plano finaliza. Cubriremos estos escenarios en este artículo. Crear una clase de tarea en segundo plano [...]]]></description>
				<content:encoded><![CDATA[<p>Este artículo es una traducción de “Día 12: Tareas en segundo plano” de Jeff Blakenburg. <a href="http://www.jeffblankenburg.com/2012/11/12/31-days-of-windows-8-day-12-background-tasks" target="_blank">Puedes encontrar aquí la versión original en inglés.</a></p>
<p>Hoy, vamos a hablar acerca de las tareas en segundo plano. La vía pequeña para describir una tarea en segundo plano es esta:</p>
<p><em>Una tarea en segundo plano es el código que corre cuando tu aplicación no.</em></p>
<p>Piensa en estos escenarios.</p>
<p>* Audio vía streaming continuo, incluso cuando el usuario esta ejecutando otra aplicación.</p>
<p>* Actualizar el mosaico de la aplicación para reflejar nuevos datos.</p>
<p>* Mostrar una notificación toast para hacerle saber al usuario que nueva información ha sucedido.</p>
<p>* Actualizar la pantalla de bloqueo, incluso cuando el dispositivo esta bloqueado.</p>
<p>Obtener una tarea en segundo plano establecida y registrada con el sistema es un proceso de dos pasos. Primero, tienes que registrar la tarea en segundo plano en tu archivo package.appxmanifest. Una vez que ha sido hecho, aún necesitas registrar los eventos de la tarea con el sistema del código de tu aplicación y después están los eventos adicionales para controlar lo que sucede cuando la tarea en segundo plano finaliza. Cubriremos estos escenarios en este artículo.</p>
<h2>Crear una clase de tarea en segundo plano</h2>
<p>Mi primer paso es siempre crear un proyecto secundario que contendrá mis tareas en segundo plano. No es requerido pero es una buena separación visual de tu código.</p>
<p><img title="12-XAML-AddProject" alt="12-XAML-AddProject" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/12XAMLAddProject.png" width="272" height="163" border="0" /></p>
<p>Cuando creas un proyecto, elige “Windows Runtime Component” como el tipo de proyecto.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/12XAMLWindowsRuntimeComponent.png"><img title="12-XAML-WindowsRuntimeComponent" alt="12-XAML-WindowsRuntimeComponent" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/12XAMLWindowsRuntimeComponent_thumb.png" width="500" height="325" border="0" /></a></p>
<p>Por defecto, tendrás una clase llamada Class1.cs. Puedes renombrarla si gustas o solo eliminarla y agregar una nueva clase al proyecto. En cualquier caso, vas a crear una nueva clase llamada ActualizarMosaico.cs</p>
<p>Ahora, las tareas en segundo plano deben implementar una interfaz muy específica: IBackgroundTask. Esta solo implementa un método, Run(), este método es el que llamaremos cuando nuestra aplicación inicie la tarea en segundo plano. Solo para que inicies, aquí está como luce mi código C# después de implementar la interfaz.</p>
<pre class="brush: csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.ApplicationModel.Background;

namespace AgenteSegundoPlano
{
class ActualizarMosaico : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
//Agregaremos código aquí después
}
}
}</pre>
<p>He agregado un comentario donde nuestro código residirá, pero por ahora es un buen inicio.</p>
<h2>Configurando tu archivo Package.appxmanifest</h2>
<p>El siguiente paso en este proceso es declara que usaremos las tareas en segundo plano en esta aplicación. Hacemos esto en el archivo package.appxmanifest en la sección de Declaraciones como se muestra en la imagen de abajo.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image18.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb18.png" width="450" height="338" border="0" /></a></p>
<p>Como puedes ver , he agregado una declaración para la tarea en segundo plano (necesitarás una nueva de estas por cada tarea en segundo plano que quieras agregar en tu proyecto), y ajustar el punto de entrada a AgenteSegundoPlano.ActualizarMosaico, nuestra nueva clase. Después, necesitamos registrar esta tarea in nuestra aplicación actual de modo que Windows 8 lo sepa ejecutar en los momentos adecuados.</p>
<h2>Registrando tu tarea en segundo plano</h2>
<p>Vamos a tomar un par de pasos en este código de nuestro MainPage.xaml.cs, iniciando con checar si nuestra tarea en segundo plano ha sido ya registrada en el sistema. Yo generalmente hago esto tan pronto como la página se cargue en mi método OnNavigatedTo(). He creado un nuevo método llamado VerificarRegistroTarea() que verifique este estado por mí y ajuste un valor booleano global en la página. Tu puedes de hecho hacer esto en tu archivo App.xaml.cs también pero para nuestros propósitos simples, esta ubicación bastará.</p>
<pre class="brush: csharp">bool estaTareaRegistrada = false;

protected override void OnNavigatedTo(NavigationEventArgs e)
{
VerificarRegistroTarea();
}

private void VerificarRegistroTarea()
{
foreach (var tarea in BackgroundTaskRegistration.AllTasks)
{
if (tarea.Value.Name == &quot;ActualizarMosaico&quot;)
{
estaTareaRegistrada = true;
break;
}
}
if (!estaTareaRegistrada)
{
RegistrarTarea(&quot;ActualizarMosaico&quot;, &quot;AgenteSegundoPlano.ActualizarMosaico&quot;);
}
}</pre>
<p>Como puedes ver, estamos recorriendo a través de la colección BackgroundTaskRegistration.AllTasks porque podríamos tener muchas tareas en segundo plano ejecutándose bajo de nuestra aplicación y en este caso yo solo estoy interesado en uno: ActualizarMosaico. Puedes también ver que he hecho una llamada a RegistrarTarea() si la tarea no está aún registrada.</p>
<p>Depende de ti como manejar este caso pero en mi aplicación yo quiero asegurarme de que mi tarea en segundo plano esté siempre registrada y si ha sido eliminada del registro por alguna razón, quiero agregarla de nuevo. Así es como luce mi método RegistrarTarea().</p>
<pre class="brush: csharp">private void RegistrarTarea(string nombre, string puntoEntrada)
{
BackgroundTaskBuilder tareaSegundoPlano = new BackgroundTaskBuilder();
tareaSegundoPlano.Name = nombre;
tareaSegundoPlano.TaskEntryPoint = puntoEntrada;
tareaSegundoPlano.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));
BackgroundTaskRegistration tarea = tareaSegundoPlano.Register();
}</pre>
<p>Puedes ver que estoy pasando el valor del nombre y punto de entrada pero puedes de hecho establecer estos valores dependiendo de tu situación. Dado que esta aplicación podría tener múltiples tareas en segundo plano, he decidido hacer esta construcción un poco más simple y pasarlos en algunos parámetros.</p>
<p>En nuestro método de registro, creamos un objeto de tipo BackgroundTaskBuilder(), ajusta el nombre y punto de entrada y después determina un SystemTrigger que ejecutará nuestra tarea en segundo plano. En este caso, he elegido el lanzador fácilmente probable InternetAvailable. Para probarlo, estaremos cortando el acceso a internet en nuestra máquina.</p>
<p>Si en algún momento necesitas eliminar el registro de la tarea en segundo plano es muy sencillo. Aquí está el método de ejemplo EliminarRegistroTarea() que puedes usar para eliminar la tarea.</p>
<pre class="brush: csharp">private void EliminarRegistroTarea(string nombre)
{
foreach (var tarea in BackgroundTaskRegistration.AllTasks)
{
if (tarea.Value.Name == nombre)
{
tarea.Value.Unregister(true);
}
}
}</pre>
<p>En ese ejemplo revisamos a través de las tareas que están registradas de nuevo y si encontramos alguna de ellas con el nombre que estamos buscando llamamos al método Unregister() confirmándolo con el parámetro en verdadero.</p>
<p>Así que hemos trabajado con la forma de registrar o eliminar el registro de nuestra tarea en segundo plano y ahora hemos especificado que nuestra aplicación debería lanzar nuestra tarea en segundo plano cuando la zona horaria de nuestra máquina cambie. Vamos a escribir algo de código en nuestra clase AgenteSegundoPlano y después darle una prueba a esto.</p>
<h2>Haciendo que tu tarea en segundo plano HAGA algo</h2>
<p>Antes, hemos creado un archivo llamado ActualizarMosaico.cs en nuestro nuevo proyecto de tipo Windows Runtime Component y dejamos un espacio en blanco para agregar código en el método Run() que debe ser implementado como parte de la interfaz IBackgroundTask. Aquí está como debería lucir el archivo con el código para actualizar nuestro mosaico.</p>
<pre class="brush: csharp">public void Run(IBackgroundTaskInstance taskInstance)
{
XmlDocument datosTile = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquareText04);
XmlNodeList datosTexto = datosTile.GetElementsByTagName(&quot;text&quot;);
datosTexto[0].InnerText = &quot;Actualizar mosaicos es absolutamente genial. #31daysofwin8&quot;;
TileNotification notificacion = new TileNotification(datosTile);
notificacion.ExpirationTime = DateTimeOffset.UtcNow.AddSeconds(30);
TileUpdateManager.CreateTileUpdaterForApplication().Update(notificacion);
}</pre>
<p>Obviamente, podríamos escribir una tarea en segundo plano similar para implementar el envío de una notificación toast, actualizar la pantalla de bloqueo u otras llamadas a servicios web por ejemplo.</p>
<h2>En resumen</h2>
<p>Hay una cosa más a notar acerca de las tareas en segundo plano: son mucho más complejas de depurar que el código en tu aplicación. De hecho Microsoft ha escrito un artículo entero acerca de como depurar exactamente las tareas en segundo plano. Yo recomiendo ampliamente leerlo. Ellos han creado también un tutorial de inicio rápido llamado Crear y Registrar una tarea en segundo plano.</p>
<p>Si quisieras descargar el código de ejemplo funcional de este artículo, da clic sobre la imagen de abajo.</p>
<p>&nbsp;</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia12.zip" target="_blank"><img class="alignnone" alt="" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadXAML5.png" width="150" height="150" /></a></p>
<p>&nbsp;</p>
<p>Mañana, vamos a doblar por completo de nuevo y comenzaremos a hablar acerca de navegación. Específicamente como navegar entre páginas en una aplicación XAML y pasar parámetros como información entre páginas como parte del proceso. ¡Nos vemos entonces!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-12-tareas-en-segundo-plano/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 d&#237;as de Windows 8 &#124; D&#237;a 11 Notificaciones en la pantalla de bloqueo</title>
		<link>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-11-notificaciones-en-la-pantalla-de-bloqueo/</link>
		<comments>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-11-notificaciones-en-la-pantalla-de-bloqueo/#comments</comments>
		<pubDate>Wed, 20 Mar 2013 06:13:27 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3981</guid>
		<description><![CDATA[Este artículo es una traducción de “Día 11: Notificaciones en la pantalla de bloqueo” de Jeff Blakenburg. Puedes encontrar aquí la versión original en inglés. Hoy cubrimos la última parte de notificaciones en Windows 8: La pantalla de bloqueo. Si estás corriendo Windows 8 en tu máquina es probable que te hayas familiarizado con la pantalla de bloqueo. Te muestra cuantos correos has recibido, mensajes de Facebook, el reloj y tu el estado de tu conectividad. Aquí está mi pantalla de bloqueo: Si, esta es una foto de mi pantalla. Pasé 30 minutos esta mañana encontrando una solución para tomar una captura de mi pantalla de bloqueo sin éxito (si, lo se, pude haber creado una MV o una remota en máquina pero no cuento con nada de eso en este momento). De cualquier manera, puedes ver que solo estoy escribiendo este artículo a unos días antes de la fecha de publicación y tengo una reunión en 30 minutos. Nosotros, como desarrolladores, tenemos la habilidad de agregar nuestros íconos a esta pantalla también pero es peligroso hacerlo así nada más. Toma esto. Es la guía de Microsoft de las mejores maneras de utilizar el área de notificaciones de la pantalla [...]]]></description>
				<content:encoded><![CDATA[<p>Este artículo es una traducción de “Día 11: Notificaciones en la pantalla de bloqueo” de Jeff Blakenburg. <a href="http://www.jeffblankenburg.com/2012/11/11/31-days-of-windows-8-day-11-lock-screen-apps" target="_blank">Puedes encontrar aquí la versión original en inglés.</a></p>
<p>Hoy cubrimos la última parte de notificaciones en Windows 8: La pantalla de bloqueo. Si estás corriendo Windows 8 en tu máquina es probable que te hayas familiarizado con la pantalla de bloqueo. Te muestra cuantos correos has recibido, mensajes de Facebook, el reloj y tu el estado de tu conectividad. Aquí está mi pantalla de bloqueo:</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLLockScreen1.jpg"><img title="11-XAML-LockScreen" alt="11-XAML-LockScreen" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLLockScreen_thumb1.jpg" width="500" height="282" border="0" /></a></p>
<p>Si, esta es una foto de mi pantalla. Pasé 30 minutos esta mañana encontrando una solución para tomar una captura de mi pantalla de bloqueo sin éxito (si, lo se, pude haber creado una MV o una remota en máquina pero no cuento con nada de eso en este momento). De cualquier manera, puedes ver que solo estoy escribiendo este artículo a unos días antes de la fecha de publicación y tengo una reunión en 30 minutos.</p>
<p>Nosotros, como desarrolladores, tenemos la habilidad de agregar nuestros íconos a esta pantalla también pero es peligroso hacerlo así nada más. Toma esto. <a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh465403.aspx#user_experience_guidelines_for_tiles_and_badges_on_the_lock_screen" target="_blank">Es la guía de Microsoft de las mejores maneras de utilizar el área de notificaciones de la pantalla de bloqueo.</a></p>
<h2>Configurando nuestro manifiesto</h2>
<p>Primero, necesitamos ajustar nuestro package.appxmanifest para permitir las notificaciones de la pantalla de bloqueo.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLApplicationUITab.png"><img title="11-XAML-ApplicationUITab" alt="11-XAML-ApplicationUITab" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLApplicationUITab_thumb.png" width="502" height="471" border="0" /></a></p>
<p>Cuando haces esto, notarás que se aparecen pequeños símbolos rojos con una X. Cuando las notificaciones están habilitadas somos requeridos para tener un logo “badge” y dado que elegimos la opción que incluye actualizaciones por mosaicos también somos requeridos  para dar una imagen de logo ancha. Aquí esta la tabla de UI de la aplicación con esos archivos agregados.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLApplicationUITab2.png"><img title="11-XAML-ApplicationUITab2" alt="11-XAML-ApplicationUITab2" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLApplicationUITab2_thumb.png" width="502" height="501" border="0" /></a></p>
<p>Notarás que ahora tienes una X roja lo cual nos hace saber que “Si las notificaciones de pantalla están habilitadas, debes especificar una o más declaraciones de tareas en segundo plano del tipo ‘Timer’, ‘Control channel’ o ‘Push notifications’”.</p>
<p>Lo que significa es que las aplicaciones con la pantalla de bloqueo esperan ser actualizadas a paritr de un agente en segundo plano. Vamos a movernos a nuestra tablas de Declarations y agregar las tareas en segundo plano como esto:</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLDeclarations.png"><img title="11-XAML-Declarations" alt="11-XAML-Declarations" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLDeclarations_thumb.png" width="502" height="334" border="0" /></a></p>
<p>En mi aplicación de ejemplo, sin embargo, vamos a crear una tarea en segundo plano. Voy a cubrir esto extensivamente mañana. En su lugar vamos a enfocarnos específicamente en los procesos y el código que nos permite actualizar nuestra información en la pantalla de bloqueo.</p>
<h2>Pidiendo permiso</h2>
<p>Antes de siquiera comenzar a pensar acerca de escribir contenido en la pantalla de bloqueo del usuario necesitas pedir permiso de tu usuario. Ahora, no TIENES que preguntar pero sin preguntar por permiso el camino a la pantalla de bloqueo es complicado y casi cayendo en lo peligroso. Aquí esta lo que quiere decir.</p>
<p>Tu solo tienes UNA y solo UNA oportunidad para pedir por la autorización del usuario para estar en su pantalla de bloqueo. Si preguntas una vez y ellos dicen “No permitir”, no serás capaz de preguntar de nuevo. Aquí está como parece cuando preguntas.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLBackgroundRequest.png"><img title="11-XAML-BackgroundRequest" alt="11-XAML-BackgroundRequest" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLBackgroundRequest_thumb.png" width="500" height="128" border="0" /></a></p>
<p>Y así es como lo haces:</p>
<pre class="brush: csharp">BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();</pre>
<p>Si nunca preguntas, la única manera de llegar a la pantalla de bloqueo es para que el usuario abara sus configuraciones de PC y explícitamente te agregue, como esto (ignora por favor la horrible imagen de mi cara sin afeitar a menos de que quieras <a href="http://us.movember.com/mospace/4853377" target="_blank">soportar mi campaña Movember</a>):</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLLockScreenSettings.png"><img title="11-XAML-LockScreenSettings" alt="11-XAML-LockScreenSettings" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLLockScreenSettings_thumb.png" width="502" height="314" border="0" /></a></p>
<p>Los usuarios pueden seleccionar hasta 7 aplicaciones para msotrarse en su pantalla de bloqueo. Queremos asegurarnos que somos una de ellas. Así que porque nuestro estado puede cambiar el ánimo del usuario deberíamos ser responsables antes de mandar actualizaciones a su pantalla de bloqueo.</p>
<h2>Asegurándonos de que tienes permisos</h2>
<p>Este no es un paso requerido. Puedes tener tu aplicación o tarea en segundo plano (como lo veremos mañana) enviando continuamente actualizaciones incluso si no tienes permiso. Dicho esto, tus actualizaciones tampoco serán vistas por el usuario. Sin permiso, tus actualizaciones desaparecerán en el limbo.</p>
<p>Aquí es como verificamos si el usuario nos ha dado permisos para actualizar la pantalla de bloqueo.</p>
<pre class="brush: csharp">BackgroundAccessStatus status = BackgroundExecutionManager.GetAccessStatus();

if ((status == BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity) ||
(status == BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity))
{
//ENVÍA AQUÍ TU ACTUALIZACIÓN.
}</pre>
<p>Así que hasta este punto, hemos cubierto la posibilidad de  permisos del usuario  y después asegurarte de que el permiso ha sido garantizado. El siguiente paso es de hecho enviar la actualización.</p>
<h2>Actualizando la pantalla de bloqueo</h2>
<p>Enviar una actualización lucirá muy familiar si has leído los dos artículos previos (<a href="http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-9-live-tiles/" target="_blank">Día 9: Mosaicos</a>, <a href="http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-10-notificaciones/" target="_blank">Día 10: Notificaciones</a>). Como en esos ejemplos previos, vamos a utilizar una plantilla que consiste en XML (en este caso, es increíblemente simple):</p>
<pre class="brush: csharp">&lt;badge value=&quot;badge_value&quot;&gt;&lt;/badge&gt;</pre>
<p>Después, necesitamos especificar el valor que queremos mostrar. Tenemos muchas opciones en este escenario. No solo podemos usar cualquier número del 1 – 99, sino también tener un número de íconos para elegir. La mejor parte es que la plantilla es lo suficientemente inteligente para reconocer la diferencia así que la única cosa que cambiará en nuestro código es  el valor actual que pasamos. Aquí está el código para hacer la actualización del elemento.</p>
<pre class="brush: csharp"> private void btnPantallaBloqueo_Click(object sender, RoutedEventArgs e)
{
BackgroundAccessStatus status = BackgroundExecutionManager.GetAccessStatus();

if ((status == BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity) ||
(status == BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity))
{
XmlDocument datosElemento = BadgeUpdateManager.GetTemplateContent(BadgeTemplateType.BadgeNumber);
XmlNodeList xmlElemento = datosElemento.GetElementsByTagName(&quot;badge&quot;);
((XmlElement)xmlElemento[0]).SetAttribute(&quot;value&quot;, &quot;Playing&quot;);

BadgeNotification badge = new BadgeNotification(datosElemento);
BadgeUpdateManager.CreateBadgeUpdaterForApplication().Update(badge);
}
}</pre>
<p>Puedes ver que en el método SetAttribute() paso el valor de 31. Esto resulta en el elemento que se muestra en la pantalla de bloqueo que luce como lo siguiente.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/WP_20121106_004.jpg"><img title="WP_20121106_004" alt="WP_20121106_004" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/WP_20121106_004_thumb.jpg" width="500" height="282" border="0" /></a></p>
<p>Si pudiéramos elegir usar uno de los íconos, aquí esta una lista de los que está disponible, cortesía <a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh779719.aspx" target="_blank">de la página de vistas de íconos de la página de MSDN</a>.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLGlyphList.png"><img title="11-XAML-GlyphList" alt="11-XAML-GlyphList" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLGlyphList_thumb.png" width="502" height="430" border="0" /></a></p>
<p>Para especificar un glifo, necesitamos cambiar el valor en el método SetAttribute() como a continuación se muestra.</p>
<p>[sourcecode lang="csharp"]((XmlElement)badgeXML[0]).SetAttribute(&#8220;value&#8221;, &#8220;Playing&#8221;);[/sourcode]</p>
<p>Eso es todo acerca de las aplicaciones con pantalla de bloqueo. Espero que hayas aprendido algo hoy. Espera hay una cosa más. Olvidé mencionar que cuando elegimos “Badge and Tile Text” en nuestro manifiesto appxmanifest, habilitamos los elementos que creamos para aparecer en nuestro mosaico también (Esta es la razón por la que WideTile.png fue requerido). Aquí es cuando el mosaico luce igual que el mismo elemento de “Reproducir” aplicado.</p>
<p><img title="11-XAML-WideLogo" alt="11-XAML-WideLogo" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/11XAMLWideLogo.jpg" width="248" height="120" border="0" /></p>
<h2>En resumen</h2>
<p>Podemos actualizar la información de nuestra pantalla de bloqueo de nuestra aplicación en cualquier momento, pero la parte truculenta es obtener el permiso del usuario. Una vez que lo has tenido, actualizar la información es bastante simple como pudimos ver en este artículo.</p>
<p>Si quisieras descargar una aplicación funcional que utiliza el código de este artículo da clic en la imagen.</p>
<p>&nbsp;</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia11.zip" target="_blank"><img class="alignnone" alt="" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadXAML5.png" width="150" height="150" /></a></p>
<p>&nbsp;</p>
<p>Mañana, vamos a unir estos tres días de hablar acerca de tareas en segundo plano. Te mostramos como actualizar mosaicos, notificaciones e información de la pantalla de bloqueo de una tarea en segundo plano. ¡Nos vemos!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-11-notificaciones-en-la-pantalla-de-bloqueo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 d&#237;as de Windows 8 &#124; D&#237;a 10: Notificaciones</title>
		<link>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-10-notificaciones/</link>
		<comments>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-10-notificaciones/#comments</comments>
		<pubDate>Mon, 18 Mar 2013 03:23:20 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3976</guid>
		<description><![CDATA[Este artículo es una traducción de “Día 10: Notificaciones” de Jeff Blakenburg. Puedes encontrar aquí la versión original en inglés. Ayer, pasamos algo de tiempo viendo los mosaicos y como dejar que los usuarios supieran acerca de notificaciones importantes desde tu aplicación. Hoy vamos a ver un tipo diferente de notificación para el usuario: Notificaciones toast. Si no has trabajado con Notificaciones en el pasado, la palabra quizá suene un poco ridícula para ti. La palabra “toast” en este caso viene de la imagen de una pieza de pan tostado emergiendo de nuestro tostador. Nuestras notificaciones aparecen de una manera similar, mostrándose frente a nuestro usuario para hacerle saber que algo interesante ha sucedido. La diferencia primaria entre las notificaciones y los mosaicos es que los mensajes de notificaciones aparecerán en la pantalla del usuario sin importar que aplicación se esté ejecutando en el momento. Los mosaicos tienen que ser vistos por el usuario en su pantalla de inicio. Los mensajes de notificaciones gritan “NECESITAS SABER ESTO ¡AHORA MISMO!” donde los mosaicos son significativamente más pasivos. Asegurate de considerar esto cuando envíes mensajes. Si comienzas a mandar muchos mensajes sin sentido tus usuarios deshabilitarán la función de enviar notificaciones o [...]]]></description>
				<content:encoded><![CDATA[<p>Este artículo es una traducción de “Día 10: Notificaciones” de Jeff Blakenburg. <a href="http://www.jeffblankenburg.com/2012/11/10/31-days-of-windows-8-day-10-toast-notifications" target="_blank">Puedes encontrar aquí la versión original en inglés.</a></p>
<p>Ayer, pasamos algo de tiempo viendo los mosaicos y como dejar que los usuarios supieran acerca de notificaciones importantes desde tu aplicación. Hoy vamos a ver un tipo diferente de notificación para el usuario: Notificaciones toast.</p>
<p>Si no has trabajado con Notificaciones en el pasado, la palabra quizá suene un poco ridícula para ti. La palabra “toast” en este caso viene de la imagen de una pieza de pan tostado emergiendo de nuestro tostador. Nuestras notificaciones aparecen de una manera similar, mostrándose frente a nuestro usuario para hacerle saber que algo interesante ha sucedido.</p>
<p>La diferencia primaria entre las notificaciones y los mosaicos es que los mensajes de notificaciones aparecerán en la pantalla del usuario sin importar que aplicación se esté ejecutando en el momento. Los mosaicos tienen que ser vistos por el usuario en su pantalla de inicio.</p>
<p>Los mensajes de notificaciones gritan “NECESITAS SABER ESTO ¡AHORA MISMO!” donde los mosaicos son significativamente más pasivos. Asegurate de considerar esto cuando envíes mensajes. Si comienzas a mandar muchos mensajes sin sentido tus usuarios deshabilitarán la función de enviar notificaciones o peor aún desinstalarán tu aplicación. Asegurate de tener un tiempo para leer <a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh465391.aspx" target="_blank">la guía de Microsoft acerca de notificaciones</a> antes de comenzar a meterte aún más en esto.</p>
<p>Para referencia, aquí hay algunos ejemplos de notificaciones.</p>
<p><img title="ToastText01 example" alt="ToastText01 example" src="http://i.msdn.microsoft.com/dynimg/IC601602.png" width="420" height="98" /></p>
<p><img title="ToastImageAndText01 example" alt="ToastImageAndText01 example" src="http://i.msdn.microsoft.com/dynimg/IC601606.png" width="420" height="98" /></p>
<p>Así como los mosaicos activos, hay un catálogo entero de tipos de notificaciones que puedes usar pero iremos a ello en un momento.</p>
<h2>Habilitando las notificaciones en tu aplicación</h2>
<p>Nuestro primer paso a la grandeza con las notificaciones es de hecho habilitarlas en el manifiesto de la aplicación. Abre tu archivo manifiesto y ve a la tabla de “Application UI”, selecciona “Si” desde la lista en la opción “Toast capable”.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image17.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb17.png" width="500" height="300" border="0" /></a></p>
<p>Será muy tentador en lo que recorres este artículo crear un archivo “Bagde” y subirlo a tu aplicación, pero para este tutorial no lo hagas. Aquí está el porqué:</p>
<p>Si subes un archivo de este tipo deberás habilitar las notificaciones de pantalla bloqueada. Sin embargo si estás son habilitadas debes contar con una tarea de segundo plano. No estamos cubriendo las tareas en segundo plano  por dos días más y las actualizaciones de pantalla bloqueada son mañana. Solo se paciente.</p>
<p>Hoy nos enfocaremos en notificar al usuario vía mensajes. Vamos a hacerlo</p>
<p>Lanzar una notificación desde tu aplicación</p>
<p>Ayer, en el día 9, si lo leíste, entonces lanzar una notificación te será increíblemente familiar. Aquí está el código que necesitas para lograrlo.</p>
<pre class="brush: csharp">ToastTemplateType tipoNotificacion = ToastTemplateType.ToastImageAndText02;
XmlDocument xmlToast = ToastNotificationManager.GetTemplateContent(tipoNotificacion);
XmlNodeList textoToast = xmlToast.GetElementsByTagName(&quot;text&quot;);
XmlNodeList imagenesToast = xmlToast.GetElementsByTagName(&quot;image&quot;);
textoToast[0].InnerText = &quot;Gato curioso&quot;;
textoToast[1].InnerText = &quot;Este gatos parece que esta queriendo comer tu cara.&quot;;
((XmlElement)imagenesToast[0]).SetAttribute(&quot;src&quot;, &quot;ms-appx:///Assets/10-XAML-CatImageSmall.png&quot;);
((XmlElement)imagenesToast[0]).SetAttribute(&quot;alt&quot;, &quot;Cara de gato espantado&quot;);

ToastNotification toast = new ToastNotification(xmlToast);
ToastNotificationManager.CreateToastNotifier().Show(toast);</pre>
<p>Como lo hicimos con los mosaicos lo hacemos con las notificaciones. La primera línea selecciona nuestra plantilla. Después agarramos el XML para esa plantilla y lo almacenamos en xmlToast. Aquí está como luce la plantilla de ese XML.</p>
<pre class="brush: xml">&lt;toast&gt;
&lt;visual&gt;
&lt;binding template=&quot;ToastImageAndText02&quot;&gt;
&lt;image id=&quot;1&quot; src=&quot;image1&quot; alt=&quot;image1&quot;&gt;&lt;/image&gt;
&lt;text id=&quot;1&quot;&gt;headlineText&lt;/text&gt;
&lt;text id=&quot;2&quot;&gt;bodyText&lt;/text&gt;
&lt;/binding&gt;
&lt;/visual&gt;
&lt;/toast&gt;</pre>
<p>Como puedes ver, tenemos dos propiedades de texto y una propiedad de imagen. Los siguientes pasos en nuestro código de ejemplo de arriba fueron asignar valores a esas propiedades. Para la imagen notarás que he agregado una línea adicional esta ocasión haciendo referencia al atributo “alt”. Si has hecho algo de desarrollo web antes probablemente ya conoces que es, pero es una pieza importante para historia de la accesibilidad en Windows 8. Te da la representación en texto de una imagen, para aquellos usuarios que son incapaces de ver su pantalla.</p>
<p>Finalmente creamos un nuevo objeto de tipo ToastNotification y lo mostramos con el método Show(). Esta es la simple historia acerca de crear notificaciones en Windows 8. Y así es como lucirá en mi máquina:</p>
<p><img title="10-XAML-CatToast" alt="10-XAML-CatToast" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/10XAMLCatToast.png" width="450" height="105" border="0" /></p>
<p>&nbsp;</p>
<p>Pero espera ¡Aún hay más! Si creaste un proyecto  y lanzaste un mensaje de notificación quizá hayas notado que hay un sonido que lo acompaña. Este es el sonido por defecto de la notificación, pero tienes opciones. Hay algunas otras cosas que de hecho puedes hacer con las notificaciones.</p>
<h2>Ajustar el audio para una notificación (¡y mas!)</h2>
<p>Todo lo relacionado a crear una notifcacion permanece igual, pero podemos agregar algunos nodos adicionales a nuestro XML para seleccionar un sonido diferente, ajustar la duración del mensaje e incluso determinar la página a mostrar cuando la notificación sea presionada (¡con parámetros de consulta también!).</p>
<p>Primero, a pesar de nuestro audio tengo algunas malas noticias. No puedes usar tu propio archivo de audio. Se que esperabas deleitar a tu usuario con el sonido de un pan expulsado de la tostadora pero simplemente no es posible. En lugar de ello puedes seleccionar de una lista de nueve archivos de audio, cuatro de los cuales son sonidos cíclicos que pueden ser usados como tonos de llamada o alarmas. <a href="http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh761492.aspx" target="_blank">Puedes ver la lista de archivos de audio y descriptores disponibles para las notificaciones aquí.</a></p>
<p>Para ajustar el audio primero necesitamos modificar el XML que hemos estado creando. Por defecto ninguna de las plantillas de las notificaciones cuentan con un nodo de audio determinado así que necesitamos crear una. Lo primero en lo que necesitamos enfocarnos es en el nodo &lt;toast&gt; de nuestra plantilla y después podemos establecer nuestras opciones. En el código de ejemplo de abajo he incluido la misma notificación de antes pero con algunos comentarios explicando las líneas nuevas para las características opcionales.</p>
<pre class="brush: csharp">private void btnOpcionesNotificaciones_Click(object sender, RoutedEventArgs e)
{
ToastTemplateType tipoNotificacion = ToastTemplateType.ToastImageAndText02;
XmlDocument xmlToast = ToastNotificationManager.GetTemplateContent(tipoNotificacion);
XmlNodeList TextoToast = xmlToast.GetElementsByTagName(&quot;text&quot;);
XmlNodeList imagenesToast = xmlToast.GetElementsByTagName(&quot;image&quot;);
TextoToast[0].InnerText = &quot;Gato curioso&quot;;
TextoToast[1].InnerText = &quot;Este gatos parece que esta queriendo comer tu cara.&quot;;
((XmlElement)imagenesToast[0]).SetAttribute(&quot;src&quot;, &quot;ms-appx:///Assets/10-XAML-CatImageSmall.png&quot;);
((XmlElement)imagenesToast[0]).SetAttribute(&quot;alt&quot;, &quot;Scary Cat Face&quot;);

//Este es el código de opciones lo cual es todo lo opcional basado en tus necesidades
IXmlNode nodoToast = xmlToast.SelectSingleNode(&quot;/toast&quot;);

((XmlElement)nodoToast).SetAttribute(&quot;duration&quot;, &quot;long&quot;);

XmlElement nodoAudio = xmlToast.CreateElement(&quot;audio&quot;);
nodoAudio.SetAttribute(&quot;src&quot;, &quot;ms-winsoundevent:Notification.Looping.Alarm&quot;);

//Debe ser usado cuando un audio cíclico ha sido seleccionado
nodoAudio.SetAttribute(&quot;loop&quot;, &quot;true&quot;);
nodoToast.AppendChild(nodoAudio);

//Puedes colocar cualquier texto que te guste en la propiedad
//opcional de lanzamiento, pero al presionar una notificación el mensaje te deberá llevar
//a algo contextualmente relevante.
((XmlElement)nodoToast).SetAttribute(&quot;launch&quot;, &quot;&lt;cat state=&#039;angry&#039;&gt;&lt;facebite state=&#039;true&#039;&gt;&lt;/facebite&gt;&lt;/cat&gt;&quot;);

ToastNotification toast = new ToastNotification(xmlToast);
ToastNotificationManager.CreateToastNotifier().Show(toast);
}</pre>
<p>Es importante recordar que todas estas características son opcionales, puedes verificarlo por su ausencia en nuestro primer ejemplo. Aquí hay un par de cosas para recordar acerca de estas opciones:</p>
<p>Los mensajes de notificación  de larga duración están hechos para cosas como llamadas VOIP y alarmas de reloj, no para las notificaciones de correo. Utilízalas poco.</p>
<p>Todas las opciones de audio cíclicas que están disponibles solo trabajarán si has ajustado la duración a Long.</p>
<p>Las opciones de audio cíclico solo trabajarán si también ajustaste el atributo “loop” a verdadero.</p>
<p>Fallar en algunas de estas reglas resultará en que se reproducirá el audio Notification.Default en su lugar.</p>
<p>En adición, quizá quieres tener SILENCIO para su notificación en lugar de cualquiera de las opciones de audio. Puedes hacerlo, en ese caso especificarás un audioNode pero ajusta un nuevo atributo, silent a true como en lo siguiente.</p>
<p>audioNode.SetAttribute(&#8220;silent&#8221;, &#8220;true&#8221;);</p>
<p>Esto resultará en silencio, pero fuera de ello será una notificación normal para el usuario. Finalmente, hay un atributo “launch”. Dentro de este podemos pasar cualquier cadena de texto que quisieramos y será pasada de regreso a nosotros como parámetro para la página cuando la notifiación sea presionada por el usuario. Esta información nos deberá permitir determinar a que página debemos apuntar que información la llenará. No pongas nada en el parámetro “launch” que no necesite hacer este viaje.</p>
<h2>En resumen</h2>
<p>Eso es todo acerca de las notificaciones en Windows 8. Muy similares a los mosaicos, los mensajes son una gran manera de obtener la atención inmediata del usuario sin importar que es lo que están haciendo. Algunos de ustedes quizá se estén preguntando como hacer esas actualizaciones desde una tarea en segundo plano y solo te pido paciencia. Qusimos asegurarnos de darte una base sólida de cada uno de estos tipos de notificación antes de meternos por completo a los agentes en segundo plano. Solo estás a dos días de este tema, lo prometo.</p>
<p>Si quieres descargar el código fuente completo de este artículo da clic sobre la siguiente imagen:</p>
<p>&nbsp;</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia10.zip" target="_blank"><img class="alignnone" alt="" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadXAML5.png" width="150" height="150" /></a></p>
<p>&nbsp;</p>
<p>Mañana,cubriremos nuestro último tema en el mundo de las notificaciones. La pantalla de bloqueo. ¡Hasta entonces!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-10-notificaciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 d&#237;as de Windows 8 &#124; D&#237;a 9: Live Tiles</title>
		<link>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-9-live-tiles/</link>
		<comments>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-9-live-tiles/#comments</comments>
		<pubDate>Mon, 18 Mar 2013 02:40:00 +0000</pubDate>
		<dc:creator>Jorge Castro</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3912</guid>
		<description><![CDATA[Este artículo es una traducción del Día #9 de la serie 31 días de Windows 8 de Jeff Blakenburg. Hoy cubriremos un tema muy importante: Live Tiles. Como hemos mencionado en artículos anteriores, tu tile es una de las partes más importantes del éxito de tu aplicación, y es una de las más ignoradas. Tus tiles representan tu relación con tu usuario. Ellos cariñosamente lo pinean en su pantalla de inicio, lo acomodan con apps similares, incluso deciden si quieren que sea grande o pequeña. Tu trabajo es hacer el tile tan responsivo y acorde a sus necesidades como sea posible. Esto lo hacemos enviándole actualizaciones útiles al tile. Aquí hay algunos ejemplos de algunas de mis apps favoritas: Como mencione antes, Soy un gran fan de Jetpack Joyride, pero su tile es excelente también. Aquí hay un tour de los cinco estados por los que rota, recordándome mi score más alto, así como los logros que aún no he completado. Estas actualizaciones me han llevado de regreso al juego más de una ocasión. La aplicación del clima, por otra parte, nunca se voltea. Pero también no necesito nada más que lo que un tile estático me puede proveer cuando [...]]]></description>
				<content:encoded><![CDATA[<p>Este artículo es una traducción del Día #9 de la serie <a href="http://31daysofwindows8.com/">31 días de Windows 8</a> de Jeff Blakenburg.</p>
<p>Hoy cubriremos un tema muy importante: Live Tiles. Como hemos mencionado en artículos anteriores, tu tile es una de las partes más importantes del éxito de tu aplicación, y es una de las más ignoradas.</p>
<p>Tus tiles representan tu relación con tu usuario. Ellos cariñosamente lo pinean en su pantalla de inicio, lo acomodan con apps similares, incluso deciden si quieren que sea grande o pequeña. Tu trabajo es hacer el tile tan responsivo y acorde a sus necesidades como sea posible. Esto lo hacemos enviándole actualizaciones útiles al tile. Aquí hay algunos ejemplos de algunas de mis apps favoritas:</p>
<p>Como mencione antes, Soy un gran fan de Jetpack Joyride, pero su tile es excelente también. Aquí hay un tour de los cinco estados por los que rota, recordándome mi score más alto, así como los logros que aún no he completado. Estas actualizaciones me han llevado de regreso al juego más de una ocasión.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image001.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image001" alt="clip_image001" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image001_thumb.png" width="244" height="120" border="0" /></a><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image002.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image002" alt="clip_image002" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image002_thumb.png" width="244" height="120" border="0" /></a></p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image003.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image003" alt="clip_image003" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image003_thumb.png" width="244" height="120" border="0" /></a><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image004.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image004" alt="clip_image004" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image004_thumb.png" width="244" height="120" border="0" /></a></p>
<p>La aplicación del clima, por otra parte, nunca se voltea. Pero también no necesito nada más que lo que un tile estático me puede proveer cuando se trata del clima. Obtengo la temperatura más alta, más baja y la actual. El pronóstico del clima esta siempre a un click de distancia.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image005.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image005" alt="clip_image005" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image005_thumb.png" width="244" height="120" border="0" /></a></p>
<p>Finalmente, respecto a tiles, creo que la app de Fotos es mi favorita. No se aun que tan frecuentemente actualiza el set de rotación de fotos, o incluso que librerías usa, pero parece siempre tener alguna gran vieja foto en el tile que me hace recordar ese evento. Aquí hay algunos pantallazos:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image006.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image006" alt="clip_image006" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image006_thumb.png" width="244" height="120" border="0" /></a><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image007.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image007" alt="clip_image007" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image007_thumb.png" width="244" height="120" border="0" /></a></p>
<p>Tengo miles y miles de viejas fotos almacenadas en mi librería de fotos (si, están respaldadas en línea, gracias), y obtener un vistazo del pasado diariamente es grandioso.</p>
<h3>Las Reglas</h3>
<p>Cuando trabajamos en nuestras apps, he descubierto que hay algunas reglas que necesitamos tener en cuenta:</p>
<p>· Primero, lee, y después re-lee los <a href="http://msdn.microsoft.com/library/windows/apps/hh465403">Directrices para Live Tiles</a>. Son extensos, pero interesantes.</p>
<p>· Debes SIEMPRE tener un tile pequeño. Los tiles anchos son deseables, pero DEBES tener un tile pequeño.</p>
<p>Los tiles pequeños no son siempre tan interesantes como sus hermanos mayores, pero aun así pueden transmitir información interesante. Aquí están los tiles pequeños de las tres apps que mostre antes:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image008.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image008" alt="clip_image008" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image008_thumb.png" width="124" height="124" border="0" /></a><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image009.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image009" alt="clip_image009" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image009_thumb.png" width="124" height="124" border="0" /></a><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image010.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image010" alt="clip_image010" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image010_thumb.png" width="124" height="124" border="0" /></a></p>
<p>Probablemente solo por restricciones de espacio, el tile de Jetpack no se actualiza. Sin embargo las apps de Clima y Fotos me dan todos los mismos datos que obtengo en los tiles largos, solo que en un paquete más pequeño.</p>
<p>Mientras estaba investigando las diferentes formas en las que un tile puede verse, me preocupe de que éste artículo fuera a ser SUPER largo después de mostrar un ejemplo de cada plantilla de tile posible. Pero resulta, sin embargo, que Microsoft ha provisto una página grandiosa que muestra cada plantilla de tile, todas las 45 de ellas. Asegurate de revisarla. Definitivamente te ayudará a elegir la plantilla de tile que es apropiada para ti, y provee el marcado XML que necesitaras también.</p>
<p><a href="http://msdn.microsoft.com/library/windows/apps/hh761491">DEBES LEER: Catálogo de plantillas de icono</a></p>
<p>Entonces, ¿Cómo hacer a nuestro tile bailar? Vamos a empezar.</p>
<h3>Actualizando el Tile Estático Por Defecto</h3>
<p>Por defecto, obtienes un icono en tu app que se ve como esto:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image011.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image011" alt="clip_image011" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image011_thumb.png" width="154" height="154" border="0" /></a></p>
<p>(Agregue un fondo ligeramente gris a este para que puedas verlo con fondo blanco, el tuyo se verá más transparente.) Si solo quieres un tile estático que use su propia imagen de 150 x 150, puedes hacerlo de dos formas:</p>
<p>· Remplaza la imagen que actualmente reside en Assets/Logo.png en tu proyecto.</p>
<p>· Actualiza tu archivo Package.appxmanifest, y cambia el valor de Logo a una imagen diferente en tu proyecto, así:</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/9XAMLDefaultLogoLocationUpdate1.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image012" alt="clip_image012" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image012.png" width="244" height="191" border="0" /></a></p>
<p>OK, suficiente de la parte aburrida. ¡Escribamos algo de código!</p>
<h3>Enviando una Notificación a un Live Tile Pequeño</h3>
<p>Vamos a empezar con enviar una notificación de tile pequeña primero, dado que los tiles largos serán un poco más complejos. Primero, como discutimos al principio, necesitas decidir que plantilla quieres usar del catálogo. (He creado una versión en PDF estática del documento para ti, ¡Así de importante será!)</p>
<p>En éste ejemplo, he elegido TileSquareText04, que se ve como esta plantilla:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image013.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image013" alt="clip_image013" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image013_thumb.png" width="154" height="154" border="0" /></a></p>
<p>Y es representado por este XML (sabría esto si abrieras la página del catálogo):</p>
<p>&lt;tile&gt;</p>
<p>&lt;visual&gt;</p>
<p>&lt;binding template=&#8221;TileSquareText04&#8243;&gt;</p>
<p>&lt;text id=&#8221;1&#8243;&gt;Text Field 1&lt;/text&gt;</p>
<p>&lt;/binding&gt;</p>
<p>&lt;/visual&gt;</p>
<p>&lt;/tile&gt;</p>
<p>Entonces ahora sólo necesitamos crear una nueva actualización de tile basado en ese XML, y la empujamos al TileUpdateManager. Así es como funciona para el TileSquareText04:</p><pre class="crayon-plain-tag">//Primero, agarramos la plantilla especifica que queremos usar.
XmlDocument tileData = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquareText04);
//Despu&eacute;s agarramos una referencia al nodo que queremos actualizar.
XmlNodeList textData = tileData.GetElementsByTagName(&quot;text&quot;);
//Despu&eacute;s asignamos el valor de ese nodo.textData[0].InnerText = &quot;31 Days of Windows 8&quot;;
//Despu&eacute;s creamos un objeto TileNotification con esa informaci&oacute;n.
TileNotification notification = new TileNotification(tileData);
//Opcionalmente podemos establecer una fecha de expiraci&oacute;n de la notificaci&oacute;n.
notification.ExpirationTime = DateTimeOffset.UtcNow.AddSeconds(30);
//Finalmente, empujamos la actualizaci&oacute;n hacia el tile.
TileUpdateManager.CreateTileUpdaterForApplication().Update(notification);</pre><p>Como puedes ver en los comentarios del código, es un proceso bastante simple. Notaras que usamos notación de arreglo para establecer el valor del texto de la plantilla del tile. Esto es porque podemos tener más de un nodo de cada tipo. Si usáramos TileSquareBlock en su lugar, se vería como sigue:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image014.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image014" alt="clip_image014" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image014_thumb.png" width="154" height="154" border="0" /></a></p>
<p>Tendríamos dos valores de texto que actualizar, que sería algo así:</p><pre class="crayon-plain-tag">textData[0].InnerText = &quot;31&quot;;
textData[1].InnerText = &quot;Days of Windows 8&quot;;</pre><p>Una nota final acerca de estas plantillas es que es común que tu archivo SmallLogo.png se mostrará en algunos de estos tiles también. Es una buena forma de extender tu marca, pero es algo también que hay que tener presente al estar trabajando en esto. Al usar la plantilla TileSquareBlock, aquí tienes como mi tile se ve al final:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image015.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image015" alt="clip_image015" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image015_thumb.png" width="124" height="124" border="0" /></a></p>
<p>Esta es otra razón más, como lo dije en Día #1, para que uses imágenes personalizadas para tu app mientras exploras el desarrollo de Windows 8. Sin esa imagen morada, tendría que estarme preguntando cual estaba siendo usada, o peor, no darme cuenta que si quiera estuviera disponible. Verás que hay varias propiedades que pueden ser editadas para tu tile en el archivo Package.appxmanifest de tu proyecto. No solo puedes cambiar la imagen de logo, sino también las propiedades del fono, el archivo de logo pequeño, y otros valores de texto y color.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/9XAMLManifestProperties.png"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image016" alt="clip_image016" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image016.png" width="244" height="102" border="0" /></a></p>
<p>Una pieza importante de esta sección es el menú desplegable “Show name” o “Mostrar nombre”.</p>
<p>Mencione esto brevemente antes, pero quiero asegurarme de que entiendes donde se establecen estos valores e imágenes. Adicionalmente, simplemente definiendo un archivo de Wide logo en el manifiesto, inmediatamente soportas el tamaño Large Tile. Tu aplicación ni siquiera ofrecerá el tamaño como una opción hasta que hayas especificado ese valor. Inténtalo tú mismo. Ahora vamos a ver como enviar actualizaciones a un Tile Largo.</p>
<h3>Enviando una Notificación a un Live Tile Largo</h3>
<p>Esta vez, vamos a elegir una plantilla de Tile Largo, pero también incluir una imagen, para que puedas ver la sintaxis para esto también.</p>
<p><b>Lección Importante: </b>Recuerda que el usuario está en control aquí. Si han decidido hacer tu tile largo o pequeño, no puedes controlarlo. Lo que si puedes controlar, sin embargo, es si quieres o no soportar “notificaciones” de ambos tamaños. Yo lo recomiendo, porque es una oportunidad de hacer que tu usuario ponga atención a tu app en su pantalla de Inicio.</p>
<p>Debido a esto, cuando enviamos actualizaciones, de hecho podemos crear dos. Una para el tile pequeño, y una para el largo. Entonces, a través de la magia de XML, vamos a juntarlos, y enviarlo como una sola notificación. Aquí está como se vería tu código:</p>
<p>//Crear el Tile Largo exactamente de la misma forma.</p>
<p>XmlDocument largeTileData = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWidePeekImage01);</p>
<p>XmlNodeList largeTextData = largeTileData.GetElementsByTagName(&#8220;text&#8221;);</p>
<p>XmlNodeList imageData = largeTileData.GetElementsByTagName(&#8220;image&#8221;);</p>
<p>largeTextData[0].InnerText = &#8220;Funny cat&#8221;;</p>
<p>largeTextData[1].InnerText = &#8220;This cat looks like it&#8217;s trying to eat your face.&#8221;;</p>
<p>((XmlElement)imageData[0]).SetAttribute(&#8220;src&#8221;, &#8220;ms-appx:///Assets/9-XAML-CatImage.png&#8221;);</p>
<p>//((XmlElement)imageData[0]).SetAttribute(&#8220;src&#8221;, &#8220;http://jeffblankenburg.com/downloads/9-XAML-CatImage.png&#8221;);</p>
<p>//Crear una notificación de Tile Pequeño también (no requerido, pero recomendado.)</p>
<p>XmlDocument smallTileData = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquarePeekImageAndText02);</p>
<p>XmlNodeList smallTileText = smallTileData.GetElementsByTagName(&#8220;text&#8221;);</p>
<p>XmlNodeList smallTileImage = smallTileData.GetElementsByTagName(&#8220;image&#8221;);</p>
<p>smallTileText[0].InnerText = &#8220;Funny cat&#8221;;</p>
<p>smallTileText[1].InnerText = &#8220;This cat looks like it&#8217;s trying to eat your face.&#8221;;</p>
<p>((XmlElement)smallTileImage[0]).SetAttribute(&#8220;src&#8221;, &#8220;ms-appx:///Assets/9-XAML-CatImageSmall.png&#8221;);</p>
<p>//Junta las dos actualizaciones en un nodo XML &lt;visual&gt;</p>
<p>IXmlNode newNode = largeTileData.ImportNode(smallTileData.GetElementsByTagName(&#8220;binding&#8221;).Item(0), true);</p>
<p>largeTileData.GetElementsByTagName(&#8220;visual&#8221;).Item(0).AppendChild(newNode);</p>
<p>//Crear las notificaciones de la misma forma.</p>
<p>TileNotification notification = new TileNotification(largeTileData);</p>
<p>notification.ExpirationTime = DateTimeOffset.UtcNow.AddSeconds(30);</p>
<p>//Empujar la actualización al tile.</p>
<p>TileUpdateManager.CreateTileUpdaterForApplication().Update(notification);</p>
<p>Lo deje ahí comentado, pero puedes ver que adicionalmente a empujar imágenes de tu proyecto local, también tienes la habilidad de usar imágenes que son hospedadas en la web. Toman mucho más tiempo en cargar, así que ten en mente eso cuando las uses.</p>
<p>Por ejemplo, puse la expiración de mi notificación a 30 segundos, y para el final de los 30 segundos, la notificación no había sucedido aun porque la imagen aún no ha llegado a mostrarse. Tu medida puede variar, pero usando imágenes locales, las notificaciones aparecen inmediatamente.</p>
<p>Aquí hay un video corto de esta actualización de Live Tile en acción en mi pantalla de Inicio:</p>
<p><a href="http://www.youtube.com/watch?feature=player_embedded&amp;v=EF1lvVbBeeQ">http://www.youtube.com/watch?feature=player_embedded&amp;v=EF1lvVbBeeQ</a></p>
<p>También, mencione que juntando dos archivos XML diferentes, una por cada plantilla. Aquí está la plantilla pequeña, para el TileSquarePeekImageAndText02:</p>
<p>&lt;tile&gt;</p>
<p>&lt;visual&gt;</p>
<p>&lt;binding template=&#8221;TileSquarePeekImageAndText02&#8243;&gt;</p>
<p>&lt;image id=&#8221;1&#8243; src=&#8221;image1&#8243; alt=&#8221;alt text&#8221;/&gt;</p>
<p>&lt;text id=&#8221;1&#8243;&gt;Text Header Field 1&lt;/text&gt;</p>
<p>&lt;text id=&#8221;2&#8243;&gt;Text Field 2&lt;/text&gt;</p>
<p>&lt;/binding&gt;</p>
<p>&lt;/visual&gt;</p>
<p>&lt;/tile&gt;</p>
<p>Y aquí el XML para el tile Largo:</p>
<p>&lt;tile&gt;</p>
<p>&lt;visual&gt;</p>
<p>&lt;binding template=&#8221;TileWidePeekImage01&#8243;&gt;</p>
<p>&lt;image id=&#8221;1&#8243; src=&#8221;image1.png&#8221; alt=&#8221;alt text&#8221;/&gt;</p>
<p>&lt;text id=&#8221;1&#8243;&gt;Text Header Field 1&lt;/text&gt;</p>
<p>&lt;text id=&#8221;2&#8243;&gt;Text Field 2&lt;/text&gt;</p>
<p>&lt;/binding&gt;</p>
<p>&lt;/visual&gt;</p>
<p>&lt;/tile&gt;</p>
<p>Cuando se juntan, se ve así:</p>
<p>&lt;tile&gt;</p>
<p>&lt;visual&gt;</p>
<p>&lt;binding template=&#8221;TileWidePeekImage01&#8243;&gt;</p>
<p>&lt;image id=&#8221;1&#8243; src=&#8221;image1.png&#8221; alt=&#8221;alt text&#8221;/&gt;</p>
<p>&lt;text id=&#8221;1&#8243;&gt;Text Header Field 1&lt;/text&gt;</p>
<p>&lt;text id=&#8221;2&#8243;&gt;Text Field 2&lt;/text&gt;</p>
<p>&lt;/binding&gt;</p>
<p>&lt;binding template=&#8221;TileSquarePeekImageAndText02&#8243;&gt;</p>
<p>&lt;image id=&#8221;1&#8243; src=&#8221;image1&#8243; alt=&#8221;alt text&#8221;/&gt;</p>
<p>&lt;text id=&#8221;1&#8243;&gt;Text Header Field 1&lt;/text&gt;</p>
<p>&lt;text id=&#8221;2&#8243;&gt;Text Field 2&lt;/text&gt;</p>
<p>&lt;/binding&gt;</p>
<p>&lt;/visual&gt;</p>
<p>&lt;/tile&gt;</p>
<p>Como puedes ver, terminamos con múltiples binding en un nodo &lt;visual&gt;. Para agregar notificaciones adicionales, pasarías por el mismo proceso, agregando aún más al mismo código.</p>
<h3>Eliminando Tus Notificaciones</h3>
<p>También habrá tiempos donde vas a querer borrar tus notificaciones. Tal vez nueva información está disponible, o algo cambio antes de que tus fechas de expiración caducaran, y necesitas iniciar de nuevo. Para hacer esto, es una simple línea de código:</p>
<p>TileUpdateManager.CreateTileUpdaterForApplication().Clear();</p>
<p>Entonces, hemos cubierto tiles largos y pequeños, incluso combinándolos, pero ¿Qué si quieres proveer a tu usuario con múltiples tiles?</p>
<h3>Tiles Secundarios</h3>
<p>Los tiles secundarios son una excelente forma de resaltar la información que tus usuarios quieren directamente en la pantalla de Inicio. Si eres una aplicación de clima, pueden anclar múltiples ciudades para una referencia rápida. Si eres la app de People, me permites anclar la gente que es importante para mí, así puedo ver fácilmente en que andan.</p>
<p>Originalmente pretendía escribir una sección entera aquí acerca de cómo anclar un Tile Secundario en la pantalla de inicio de tu usuario, pero Microsoft ha hecho un trabajo fenomenal al respecto. Chécalo aquí:</p>
<p><a href="http://msdn.microsoft.com/library/windows/apps/xaml/hh868249">Inicio rápido: Anclaje de Tiles Secundarios</a></p>
<p>No solo te guían a través de crear un Tile Secundario, pero también te dan todo el código para preguntar al usuario desde una AppBar, determinar si ya la ha anclado, e incluso eliminar el tile cuando ya no es necesario. Es un gran tutorial, y lo recomiendo altamente.</p>
<h3>Resumen</h3>
<p>Hemos cubierto una gran cantidad de contenido hoy relacionado a las actualizaciones de Live Tiles de Windows 8. Desde la creación hasta la actualización, puedes ver que es bastante simple de hacer en tu app. No me canso de recomendarte actualizar los tiles de tu app con información relevante tan frecuentemente como sea posible. Esto hará tu app mucho más atractiva al usuario.</p>
<p>Para descargar la solución completa de código ejemplo para este artículo, haz click en el icono de abajo:</p>
<p><a href="https://github.com/csell5/31DaysOfWindows8/tree/master/source/XAML/Day9-LiveTiles"><img style="margin: 0px;border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image017" alt="clip_image017" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image017.png" width="154" height="154" border="0" /></a></p>
<p>Mañana, vamos a ver el otro lado de las notificaciones: mensajes Toast. Hasta entonces, feliz codeo, ¡Y nos vemos mañana!</p>
<p><a href="http://bit.ly/win8devgear"><img style="border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image018" alt="clip_image018" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/02/clip_image018.png" width="244" height="33" border="0" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-9-live-tiles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 d&#237;as de Windows 8 &#124; D&#237;a 8: Informaci&#243;n local e itinerante</title>
		<link>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-8-informacin-local-e-itinerante/</link>
		<comments>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-8-informacin-local-e-itinerante/#comments</comments>
		<pubDate>Sun, 17 Mar 2013 18:02:09 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3969</guid>
		<description><![CDATA[Esta artículo es una traducción de “Día 8: Información local e itinerante” de Jeff Blakenburg. Puedes encontrar aquí la versión original en inglés. En muchos artículos de esta serie hemos mencionado que almacenar información no solo es increíblemente importante sino también es super sencillo hacerlo de ambas maneras localmente en el dispositivo así como de manera itinerante (roaming) entre múltiples dispositivos que un usuario puede utilizar. Microsoft nos ofrece algunas guías específicas de cuando utilizar almacenamiento por roaming y local, pero te daré un resumen rápido  aquí para que tengas la oportunidad de leerlo (porque ambos sabemos que no diste clic en este link). De nuevo, estas son guías, por lo que no estarás rechazado de la tienda por romper estas reglas pero también hay límites al tamaño de transferencia y velocidad. Al exceder estos límites evitará que tu aplicación permanezca enviando información por un largo periodo de tiempo. Hacer Usa roaming para preferencias y personalización. Cualquier opción en la que el usuario probablemente deba hacerla en cada máquina que utilice. Estas son configuraciones básicas como preferencias de color, actores favoritos o si publicar o no información vía Twitter. Usa roaming para permitir a los usuarios continuar con una tarea. [...]]]></description>
				<content:encoded><![CDATA[<p>Esta artículo es una traducción de “Día 8: Información local e itinerante” de Jeff Blakenburg. <a href="http://www.jeffblankenburg.com/2012/11/08/31-days-of-windows-8-day-8-local-and-roaming-data" target="_blank">Puedes encontrar aquí la versión original en inglés.</a></p>
<p>En muchos artículos de esta serie hemos mencionado que almacenar información no solo es increíblemente importante sino también es super sencillo hacerlo de ambas maneras localmente en el dispositivo así como de manera itinerante (roaming) entre múltiples dispositivos que un usuario puede utilizar.</p>
<p>Microsoft nos ofrece algunas guías específicas de cuando utilizar almacenamiento por roaming y local, pero te daré un resumen rápido  aquí para que tengas la oportunidad de leerlo (porque ambos sabemos que no diste clic en este link). De nuevo, estas son guías, por lo que no estarás rechazado de la tienda por romper estas reglas pero también hay límites al tamaño de transferencia y velocidad. Al exceder estos límites evitará que tu aplicación permanezca enviando información por un largo periodo de tiempo.</p>
<h2>Hacer</h2>
<p><strong>Usa roaming para preferencias y personalización.</strong> Cualquier opción en la que el usuario probablemente deba hacerla en cada máquina que utilice. Estas son configuraciones básicas como preferencias de color, actores favoritos o si publicar o no información vía Twitter.</p>
<p><strong>Usa roaming para permitir a los usuarios continuar con una tarea.</strong> Tener los favoritos de mi explorador siguendome o incluso mis más altos resultados de un videojuego es maravilloso. Permitirme continuar escribiendo ese correo (o post) que nunca terminé. Mucho mejor.</p>
<h2>No hacer</h2>
<p><strong>Usar roaming para información que es claramente solo local.</strong> Esto incluye cosas como rutas de archivos y cualquier otra información que solo tiene sentido en un dispositivo.</p>
<p><strong>No envíes grandes cantidades de información.</strong> Hay un límite el cual puedes determinar en código, esto limitará el tamaño de tu envío de datos. Es mejor solo enviar preferencias y poca información como lo mostraremos en este artículo.</p>
<p><strong>No uses roaming para sincronizaciones instantáneas o información que pueda cambiar rápidamente.</strong> Windows controla cuando y que tan seguido la información de tu aplicación será enviada, así que no debes contar con una sincronización instantánea. Crea un servicio web para ti mismo si necesitas este tipo de confiabilidad. También, no actualices la información de roaming constantemente. Por ejemplo, no necesitas almacenar de esta manera la ubicación de tu usuario en todo momento, en su lugar actualiza cada minuto o algo así. Aún tendrás la posibilidad de dar una experiencia buena sin destruir tu transferencia.</p>
<p>Una última cosa para recordar: La forma en la que tu información es enviada entre dispositivos es administra por la cuenta de usuario de Microsoft. Si ellos ingresan en dos máquinas con las mismas credenciales e instalan la misma aplicación en dos lugares ENTONCES las configuraciones de roaming y archivos viajarán. Hasta entonces, nada pasará.</p>
<p>Ahora que ya te he espantado en nunca usar esto, vamos a ver como se hace. Hay dos tipos de información que puede ser almacenada y nosotros manejaremos cada una de ellas localmente y vía roaming. Primero ajustemos la configuración seguida por archivos.</p>
<h2>Ajustes locales y de roaming</h2>
<p>Cuando escuchas la palabra “ajustes” en el desarrollo de Windows 8 (o incluso en Windows Phone), lo que te viene a la mente es “información simple y pequeña” y lo que realmente estamos diciendo es almacenar pares de nombres y valores.</p>
<p>Buenos ejemplos de esto son las preferencias del usuario. Quizá almacenaste el nombre del usuario (un valor de tipo cadena) de modo que podrías utilizarlo en algo como un juego. Quizá ellos decidieron inhabilitar las notificaciones (un valor booleano) de tu aplicación. Los ajustes son también una de las maneras más fáciles de almacenar información y me he encontrado a mi mismo en más de una ocasión almacenando un gran número de ajustes en mis aplicaciones. Dado que estos valores son invisibles y viven en un espacio de almacenamiento invisible, he cambiado un conjunto de métodos juntos que crearán, después leerán y por último eliminarán los valores de ajustes, ambos, locales y de roaming. Verás que es muy sencillo de usar.</p>
<pre class="brush: csharp">ApplicationDataContainer settingsLocal;
ApplicationDataContainer settingsRoaming;
string currentBook;
int currentPage;

public MainPage()
{
this.InitializeComponent();

settingsLocal = ApplicationData.Current.LocalSettings;
settingsRoaming = ApplicationData.Current.RoamingSettings;

AddSettings();
}

ApplicationDataContainer ajustesLocales;
ApplicationDataContainer ajustesRoaming;
string libroActual;
int paginaActual;

public MainPage()
{
this.InitializeComponent();

ajustesLocales = ApplicationData.Current.LocalSettings;
ajustesRoaming = ApplicationData.Current.RoamingSettings;

AgregarConfiguracion();
}

private void AgregarConfiguracion()
{
ajustesLocales.Values[&quot;libroActual&quot;] = &quot;Secreto 1910&quot;;
ajustesLocales.Values[&quot;paginaActual&quot;] = 33;

ajustesRoaming.Values[&quot;libroActual&quot;] = &quot;Secreto 1910&quot;;
ajustesRoaming.Values[&quot;paginaActual&quot;] = 33;

LeerConfiguracion();
}

private void LeerConfiguracion()
{
libroActual = (string)ajustesLocales.Values[&quot;libroActual&quot;];
paginaActual = (int)ajustesRoaming.Values[&quot;paginaActual&quot;];

BorrarConfiguracion();
}

private void BorrarConfiguracion()
{
ajustesLocales.Values.Remove(&quot;libroActual&quot;);
ajustesLocales.Values.Remove(&quot;paginaActual&quot;);

ajustesRoaming.Values.Remove(&quot;libroActual&quot;);
ajustesRoaming.Values.Remove(&quot;paginaActual&quot;);
}</pre>
<p>En este proyecto de ejemplo puedes establecer puntos de interrupción en cada método y después usar Visual Studio para inspeccionar nuestros valores de configuración en la tabla “Locals”.</p>
<p>Aquí esta como luce mi información después de que el método AgregarConfiguracion() se ha ejecutado.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image13.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb13.png" width="450" height="165" border="0" /></a></p>
<p>Ahora, he leído la información de los ajustes y los he almacenado en valores en mi página.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image14.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb14.png" width="450" height="197" border="0" /></a></p>
<p>Finalmente, después de que mi método para borrar los ajustes se ha ejecutado.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image15.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb15.png" width="450" height="221" border="0" /></a></p>
<p>Mientras estás creando tus aplicaciones, es importante recordar que toda esta información, tanto ajustes como archivos, se encuentran dentro de una caja de arena de tu aplicación. Lo que significa es que cuando tu aplicación se desinstale, todos estos valores se irán con ella. Esto también significa que estás creando una aplicación que utiliza estos valores y quieres comenzar con una experiencia de usuario <a href="http://en.wikipedia.org/wiki/Greenfield_project" target="_blank">greenfield</a>, quizá quieres desinstalar la aplicación antes de probarlo para evitar cualquier valor legado que haya sido guardado anteriormente.</p>
<p>Además de salvar estos pares de valor/nombre quizá quiere categorizarlos un poco. Podemos crear categorías de ajustes, lo cual hará que agregar y remover grupos de ajustes una tarea muy simple por hacer. Esto puede también obviamente ser hecho localmente y por roaming. Aquí esta una vista de crear una categoría y agregar un ajuste a ello.</p>
<pre class="brush: csharp">settingsLocal.CreateContainer(&quot;mediaSettings&quot;, ApplicationDataCreateDisposition.Always);
settingsLocal.Containers[&quot;mediaSettings&quot;].Values[&quot;Volume&quot;] = 11;</pre>
<p>Hasta aquí hemos llegado con la revisión profunda de los ajustes, vamos a movernos ahora a los archivos.</p>
<h2>Archivos locales y vía roaming</h2>
<p>Los archivos operan en una forma muy similar a los ajustes, excepto que estamos leyendo y escribiendo los valores al disco duro y demostraré eso en este ejemplo también. He colocado un conjunto idéntico de métodos a los que usamos en la sección de ajustes; un método AgregarArchivo(), LeerArchivo() y EliminarArchivo(). Aquí está un vistazo al código.</p>
<pre class="brush: csharp">StorageFolder folderLocal;
StorageFolder folderRoaming;
string nombreArchivo = &quot;tacotext.txt&quot;;
string contenidoArchivo = &quot;taco&quot;;

public MainPage()
{
this.InitializeComponent();

folderLocal = ApplicationData.Current.LocalFolder;
folderRoaming = ApplicationData.Current.RoamingFolder;

AgregarArchivo();
}

private async void AgregarArchivo()
{
StorageFile archivoLocal = await folderLocal.CreateFileAsync(nombreArchivo, CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(archivoLocal, contenidoArchivo + &quot;taco&quot;);

LeerArchivo();
}

private async void LeerArchivo()
{
StorageFile archivoLocal = await folderLocal.GetFileAsync(nombreArchivo);
string textoLocal = await FileIO.ReadTextAsync(archivoLocal);

contenidoArchivo = textoLocal;

BorrarArchivo();
}

private async void BorrarArchivo()
{
StorageFile archivoLocal = await folderLocal.GetFileAsync(nombreArchivo);
await archivoLocal.DeleteAsync();
}</pre>
<p>Como puedes ver la única gran diferencia es que ahora tenemos async/await en nuestros métodos que se encargan de leer el disco duro. No tenemos que especificar las ubicaciones de carpeta, ni siquiera tenemos que definir una estructura de carpetas si no queremos.</p>
<p>Además, puedes ver en tus archivos que estos se han guardado. Cada aplicación almacena sus archivos localmente en la máquina y si usas un pinto de interrupción puedes determinad la ubicación en tu dispositivo. Por ejemplo, el archivo “tacotext.txt” que he creado esta almacenado en la propiedad Path mostrada abajo.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image16.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb16.png" width="500" height="96" border="0" /></a></p>
<p>Una vez que has lo has creado puedes incluso llegar al folder, abrirlo y ver el contenido, incluso puedes abrir el archivo por ti mismo.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/8XAMLFileLocation1.png"><img title="8-XAML-FileLocation" alt="8-XAML-FileLocation" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/8XAMLFileLocation_thumb.png" width="500" height="234" border="0" /></a></p>
<p>¡Eso es todo! Guardar archivos, incluso archivos grandes puede ser hecho de esta manera. Solo necesitas recordar el nombre del archivo que le diste. La caja de arena de Windows 8 se encargará del resto.  Por favor nota que mi ejemplo arriba solo almacena un archivo local pero puedes usar el MISMO código (pero con la referencia a ApplicationData.Current.RoamingFolder en su lugar) para los archivos vía roaming.</p>
<p>Como recordatorio, los archivos vía roaming no se transferirán inmediatamente así que no esperes el tipo de rendimiento que has visto con las aplicaciones como SkyDrive o DropBox. Se cauteloso del la transferencia de información pero de cualquier manera, usa esto mucho.</p>
<h2>En resumen</h2>
<p>Los ajustes y configuraciones son una herramienta poderosa en el arsenal de desarrollo de Windows 8. Es fácil de hacer y hacer a tu aplicación mucho más genial cuando es capaz de trabajar con diferentes dispositivos a la vez. Yo aún cuento historias acerca de la primera vez que jugué Jetpack Joyride en una segunda máquina y todas mis compras, jetpacks, equipo y ajustes se mostraron de inmediato. Hizo lo que ya era un juego increíble algo mucho mejor para mí. Por esto recomiendo que lo hagas por ti mismo. (Es un juego gratuito pero hay una opción de in-app purchasing por $1.49 USD para duplicar tus monedas por cada nivel completado. Lo vale totalmente).</p>
<p><a href="http://www.halfbrick.com/our-games/jetpack-joyride/"><img title="8-XAML-JetpackJoyride" alt="8-XAML-JetpackJoyride" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/8XAMLJetpackJoyride.png" width="500" height="281" border="0" /></a></p>
<p>Para descargar el código de ejemplo de este artículo da clic en el ícono de abajo.</p>
<p>&nbsp;</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia8.zip" target="_blank"><img class="alignnone" alt="" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadXAML5.png" width="150" height="150" /></a></p>
<p>&nbsp;</p>
<p>Mañana, vamos a discutir acerca de los mosaicos activos (Live Tiles) y como crear ambos, tanto los primarios como secundarios así como actualizarlos. ¡Nos vemos entonces!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-8-informacin-local-e-itinerante/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 d&#237;as de Windows 8 &#124; D&#237;a 7: El contrato para compartir</title>
		<link>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-7-el-contrato-para-compartir/</link>
		<comments>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-7-el-contrato-para-compartir/#comments</comments>
		<pubDate>Sun, 17 Mar 2013 04:40:13 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3955</guid>
		<description><![CDATA[Esta artículo es una traducción de “Día 7: El contrato para compartir” de Jeff Blakenburg. Puedes encontrar aquí la versión original en inglés. Los dos últimos días hemos trabajado con un nuevo elemento en Windows 8: Los contratos. Presentamos esta noción de contratos al explorar como incorporar ajustes a nuestras aplicaciones. Entonces exploramos como extender la presencia de nuestras aplicaciones a los usuarios mediante la búsqueda. Hoy vamos a tomar el siguiente paso y explorar uno de los elementos que más nos emociona. Compartir. Antes de Windows 8, crear una aplicación “social” era complicado. No solo porque tuvieras que aprender bastantes APIs de las plataformas con las que quisieras trabajar sino también tenías que conocer el API para Facebook, Twitter y cualquier otra red social que quisieras incluir. Eso era demasiado abrumador sino es que caía en lo imposible de realizar efectivamente. Con Windows 8, solo nos debemos preocupar por crear nuestra aplicación. De hecho, colocar botones en tu aplicación que digan “Compartir en X red social” ya es desaprobado en este sistema. ¿Por qué darle al usuario un botón de Twitter cuando no usan Twitter? Lo mismo para Google+, Facebook, Flickr, GitHub o cualquier otra plataforma basada en modo [...]]]></description>
				<content:encoded><![CDATA[<p>Esta artículo es una traducción de “Día 7: El contrato para compartir” de Jeff Blakenburg. <a href="http://www.jeffblankenburg.com/2012/11/07/31-days-of-windows-8-day-7-share-contract" target="_blank">Puedes encontrar aquí la versión original en inglés.</a></p>
<p>Los dos últimos días hemos trabajado con un nuevo elemento en Windows 8: Los contratos. Presentamos esta noción de contratos al explorar como incorporar ajustes a nuestras aplicaciones. Entonces exploramos como extender la presencia de nuestras aplicaciones a los usuarios mediante la búsqueda. Hoy vamos a tomar el siguiente paso y explorar uno de los elementos que más nos emociona. Compartir.</p>
<p>Antes de Windows 8, crear una aplicación “social” era complicado. No solo porque tuvieras que aprender bastantes APIs de las plataformas con las que quisieras trabajar sino también tenías que conocer el API para Facebook, Twitter y cualquier otra red social que quisieras incluir.</p>
<p>Eso era demasiado abrumador sino es que caía en lo imposible de realizar efectivamente.</p>
<p>Con Windows 8, solo nos debemos preocupar por crear nuestra aplicación. De hecho, colocar botones en tu aplicación que digan “Compartir en X red social” ya es desaprobado en este sistema. ¿Por qué darle al usuario un botón de Twitter cuando no usan Twitter? Lo mismo para Google+, Facebook, Flickr, GitHub o cualquier otra plataforma basada en modo social.</p>
<p>Con el contrato de Compartir, el usuario se encuentra en total control.Tu haces tu contenido compartible y ELLOS deciden donde y como compartirlo. Es un sentimiento de control que es verdaderamente unos de los mejores elementos de Windows 8 para mí.</p>
<h2>Definir lo compartido</h2>
<p>Compartir sucede en dos formas, quien comparte (la aplicación origen) y quien recibe (la aplicación destino). Esto sucede por medio de un corredor.</p>
<p><img title="Block diagram showng the components involved in sharing" alt="Block diagram showng the components involved in sharing" src="http://i.msdn.microsoft.com/dynimg/IC593411.png" /></p>
<p>Imagen vía: <a title="http://msdn.microsoft.com/en-us/library/windows/apps/hh758314.aspx" href="http://msdn.microsoft.com/en-us/library/windows/apps/hh758314.aspx">http://msdn.microsoft.com/en-us/library/windows/apps/hh758314.aspx</a></p>
<p>¿Qué tipo de archivos puedes compartir? Hay 6 diferentes tipos de contenido que puedes compartir con el corredor:</p>
<p>* Texto plano sin formato</p>
<p>* Enlaces</p>
<p>* Contenido con formato / HTML</p>
<p>* Archivos</p>
<p>* Una imagen sencilla</p>
<p>* Un formato de información personalizado</p>
<p>La información es compartida por medio de un objeto llamado <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.applicationmodel.datatransfer.datapackage.aspx" target="_blank">DataPackage</a>- En este artículo vamos a dividir el compartir origen y el compartir destino en dos secciones separadas.</p>
<h2>Compartir Origen</h2>
<p>Vamos a comenzar con el más simple de dos escenarios.  El origen para compartir. En este escenario vamos a mostrar como puedes compartir cada uno de los siete tipos de contenidos mostrados arriba. Primero, necesitamos  crear una nueva solución en blanco para comenzar desde ahí. En el código de ejemplo para este artículo notarás que he creado una página separada para cada tipo de información. Ciertamente no necesitas hacerlo en tu aplicación pero ten en cuenta que puedes solo compartir un tipo de información a la vez desde cualquier página. Vamos a comenzar con el texto sin formato.</p>
<p>El plan de compartir para el texto sin formato</p>
<p>Este será el ejemplo más largo para el código de compartir porque la mayoría del código es exactamente el mismo para cada ejemplo. Solo voy a resaltar lo necesario y después me enfocaré en los elementos que son diferentes en los ejemplos sucesivos.</p>
<p>Primero necesitamos crear una referencia al DataTransferManager. Necesitarás agregar el espacio de nombres Windows.ApplicationModel.DataTransfer a tu página. En el código debajo verás que instancío la referencia al DataTransferManager y después creo un manejador de eventos (en el método OnNavigated()) para cuando la información sea solicitada para ser compartida desde este página con el manejador de eventos DataRequest().</p>
<pre class="brush: csharp">DataTransferManager dtm;

protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
dtm = DataTransferManager.GetForCurrentView();
dtm.DataRequested += dtm_DataRequested;
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
dtm.DataRequested -= dtm_DataRequested;
}</pre>
<p>Deberás también notar que ajustamos el método OnNavigatedFrom para retirar el manejador de DataRequested cuando dejamos la página. Esta es una buena práctica que deberías incorporar en cada una de tus páginas. Asegúrate de cancelar cualquier manejador de eventos que estás registrando.</p>
<p>Finalmente, necesitamos compartir algo de texto y hacemos esto por medio de nuestro método dtm_DataRequested().</p>
<pre class="brush: csharp">void dtm_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
string tituloFiltro = &quot;31 días de Windows 8&quot;;
string DescripcionArchivo = &quot;Esto solo explica lo que estamos compartiendo&quot;;

DataPackage informacion = args.Request.Data;
informacion.Properties.Title = tituloFiltro;
informacion.Properties.Description = DescripcionArchivo;
informacion.SetText(&quot;Probando la funcionalidad en Windows 8&quot;);
}</pre>
<p>Como puedes ver simplemente creamos un objeto DataPacker y ajustamos sus propiedades de manera acordada. Usando los valores que he puesto en el código aquí está el mensaje que el usuario verá.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image6.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb6.png" width="400" height="225" border="0" /></a></p>
<p>Una vez que hayas seleccionado una aplicación (en este caso la del correo), verán que la información llena la aplicación elegida:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image7.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb7.png" width="400" height="240" border="0" /></a></p>
<p>Para el resto de los tipos de información te mostraré los contenidos del método dtm_DataRequest() pero todo lo demás se resume básicamente de la misma forma.</p>
<h2></h2>
<h2>Compartir enlaces</h2>
<p>La única diferencia entre un enlace y el texto sin formato es que debes especificar un objeto de tipo Uri al DataPackage. Aquí está el código.</p>
<pre class="brush: csharp">void dtm_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
Uri fuenteLink = new Uri(&quot;http://aminespinoza.com/&quot;);
string tituloFiltro = &quot;31 días de Windows 8&quot;;
string DescripcionArchivo = &quot;Esto solo explica lo que estamos compartiendo&quot;;

DataPackage data = args.Request.Data;
data.Properties.Title = tituloFiltro;
data.Properties.Description = DescripcionArchivo;
data.SetUri(fuenteLink);
}</pre>
<p>La principal diferencia está en la UI. Aquí está el mensaje inicial para compartir.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image8.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb8.png" width="250" height="181" border="0" /></a></p>
<p>Notarás que tienes la posibilidad de colocarlo no solo como correo. Si abrierara la aplicación de Contactos tendría la facilidad de elegir entre Facebook y Twitter. Aquí está lo que la aplicación de correo hará con la información una vez abierta.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image9.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb9.png" width="400" height="225" border="0" /></a></p>
<p>Lo genial de esta implementación son unos cuantos elementos:</p>
<p>La aplicación de correo ha navegado en la web y obtenido un par de imágenes que podrían ser útiles como muestra.</p>
<p>La aplicación de correo también obtuvo el título del sitio web y lo usó en el listado. Muy útil.</p>
<p>En el ejemplo del texto sin formato, la propiedad Descripcion no fue utilizada en la aplicación de correo. En este caso fue incrustada en el enlace.</p>
<p>Vamos a pasar ahora a la manera de compartir contenido con formato como HTML.</p>
<h2>Compartiendo Contenido con formato / HTML</h2>
<p>Aquí está una vista de nuestra implementación de código.</p>
<pre class="brush: csharp">void dtm_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
string cadenaHTML = &quot;&lt;strong&gt;Texto resaltado,&lt;/strong&gt; texto normal.  &lt;a href=&#039;http://blogs.ligasilverlight.com/blog/&#039;&gt;Checa nuestros 31 días con Windows 8&lt;/a&gt;&quot;;
string tituloHTML = &quot;31 Días de Windows 8&quot;;
string DescripcionHTML = &quot;Esto solo explica lo que estamos compartiendo&quot;;

DataPackage informacion = args.Request.Data;
informacion.Properties.Title = tituloHTML;
informacion.Properties.Description = DescripcionHTML;
informacion.SetHtmlFormat(HtmlFormatHelper.CreateHtmlFormat(cadenaHTML));
}</pre>
<p>Tuvimos que tratar este contenido de una manera ligeramente diferentes. Notarás que cuando mandamos nuestro contenido desde nuestro DataPackage en esta ocasión tuvimos que llamar al elemento HtmlFormat. Esto tomará a nuestra cadena ordinaria y la convertirá en un conjunto HTML activo que puede ser colocado y utilizado. El mensaje inicial luce exactamente de la misma forma pero puedes ver el contenido HTML con formato aparece en el cuerpo de nuestro mensaje de correo.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image10.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb10.png" width="199" height="240" border="0" /></a></p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image11.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb11.png" width="400" height="298" border="0" /></a></p>
<p>Una grana plicación de esto podría ser crear mensajes de correo con contenido HTML. Crear mensajes de este tipo es extremadamente difícil para aquellos que no conocen HTML. Imagina una aplicación simple que permita crear una interfaz visualmente de HTML y después puedan compartirla a su lista de clientes y enviarla. Alguien hizo esto.</p>
<h2>Compartir archivos</h2>
<p>Uno o más archivos son tratados de la misma manera que en esta situación pero dado que estamos leyendo archivos desde el almacenamiento hay un poco más de código necesario para ser escrito. Si tienes archivos adicionales encontrarás y agregarás simplemente  la lógica asíncrona necesaria, y después los agregarás a una colección de tipo List&lt;IStorageItem&gt; Asíncronamente vamos a obtener los archivos y cuando la operación esté completada, los compartiremos.</p>
<pre class="brush: csharp">async void dtm_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
string tituloHTML = &quot;31 Días de Windows 8&quot;;
string DescripcionHTML = &quot;Esto solo explica lo que estamos compartiendo&quot;;

DataPackage informacion = args.Request.Data;
informacion.Properties.Title = tituloHTML;
informacion.Properties.Description = DescripcionHTML;

DataRequestDeferral waiter = args.Request.GetDeferral();

try
{
StorageFile archivoDeTexto = await Package.Current.InstalledLocation.GetFileAsync(&quot;ArchivoCompartir.txt&quot;);
List&lt;istorageitem&gt; archivos = new List&lt;/istorageitem&gt;&lt;istorageitem&gt;();
archivos.Add(archivoDeTexto);
informacion.SetStorageItems(archivos);

}
finally
{
waiter.Complete();
}
}</pre>
<p>Nota que el método entero necesitó ser decorado con la palabra reservada “async” para poder hacer que todo funcione. Veras esto muchas veces en el desarrollo de Windows 8 y es la manera de lidiar con eventos asíncronos. Simplemente te hace la vida mucho más simple. Si no es esta enteramente claro, cree un archivo de texto simple y lo agregué en mi proyecto. Este es el archivo que tomaré y compartiré. De nuevo, el mensaje de compartir lucirá idéntico la primera vez pero cuando abres la aplicación de correo lucirá abierto de la siguiente manera.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image12.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb12.png" width="400" height="337" border="0" /></a></p>
<p>La parte interesante a notar en esta situación es que la aplicación de correo previamente utilizó nuestro título como tema del mensaje del correo. En este ejemplo no lo hace. Estoy seguro que el equipo de producto tiene una razón por la cual esto sucede pero yo votaría por consistencia en esto.</p>
<p>Compartir imágenes</p>
<p>Cuando compartes un archivo de imagen quizá quieres tratarlo diferente a un solo archivo básico o quizá no. En este ejemplo, vamos a compartir nuestro archivo de imagen de dos maneras diferentes de modo que las aplicaciones objetivo puedan usar la información en la que están interesadas. Las aplicaciones que buscan por archivos estarán disponibles tanto como las aplicaciones que buscan por imágenes específicamente. Puedes usar este útil truco cuando has tenido múltiples tipos de información para compartir también, no solo cuando la misma cosa puede ser compartida de dos maneras diferentes.</p>
<pre class="brush: csharp">async void dtm_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
string tituloHTML = &quot;31 Días de Windows 8&quot;;
string DescripcionHTML = &quot;Esto solo explica lo que estamos compartiendo&quot;;

DataPackage informacion = args.Request.Data;
informacion.Properties.Title = tituloHTML;
informacion.Properties.Description = DescripcionHTML;

DataRequestDeferral waiter = args.Request.GetDeferral();

try
{
StorageFile imagen = await Package.Current.InstalledLocation.GetFileAsync(&quot;Assets\\Logo.png&quot;);
informacion.Properties.Thumbnail = RandomAccessStreamReference.CreateFromFile(imagen);
informacion.SetBitmap(RandomAccessStreamReference.CreateFromFile(imagen));

List&lt;/istorageitem&gt;&lt;istorageitem&gt; archivos = new List&lt;/istorageitem&gt;&lt;istorageitem&gt;();
archivos.Add(imagen);
informacion.SetStorageItems(archivos);
}
finally
{
waiter.Complete();
}
}</pre>
<p>Puedes ver que hemos la llamado ambos métodos SetBitmap así como al método SetStorageItems. En cualquier caso el mensaje de compartir lucirá idéntico. Por ejemplo, la aplicación de correo no permite imágenes “crudas” pero si las acepta como StorageItems. Dale a este código de ejemplo un intento. Estaba también sorprendido de ver que la aplicación de contacto no acepta ningún tipo de compartir.  Hablaremos más tarde en este artículo acerca de ser una aplicación objeto para compartir y como podemos aceptar diferentes tipos de información.</p>
<h2>Compartiendo un formato personalizado de información</h2>
<p>Hay muchas veces en las que vas a querer compartir algún tupo de información personalizada. En el 99% de las ocasiones, para hacerlo debes caer en un esquema estándar como los que puedes encontrar en <a href="http://schema.org">http://schema.org</a>. De hecho no estás bloqueado en un esquema predeterminado pero asegúrate de que entiendes la <a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh750306.aspx" target="_blank">guía que Microsoft ofrece para crear tus tipos de información personalizados</a>.</p>
<p>La historia pequeña acerca de compartir información personalizada es que vas a especificar un DataPackageFormat pero puede ser absolutamente lo que tu quieras. Para la mayoría de propósitos solo podrás compartir información personalizada entre dos de tus propias aplicaciones pero estandarizando en un esquema estándar ciertamente incrementa las posibilidades de compartir con otras aplicaciones también. Al final tu especificarás una cadena que represente el esquema de tu información y si otra aplicación es un objeto para el mismo y específico tipo de caracteres de la cadena entonces se mostrarán en la lista de aplicaciones potenciales.</p>
<pre class="brush: csharp">void dtm_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
string informacionPersonalizada = @&quot;{
&quot;&quot;type&quot;&quot; : &quot;&quot;http://schema.org/Person&quot;&quot;,
&quot;&quot;properties&quot;&quot; :
{
&quot;&quot;image&quot;&quot; : &quot;&quot;http://jeffblankenburg.com/images/200x200.png&quot;&quot;,
&quot;&quot;name&quot;&quot; : &quot;&quot;Jeff Blankenburg&quot;&quot;,
&quot;&quot;affiliation&quot;&quot; : &quot;&quot;Microsoft&quot;&quot;,
&quot;&quot;birthDate&quot;&quot; : &quot;&quot;07/22/1976&quot;&quot;,
&quot;&quot;jobTitle&quot;&quot; : &quot;&quot;Senior Technical Evangelist&quot;&quot;,
&quot;&quot;nationality&quot;&quot; : &quot;&quot;United States of America&quot;&quot;,
&quot;&quot;gender&quot;&quot; : &quot;&quot;Male&quot;&quot;
}
}&quot;;
string tituloCompartir = &quot;31 Days of Windows 8!&quot;;
string enlaceDescripcion = &quot;This just explains what we&#039;re sharing.&quot;;  //This is an optional value.

DataPackage informacion = args.Request.Data;
informacion.Properties.Title = tituloCompartir;
informacion.Properties.Description = enlaceDescripcion;
informacion.SetData(&quot;http://schema.org/Person&quot;, informacionPersonalizada);
}</pre>
<p>En el ejemplo de arriba estoy usando el esquema de <a href="http://schema.org/Person">http://schema.org/Person</a> y dado que ninguna de mis otras aplicaciones en mi máquina reconocen este esquema obtendré un mensaje al momento de compartir como el siguiente.</p>
<p><img title="7-XAML-CustomDataPrompt" alt="7-XAML-CustomDataPrompt" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/7XAMLCustomDataPrompt.png" width="345" height="262" border="0" /></p>
<p>Como has visto a lo largo de esta sección, nuestro título y descripción continúan mostrándose en el mismo lugar pero esta ocasión no hay ninguna app disponible para compartir. En la siguiente sección, vamos a ver como hacer que nuestra aplicación sea capaz de <strong>recibir</strong> estos tipos de datos.</p>
<h2>Objetivo para compartir</h2>
<p>Cuando me senté por primera vez a escribir este artículo hice a esta parte la última porque pensé que sería mucho más difícil (y largo) que la otra. Ahora que lo veo, estoy equivocado. Mucho del trabajo para ser una aplicación para compartir cae en tu archivo Package.appmanifest.</p>
<p>Abre el tuyo en la sección de Declaraciones y será probable que encuentres una tierra estéril. Lo que necesitamos hacer es agregar la declaración de Share Target al elegir de la caja de elecciones y presiona el botón de Agregar.</p>
<p><img title="7-XAML-AppManifest" alt="7-XAML-AppManifest" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/7XAMLAppManifest.png" width="554" height="285" border="0" /></p>
<p>Una vez que has agregado la opción de compartir, se comenzarán a mostrar muchos signos rojos de advertencia.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/7XAMLAppManifestBroken1.png"><img title="7-XAML-AppManifestBroken" alt="7-XAML-AppManifestBroken" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/7XAMLAppManifestBroken_thumb1.png" width="500" height="344" border="0" /></a></p>
<p>Agregar una declaración para compartir no es suficiente. También necesitas especificar que tipo de archivo va a recibir. Afortunadamente podemos elegir cualquiera o todos los formatos que hemos cubierto en este artículo. La siguiente imagen muestra mis declaraciones completamente llenas haciendo mi aplicación un objeto para casi todo.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/7XAMLAppManifestComplete1.png"><img title="7-XAML-AppManifestComplete" alt="7-XAML-AppManifestComplete" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/7XAMLAppManifestComplete_thumb1.png" width="500" height="617" border="0" /></a></p>
<p>Ahora como nos metemos en el código, hay un largo camino aquí que probablemente necesitas para tu aplicación. He creado un ejemplo que comparte y consume cada posible tipo de información y como tal tiene muchas más líneas de código que las que quisieras.</p>
<p>Primero, necesitamos abrir nuestro archivo App.xaml.cs y agregar un nuevo método para manejar cuando el compartir esté activado. Es sin sorpresa OnShareTargetActivated.</p>
<pre class="brush: csharp">protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
var rootFrame = new Frame();
rootFrame.Navigate(typeof(MainPage), args.ShareOperation;
Window.Current.Content = rootFrame;
Window.Current.Activate();
}</pre>
<p>Todo esto realmente indica a la aplicación cual es la página que quieres mostrar una vez que tu aplicación ha sido seleccionada para compartir. Esto probablemente es una página separada para ti (no MainPage) pero para mi ejemplo, es exactamente la que he usado.</p>
<p>Ahora para el proceso largo de lógica. He agregado comentarios de modo que puedes encontrar las piezas en las que estés específicamente interesado. Ubica el método entero de OnNavigatedTo() en el ejemplo en MainPage.xaml.cs. Recuerda que esta lógica irá en una página separada en tu aplicación para poder delegar una sola responsabilidad de atrapar ciertos tipos de información compartida.</p>
<p>Podrás ver que cada ejemplo es ligeramente diferente dependiendo del tipo de información.</p>
<h2>En resumen</h2>
<p>Hoy, vimos un repaso muy extendido para agregar la opción de compartir en tu aplicación. El contrato para compartir te da un increíble nuevo paradigma de aplicaciones con las cuales interactuar. Es algo enormemente refrescanta acerca de saber que aplicaciones que no tienen idea que la mía existe puedan aún comunicarse entre ellas. Espero que tomes esta oportunidad para compartir y consumir la información que sea útil en tu aplicación.</p>
<p>Puedes descargar el ejemplo entero de este artículo desde aquí.</p>
<p>&nbsp;</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia7.zip" target="_blank"><img class="alignnone" alt="" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadXAML5.png" width="150" height="150" /></a></p>
<p>&nbsp;</p>
<p>Mañana, vamos a enfocarnos en almacenar información de ambas maneras, localmente en el dispositivo así como información en la nube ¡Nos vemos!</istorageitem></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-7-el-contrato-para-compartir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 d&#237;as de Windows 8 &#124; D&#237;a 6: El contrato de b&#250;squeda</title>
		<link>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-6-el-contrato-de-bsqueda/</link>
		<comments>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-6-el-contrato-de-bsqueda/#comments</comments>
		<pubDate>Fri, 08 Mar 2013 02:45:42 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3935</guid>
		<description><![CDATA[Este artículo es una traducción de “Día 6: El contrato de búsqueda” de Jeff Blakenburg. Puedes encontrar aquí la versión original en inglés. Ayer comenzamos a hablar de contratos al explorar como agregar ajustes a nuestras aplicaciones. Hoy vamos a trabajar sobre la búsqueda y mañana con compartir porque estas funciones le dan más vida a tu aplicación cunado no está ejecutándose precisamente. En el contexto de buscar, esto significa que tu aplicación puede potencialmente exponerse a sí misma al usuario en una nueva forma. Por los últimos 10 años “buscar” ha sido típicamente sinónimo de los motores de búsqueda. Hace algunos años buscar se ha vuelto muy importante en Windows y si eras como yo te volviste muy hábil en presionar el botón de inicio y escribir el nombre del programa en lugar de ir por el. Hoy en Windows 8 puedes solo escribir y esos resultados serán desplegados de una manera agradable. Mejor aún, Windows 8 esta realmente extendiendo la manera en como conocemos la búsqueda y la está trayendo justo a nuestras aplicaciones de Windows Store. Ahora no hay ninguna magia, solo atamos algunos eventos y desplegamos las cosas adecuadas a nuestros usuarios pero cambia el típico [...]]]></description>
				<content:encoded><![CDATA[<p>Este artículo es una traducción de “Día 6: El contrato de búsqueda” de Jeff Blakenburg. <a href="http://www.jeffblankenburg.com/2012/11/06/31-days-of-windows-8-day-6-search-contract" target="_blank">Puedes encontrar aquí la versión original en inglés.</a></p>
<p>Ayer comenzamos a hablar de contratos al explorar como agregar ajustes a nuestras aplicaciones. Hoy vamos a trabajar sobre la búsqueda y mañana con compartir porque estas funciones le dan más vida a tu aplicación cunado no está ejecutándose precisamente. En el contexto de buscar, esto significa que tu aplicación puede potencialmente exponerse a sí misma al usuario en una nueva forma.</p>
<p>Por los últimos 10 años “buscar” ha sido típicamente sinónimo de los motores de búsqueda. Hace algunos años buscar se ha vuelto muy importante en Windows y si eras como yo te volviste muy hábil en presionar el botón de inicio y escribir el nombre del programa en lugar de ir por el. Hoy en Windows 8 puedes solo escribir y esos resultados serán desplegados de una manera agradable.</p>
<p>Mejor aún, Windows 8 esta realmente extendiendo la manera en como conocemos la búsqueda y la está trayendo justo a nuestras aplicaciones de Windows Store. Ahora no hay ninguna magia, solo atamos algunos eventos y desplegamos las cosas adecuadas a nuestros usuarios pero cambia el típico “punto de entrada” en nuestras aplicaciones. Ahora, en lugar de que nuestro usuario abra su aplicación, busque la caja de búsqueda y comience a buscar, podrá presionar buscar y ser llevado directamente a lo que ellos estuvieran buscando sin más pasos.</p>
<p>Comenzando a configurar</p>
<p>Como lo hemos hecho cada día desde el inicio de esta serie, vamos a comenzar  con la plantilla en blanco. De nuevo, la razón por la que hacemos esto es porque hay mucho código extra para filtrar antes de encontrar lo que estabas buscando.</p>
<p>Una vez que has tenido tu nuevo proyecto (y reemplazado la imagen por defecto… ¿Hiciste eso no? ¿No recuerdas el <a href="http://blogs.ligasilverlight.com/2012/11/31-das-de-windows-8-da-1-la-aplicacin-en-blanco/" target="_blank">día 1</a>?). Ahora vamos a agregar la búsqueda a nuestra aplicación. Afortunadamente la búsqueda básica esta a solo un clic de distancia.</p>
<p>Da clic derecho sobre tu proyecto y selecciona Agregar &gt; Nuevo elemento &gt; Search contract.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb.png" width="550" height="335" border="0" /></a></p>
<p>Te preguntará por el nombre de una página para trabajar con ella. Yo he usado ResultadosBusqueda.xaml pero puedes llamar a la página como desees</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image1.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb1.png" width="400" height="157" border="0" /></a></p>
<p>Vamos a discutir cada uno de estos archivos brevemente un poco después pero por ahora, deberías ver una solución que luzca como la siguiente.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image2.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb2.png" width="231" height="308" border="0" /></a></p>
<p>Hasta aquí, deberías ser capaz de correr tu proyecto, elegir el botón de búsqueda y comenzar a escribir. Aquí está como luce mi aplicación cuando busco por “taco”.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image3.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb3.png" width="550" height="339" border="0" /></a></p>
<p>Como puedes ver, funciona pero no estamos dándole ningún valor porque no tenemos nada para buscar. Esto viene después pero antes de ello vamos a hablar acerca de la filosofía detrás de la búsqueda en Windows 8.</p>
<h2>Filosofía de búsqueda</h2>
<p>Cuando piensas en una aplicación tradicional de Windows 8 estas son generalmente de menor tamaño. No encontrarás una versión de Outlook por ejemplo, que administre muchos tipos de información. En su lugar, hay una aplicación de calendario, una aplicación de correo y una aplicación de contactos.</p>
<p>Las aplicaciones Windows 8 están hechas para hacer una cosa y hacerla realmente bien. Afortunadamente estoy quizá describiendo la aplicación que estás creando ahora. Las aplicaciones Windows 8 pueden ser también buscadas incluso cuando no están corriendo. Eso quiere decir que cuando el usuario esta buscando por algo, el nombre de tu aplicación quizá muestre ciertos tipos de información.</p>
<p>Por ejemplo, la aplicación iHeartRadio. Si estoy buscándola quizá encontraré una estación de radio.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/6XAMLIHeartRadio.png"><img title="6-XAML-IHeartRadio" alt="6-XAML-IHeartRadio" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/6XAMLIHeartRadio_thumb.png" width="500" height="312" border="0" /></a></p>
<p>Para una aplicación de clima es como si buscara por una ciudad.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/6XAMLWeather.png"><img title="6-XAML-Weather" alt="6-XAML-Weather" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/6XAMLWeather_thumb.png" width="500" height="312" border="0" /></a></p>
<p>Netflix, quizá estoy buscando por el título de una película o show.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/6XAMLNetflix.png"><img title="6-XAML-Netflix" alt="6-XAML-Netflix" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/6XAMLNetflix_thumb.png" width="500" height="312" border="0" /></a></p>
<p>Finalmente, la aplicación de Gente asume que estoy buscando por el nombre de una persona.</p>
<p><img style="background-image: none; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-width: 0px;" alt="" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/6XAMLPeople.png" width="500" height="312" border="0" /></p>
<p>Así que como tu estas creando tu aplicación. Hazte a ti mismo una pregunta.</p>
<p>¿Que esperarían los usuarios buscar en mi aplicación?</p>
<p>Otra discusión importante acerca de la búsqueda revuelve el concepto de “Buscar” contra “Encontrar”. El botón de buscar NOT es usado para mirar dentro de un documento. Buscar siempre debe ser algo que puede ser hecho en tu aplicación incluso si no está ejecutándose.</p>
<p><a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh465233.aspx" target="_blank">Aquí hay una guía específica de Microsoft de como usar la el botón de Buscar.</a></p>
<h2>Haciendo funcionar la búsqueda</h2>
<p>Como vimos en nuestros párrafos de inicio, agregar el contrato de búsqueda a tu proyecto es solo el primer paso. Después necesitamos dar algo de información importante para que el usuario busque. Si vuelves a visitar el artículo del <a href="http://blogs.ligasilverlight.com/2013/01/31-das-de-windows-8-da-4-controles-nuevos/" target="_blank">día 4</a>, cree un conjunto pequeño de elementos de la tabla periódica para demostrar el control de Zoom Semántico.</p>
<p>Podremos usar la misma información en este ejemplo. En el caso de que lo hayas dejado pasar aquí tienes la clase Elemento.</p>
<pre class="brush: csharp">class Elemento
{
public double AtomicWeight { get; set; }
public int AtomicNumber { get; set; }
public string Symbol { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public string State { get; set; }
}</pre>
<p>Por simplicidad, voy a poblar la una lista de tipo Elemento en nuestro archivo PaginaResultados.xaml.cs. Iniciaré creando un nuevo método, CrearListaElementos() y llamándolo desde nuestro constructor, después crearé un nuevo objeto de tipo Elemento para los 36 elementos que estaré usando.</p>
<pre class="brush: csharp">private void CrearListaElementos()
{
elementos.Add(new Elemento { NumeroAtomico = 1, PesoAtomico = 1.01, Categoria = &quot;Metales alcalinos&quot;, Nombre = &quot;Hidrógeno&quot;, Simbolo = &quot;H&quot;, Estado = &quot;Gas&quot; });
elementos.Add(new Elemento { NumeroAtomico = 2, PesoAtomico = 4.003, Categoria = &quot;Gases nobles&quot;, Nombre = &quot;Helio&quot;, Simbolo = &quot;He&quot;, Estado = &quot;Gas&quot; });
elementos.Add(new Elemento { NumeroAtomico = 3, PesoAtomico = 6.94, Categoria = &quot;Metales alcalinos&quot;, Nombre = &quot;Litio&quot;, Simbolo = &quot;Li&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 4, PesoAtomico = 9.01, Categoria = &quot;Tierras alcalinas&quot;, Nombre = &quot;Berilio&quot;, Simbolo = &quot;Be&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 5, PesoAtomico = 10.81, Categoria = &quot;No Metales&quot;, Nombre = &quot;Boro&quot;, Simbolo = &quot;B&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 6, PesoAtomico = 12.01, Categoria = &quot;No Metales&quot;, Nombre = &quot;Carbono&quot;, Simbolo = &quot;C&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 7, PesoAtomico = 14.01, Categoria = &quot;No Metales&quot;, Nombre = &quot;Nitrogeno&quot;, Simbolo = &quot;N&quot;, Estado = &quot;Gas&quot; });
elementos.Add(new Elemento { NumeroAtomico = 8, PesoAtomico = 15.999, Categoria = &quot;No Metales&quot;, Nombre = &quot;Oxígeno&quot;, Simbolo = &quot;O&quot;, Estado = &quot;Gas&quot; });
elementos.Add(new Elemento { NumeroAtomico = 9, PesoAtomico = 18.998, Categoria = &quot;No Metales&quot;, Nombre = &quot;Flúor&quot;, Simbolo = &quot;F&quot;, Estado = &quot;Gas&quot; });
elementos.Add(new Elemento { NumeroAtomico = 10, PesoAtomico = 20.18, Categoria = &quot;Gases nobles&quot;, Nombre = &quot;Neón&quot;, Simbolo = &quot;Ne&quot;, Estado = &quot;Gas&quot; });
elementos.Add(new Elemento { NumeroAtomico = 11, PesoAtomico = 22.99, Categoria = &quot;Metales alcalinos&quot;, Nombre = &quot;Sodio&quot;, Simbolo = &quot;Na&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 12, PesoAtomico = 24.31, Categoria = &quot;Tierras alcalinas&quot;, Nombre = &quot;Magnesio&quot;, Simbolo = &quot;Mg&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 13, PesoAtomico = 26.98, Categoria = &quot;Otros metales&quot;, Nombre = &quot;Aluminio&quot;, Simbolo = &quot;Al&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 14, PesoAtomico = 28.09, Categoria = &quot;No Metales&quot;, Nombre = &quot;Silicio&quot;, Simbolo = &quot;Si&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 15, PesoAtomico = 30.97, Categoria = &quot;No Metales&quot;, Nombre = &quot;Fósforo&quot;, Simbolo = &quot;P&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 16, PesoAtomico = 32.06, Categoria = &quot;No Metales&quot;, Nombre = &quot;Azufre&quot;, Simbolo = &quot;S&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 17, PesoAtomico = 35.45, Categoria = &quot;No Metales&quot;, Nombre = &quot;Cloro&quot;, Simbolo = &quot;Cl&quot;, Estado = &quot;Gas&quot; });
elementos.Add(new Elemento { NumeroAtomico = 18, PesoAtomico = 39.95, Categoria = &quot;Gases nobles&quot;, Nombre = &quot;Argón&quot;, Simbolo = &quot;Ar&quot;, Estado = &quot;Gas&quot; });
elementos.Add(new Elemento { NumeroAtomico = 19, PesoAtomico = 39.10, Categoria = &quot;Metales alcalinos&quot;, Nombre = &quot;Potasio&quot;, Simbolo = &quot;K&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 20, PesoAtomico = 40.08, Categoria = &quot;Tierras alcalinas&quot;, Nombre = &quot;Calcio&quot;, Simbolo = &quot;Ca&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 21, PesoAtomico = 44.96, Categoria = &quot;Metales de transición&quot;, Nombre = &quot;Escandio&quot;, Simbolo = &quot;Sc&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 22, PesoAtomico = 47.90, Categoria = &quot;Metales de transición&quot;, Nombre = &quot;Titanio&quot;, Simbolo = &quot;Ti&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 23, PesoAtomico = 50.94, Categoria = &quot;Metales de transición&quot;, Nombre = &quot;Vanadio&quot;, Simbolo = &quot;V&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 24, PesoAtomico = 51.996, Categoria = &quot;Metales de transición&quot;, Nombre = &quot;Cromo&quot;, Simbolo = &quot;Cr&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 25, PesoAtomico = 54.94, Categoria = &quot;Metales de transición&quot;, Nombre = &quot;Manganeso&quot;, Simbolo = &quot;Mn&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 26, PesoAtomico = 55.85, Categoria = &quot;Metales de transición&quot;, Nombre = &quot;Hierro&quot;, Simbolo = &quot;Fe&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 27, PesoAtomico = 58.93, Categoria = &quot;Metales de transición&quot;, Nombre = &quot;Cobalto&quot;, Simbolo = &quot;Co&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 28, PesoAtomico = 58.70, Categoria = &quot;Metales de transición&quot;, Nombre = &quot;Níquel&quot;, Simbolo = &quot;Ni&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 29, PesoAtomico = 63.55, Categoria = &quot;Metales de transición&quot;, Nombre = &quot;Cobre&quot;, Simbolo = &quot;Cu&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 30, PesoAtomico = 65.37, Categoria = &quot;Metales de transición&quot;, Nombre = &quot;Zinc&quot;, Simbolo = &quot;Zn&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 31, PesoAtomico = 69.72, Categoria = &quot;Otros metales&quot;, Nombre = &quot;Galio&quot;, Simbolo = &quot;Ga&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 32, PesoAtomico = 72.59, Categoria = &quot;Otros metales&quot;, Nombre = &quot;Germanio&quot;, Simbolo = &quot;Ge&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 33, PesoAtomico = 74.92, Categoria = &quot;No Metales&quot;, Nombre = &quot;Arsénico&quot;, Simbolo = &quot;As&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 34, PesoAtomico = 78.96, Categoria = &quot;No Metales&quot;, Nombre = &quot;Selenio&quot;, Simbolo = &quot;Se&quot;, Estado = &quot;Sólido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 35, PesoAtomico = 79.90, Categoria = &quot;No Metales&quot;, Nombre = &quot;Bromo&quot;, Simbolo = &quot;Br&quot;, Estado = &quot;Líquido&quot; });
elementos.Add(new Elemento { NumeroAtomico = 36, PesoAtomico = 83.80, Categoria = &quot;Gases nobles&quot;, Nombre = &quot;Kryptón&quot;, Simbolo = &quot;Kr&quot;, Estado = &quot;Gas&quot; });
}</pre>
<p>Obviamente, vas a querer obtener tu información desde otra ubicación pero este artículo es acerca de búsqueda no de fuentes de datos.</p>
<p>Si miras en el método FilterSelectionChanged() que fue creado en PaginaResultados.xaml.cs verías algunos comentarios como el siguiente.</p>
<pre class="brush: csharp">// TODO: Respond to the change in active filter by setting this.DefaultViewModel[&quot;Results&quot;]
// to a collection of items with bindable Image, Title, Subtitle, and Description properties</pre>
<p>Justo debajo de estos comentarios, vamos a agregar nuestra lógica para obtener los registros adecuados desde nuestra fuente de datos. Antes de que hagamos eso, sin embargo, hay muchas suposiciones a considerar por ti para este método y es importante entender que esas suposiciones están antes de que escribas cualquier otra cosa.</p>
<p>La primera suposición es que los resultados de tu búsqueda van a ser una colección de objetos que tengan una propiedad para imagen, título, subtitulo y descripción. Es improbable que tu información tenga esta información y no quieras forzarla a hacerlo para que se alinee a lo que te están pidiendo. La razón para esta suposición es muy simple.</p>
<p>Abre brevemente su página de PaginaResultados.xaml. Mira al control de tipo GridView llamado “resultsGridView” así como al control ListView llamado “resultasListVie”. Hemos ya cubierto estos tipos de controles en el <a href="http://blogs.ligasilverlight.com/2013/01/31-das-de-windows-8-da-4-controles-nuevos/" target="_blank">Día 4</a> pero ellos tienen ahora un ItemTemplate ya definido. Aquí es donde viven todas las suposiciones. Están usando el DataTemplate por defecto llamado “StandardSmallIcon300x70ItemTemplate”. Si das un vistazo a tu archivo “Common/StandardStyles.xaml” lo encontrarás ahí y está tratando de enlazar aquellas cuatro propiedades que mencioné antes. <strong>No queremos usar esa plantilla, pero es un buen inicio</strong>.</p>
<p>Lo que he hecho es copiar esa DataTemplate completa y moverla a mi página PaginaResultados.xaml en la sección de recursos. Aquí está lo que he modificado de la sección.</p>
<pre class="brush: xml">&lt;page .Resources&gt;
&lt;collectionviewsource x:Name=&quot;resultsViewSource&quot; Source=&quot;{Binding Results}&quot;&gt;&lt;/collectionviewsource&gt;
&lt;collectionviewsource x:Name=&quot;filtersViewSource&quot; Source=&quot;{Binding Filters}&quot;&gt;&lt;/collectionviewsource&gt;
&lt;common:booleantovisibilityconverter x:Key=&quot;BooleanToVisibilityConverter&quot;&gt;&lt;/common:booleantovisibilityconverter&gt;
&lt;!-- TODO: Update the following string to be the name of your app --&gt;
&lt;x:string x:Key=&quot;AppName&quot;&gt;App Name&lt;/x:string&gt;
&lt;datatemplate x:Key=&quot;ModifiedSmallIcon300x70ItemTemplate&quot;&gt;
&lt;grid Width=&quot;294&quot; Margin=&quot;6&quot;&gt;
&lt;/grid&gt;&lt;grid .ColumnDefinitions&gt;
&lt;columndefinition Width=&quot;Auto&quot;&gt;&lt;/columndefinition&gt;
&lt;columndefinition Width=&quot;*&quot;&gt;&lt;/columndefinition&gt;
&lt;/grid&gt;
&lt;border Background=&quot;{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}&quot; Margin=&quot;0,0,0,10&quot; Width=&quot;40&quot; Height=&quot;40&quot;&gt;
&lt;textblock Text=&quot;{Binding Symbol}&quot; FontSize=&quot;32&quot; FontWeight=&quot;Bold&quot; TextAlignment=&quot;Center&quot; VerticalAlignment=&quot;Center&quot;&gt;&lt;/textblock&gt;
&lt;/border&gt;
&lt;stackpanel Grid.Column=&quot;1&quot; Margin=&quot;10,-10,0,0&quot;&gt;
&lt;textblock Text=&quot;{Binding Name}&quot; Style=&quot;{StaticResource BodyTextStyle}&quot; TextWrapping=&quot;NoWrap&quot;&gt;&lt;/textblock&gt;
&lt;textblock Text=&quot;{Binding Category}&quot; Style=&quot;{StaticResource BodyTextStyle}&quot; Foreground=&quot;{StaticResource ApplicationSecondaryForegroundThemeBrush}&quot; TextWrapping=&quot;NoWrap&quot;&gt;&lt;/textblock&gt;
&lt;textblock Text=&quot;{Binding State}&quot; Style=&quot;{StaticResource BodyTextStyle}&quot; Foreground=&quot;{StaticResource ApplicationSecondaryForegroundThemeBrush}&quot; TextWrapping=&quot;NoWrap&quot;&gt;&lt;/textblock&gt;
&lt;/stackpanel&gt;

&lt;/datatemplate&gt;
&lt;/page&gt;</pre>
<p>Puedes ver que es casi idéntico al original pero lo he renombrado a “ModifiedSmallIcon300x70ItemTemplate”. Las otras diferencias son quehe cambiado el control Imagen por otro TextBlock y cambiado los enlazados a las propiedades que mi objeto posee, Simbolo, Nombre,Categoria y Estado. He cambiado también el nombre de los ItemTemplates usados por el control GridView y ListView para apuntar a mi versión modificada también. Ahora podemos comenzar a dar algunos resultados a nuestra Página de Resultados.</p>
<p>¿Recuerdas esos controles desde antes? Los que estaban en el método Filter_SelectionChanged()? Vamos a volver a visitarlos y agregar algo de código.</p>
<pre class="brush: csharp">IEnumerable&lt;elemento&gt; resultadosBusqueda = from el in elementos
where el.Nombre.ToLower().Contains(cadenaBusqueda)
orderby el.Nombre ascending
select el;

DefaultViewModel[&quot;Resultados&quot;] = resultadosBusqueda;

object resultados;
IEnumerable&lt;/elemento&gt;&lt;elemento&gt; coleccionResultados;

if (DefaultViewModel.TryGetValue(&quot;Resultados&quot;, out resultados) &amp;amp;amp;amp;&amp;amp;amp;amp;
(coleccionResultados = resultados as IEnumerable&lt;/elemento&gt;&lt;elemento&gt;) != null &amp;amp;amp;amp;&amp;amp;amp;amp;
coleccionResultados.Count() != 0)
{
VisualStateManager.GoToState(this, &quot;ResultsFound&quot;, true);
return;
}</pre>
<p>He agregado una sentencia LINQ simple para obtener la información adecuada desde mi fuente de datos y asigné los resultados a this.DefaultViewModel[“Resultados”]. Esto es lo que llenará a nuestro control GridView.</p>
<p>También he modificado un poco del código por defecto en la sección de abajo para llamar explícitamente que estoy usando una lista IEnumerable de objetos de tipo Element. Si tu término de búsqueda tiene de hecho algunos resultados, esta lógica será la que muestre los resultados.</p>
<p>En este punto, si ejecutas tu proyecto y haces una búsqueda deberías obtener algo así como lo que se ve a continuación.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image4.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb4.png" width="600" height="335" border="0" /></a></p>
<p>Puedes incluso cerrar la aplicación enteramente, ejecutar una búsqueda en tu máquina y después elegir tu aplicación. Trabaja exactamente de la misma forma.</p>
<p>Hasta aquí, habrás pensado que estamos listos. Bueno, estás equivocado. Tenemos mucho de que hablar aún. Específicamente que hará el usuario una vez que tenga los valores resultantes de acuerdo a lo que ellos han buscado. Vamos a ver lo siguiente.</p>
<p>Definir sugerencias de búsqueda</p>
<p>Este es un proceso muy simple de hecho, específicamente comparado con lo que hemos hecho en este artículo. En nuestra página PaginaResultados.xaml necesitamos iniciar con una referencia a la clase SearchPane (quizá también necesites agregar la referencia a Windows.ApplicationModel.Search). También iniciamos una instancia del objeto SerachPane in nuestro constructor.</p>
<pre class="brush: csharp">SearchPane panelBusqueda;

public PaginaResultados()
{
this.InitializeComponent();
CrearListaElementos();
panelBusqueda = SearchPane.GetForCurrentView();
}</pre>
<p>Una vez que lo hayas hecho, el siguiente paso es crear un manejador de eventos para el evento SuggestionsRequested. Crea un nuevo método OnNavigatedTo como el de abajo y agrega el nuevo manejador de eventos (también retíralo en el método OnNavigatedFrom).</p>
<pre class="brush: csharp">protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
panelBusqueda.SuggestionsRequested += searchPane_SuggestionsRequested;
}

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
base.OnNavigatingFrom(e);
panelBusqueda.SuggestionsRequested -= searchPane_SuggestionsRequested;
}

void searchPane_SuggestionsRequested(SearchPane sender, SearchPaneSuggestionsRequestedEventArgs args)
{
args.Request.SearchSuggestionCollection.AppendQuerySuggestions((from el in elementos
where el.Nombre.ToLower().StartsWith(args.QueryText.ToLower()) || el.Simbolo.ToLower().StartsWith(args.QueryText.ToLower())
orderby el.Nombre ascending
select el.Nombre).Take(5));
}</pre>
<p>Puedes ver que simplemente estoy dándole a la colección un conjunto de máximo cinco valores como recomendación. Esto es lo más que podrá mostrar así que estoy limitando mis resultados a cinco por mucho.</p>
<p>¡Eso es todo! Si tu buscas por un elemento en esta aplicación ahora, verás (basado en mi consulta) que si escribiste caracteres que coincidan con el nombre de un elemento nombre o símbolo obtendrás un máximo de cinco recomendaciones.</p>
<h2>Forzar la búsqueda cuando las pulsaciones de teclado sean detectadas</h2>
<p>Hay un último truco del que deberíamos hablar y es permitir al usuario abrir la caja de búsqueda simplemente escribiendo. Para agregar una simple declaración en nuestros métodos OnLaunched y OnSuspending en nuestro archivo App.xaml.cs, podremos habilitar esta funcionalidad a través de nuestra aplicación entera.</p>
<p>Agrega esta línea a tu método OnLaunched.</p>
<pre class="brush: csharp">SearchPane.GetForCurrentView().ShowOnKeyboardInput = true;</pre>
<p>Y esta línea a tu método OnSuspending para deshabilitar lo cuando la aplicación esté cerrada.</p>
<pre class="brush: csharp">SearchPane.GetForCurrentView().ShowOnKeyboardInput = false;</pre>
<p>¡Y eso es todo! Corre tu aplicación y solo comienza a escribir. El botón de búsqueda se abrirá automáticamente y comenzará a capturar tus teclas presionadas.</p>
<h2>Declaraciones</h2>
<p>Hay una última cosa que quiero cubrir en este artículo y es mas para tu conocimiento que para algo que necesites hacer. Cuando tu agregaste el contrato de búsqueda a tu proyecto se agregaron muchos archivos a tu proyecto pero también hubo una declaración hecha en tu archivo appxmanifest. Si tu abres ese archivo y navegas a la tabla de Declaraciones verás algo como lo siguiente.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image5.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/03/image_thumb5.png" width="400" height="252" border="0" /></a></p>
<p>Sin esta declaración ninguna de las funcionalidades que has agregado a tu aplicación será capaz de funcionar. Obtendrás un erro diciendo que el acceso esta negado.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/6XAMLDeclarationError.png"><img title="6-XAML-DeclarationError" alt="6-XAML-DeclarationError" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/6XAMLDeclarationError_thumb.png" width="500" height="284" border="0" /></a></p>
<p>Solo recuerda que necesitas declarar que estás usando la búsqueda antes de que tu aplicación este habilitada para hacer uso de esta API.</p>
<p>En resumen</p>
<p>Hoy, tomamos un vistazo rápido al agregar Búsquedas en tu aplicación. El contrato de búsqueda le da una nueva manera a tus aplicaciones de mostrarse a sus usuarios. Ahora solo necesitas determinar que es exatamente lo que quieres mostrar. Colócate frente a tus usuarios asegurará que estén inclinados por tu aplicación. Entre más lo uses más vida le darás.</p>
<p>Puedes descargar la solución entera de ejemplo desde aquí.</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia6.zip" target="_blank"><img class="alignnone" alt="" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadXAML5.png" width="150" height="150" /></a></p>
<p>&nbsp;</p>
<p>Mañana, vamos al paso final de la exploración de contratos, Compartir. ¡Nos vemos entonces!</elemento></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/03/31-das-de-windows-8-da-6-el-contrato-de-bsqueda/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 d&#237;as de Windows 8 &#124; D&#237;a 5: El contrato de configuraciones</title>
		<link>http://blogs.ligasilverlight.com/2013/01/31-das-de-windows-8-da-5-el-contrato-de-configuraciones/</link>
		<comments>http://blogs.ligasilverlight.com/2013/01/31-das-de-windows-8-da-5-el-contrato-de-configuraciones/#comments</comments>
		<pubDate>Tue, 29 Jan 2013 00:00:22 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3871</guid>
		<description><![CDATA[Este artículo es una traducción de “Día 5: El contrato de configuraciones” de Jeff Blakenburg. Puedes encontrar aquí la versión original en inglés. Hoy vamos a lanzar una serie de artículos enfocados en contratos iniciando con el contrato de configuraciones. Las oportunidades de que tu aplicación los use son realmente altas y quizá odies lidiar con ello. La configuración de la aplicación es solo una parte de algo más grande en Windows 8 llamado contratos. Vamos a iniciar nuestra conversación de configuraciones con la definición de Microsoft de contratos. Contratos: Un contrato es como un acuerdo entre una o más aplicaciones. Los contratos definen los requerimientos que la aplicación debe cumplir para participar en estas interacciones únicas en Windows. Por ejemplo, Windows le permite a los usuarios compartir contenido de una aplicación a otra. La aplicación que comparte contenido hacia afuera soporta un contrato fuente al cumplir con requerimientos específicos mientras que la aplicación que recibe el contenido compartido soporta un contrato al cumplir un conjunto diferente de requerimientos. Ninguna aplicación necesita saber nada acerca de la otra. Cada aplicación que participa en el contrato de compartir puede ser independiente sin contar el flujo de información al compartir datos por [...]]]></description>
				<content:encoded><![CDATA[<p>Este artículo es una traducción de “Día 5: El contrato de configuraciones” de Jeff Blakenburg. <a href="http://www.jeffblankenburg.com/2012/11/05/31-days-of-windows-8-day-5-settings-contract" target="_blank">Puedes encontrar aquí la versión original en inglés.</a></p>
<p>Hoy vamos a lanzar una serie de artículos enfocados en contratos iniciando con el contrato de configuraciones. Las oportunidades de que tu aplicación los use son realmente altas y quizá odies lidiar con ello. La configuración de la aplicación es solo una parte de algo más grande en Windows 8 llamado contratos. Vamos a iniciar nuestra conversación de configuraciones con la <a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh464906.aspx" target="_blank">definición de Microsoft de contratos</a>.</p>
<p><strong>Contratos</strong>: Un contrato es como un acuerdo entre una o más aplicaciones. Los contratos definen los requerimientos que la aplicación debe cumplir para participar en estas interacciones únicas en Windows. Por ejemplo, Windows le permite a los usuarios compartir contenido de una aplicación a otra. La aplicación que comparte contenido hacia afuera soporta un contrato fuente al cumplir con requerimientos específicos mientras que la aplicación que recibe el contenido compartido soporta un contrato al cumplir un conjunto diferente de requerimientos. Ninguna aplicación necesita saber nada acerca de la otra. Cada aplicación que participa en el contrato de compartir puede ser independiente sin contar el flujo de información al compartir datos por Windows.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/contrato.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="contrato" alt="contrato" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/contrato_thumb.png" width="73" height="425" border="0" /></a></p>
<p>Interesante, esto suena como a una “interfaz administrada” entre aplicaciones en el sistema operativo Windows. Hay cinco contratos disponibles para nuestras aplicaciones:</p>
<ul>
<li>Selector de archivos</li>
<li>Reproducir</li>
<li>Búsqueda</li>
<li>Configuración</li>
<li>Compartir</li>
</ul>
<p>Tal como una interfaz típica de programación lo que significa que puede estar compartiendo algún tipo de funcionalidad sin que la otra sepa acerca de ello.</p>
<p>Con Windows 8, todo esto parece suceder en el nivel de experiencia de usuario. ¿Qué quiere decir? Bueno, vamos a tomar el contrato de compartir por ejemplo. Simplemente colócalo, las aplicaciones le dicen al sistema operativo para lo que ellas quieren ingresar. En el caso de compartir quizá sea aceptar o compartir una imagen, Windows se encargará del resto.</p>
<p>Imagina un escenario donde encuentres un gran artículo mientras navegas en la web en algo como Internet Explorer. Quieres compartirlo a alguien más vía correo o Twitter. Asumiendo que tenías una aplicación instalada que los gestione y ellas acepten el compartir una URI entonces Internet Explorer podría compartírselo. Mejor aún, esas aplicaciones ni siquiera tendrían que estar ejecutándose para hacerlo. Windows se encarga de hacer toda la magia.</p>
<p>Suena como una interfaz típica de programación ¿No es así?</p>
<p><span style="font-size: large;"><strong>Empezando simples</strong></span></p>
<p>Si das un vistazo a muchos de los ejemplos afuera, vas a encontrar un conjunto complejo de métodos en diferentes páginas, si eres como yo terminarás confundido. Esta serie de artículos esta hecha para hacer los temas como este simples de entender y usar de modo que eso es lo que haré.</p>
<p>Cuando nuestra aplicación inicia hay un método en el archivo App.xaml.cs llamado <strong>OnLaunched </strong>que es ejecutado. Al principio de <strong>OnLaunched</strong> vamos a crear un manejador de eventos para cuando el usuario intente abrir el panel de configuración. Tus elementos no serán agregados hasta que el usuario trate de abrir la barra lateral (Charms bar) Este evento podrías ser usado cuando necesites pauser tu aplicación o juego y las configuraciones sean abiertas.</p>
<pre class="brush: csharp">protected override void OnLaunched(LaunchActivatedEventArgs args)
{
SettingsPane.GetForCurrentView().CommandsRequested += App_CommandsRequested;
Frame rootFrame = Window.Current.Content as Frame;
...
}</pre>
<p>Una vez que has agregado el manejador de eventos, podemos ir abajo para agregar <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.applicationsettings.settingscommand.aspx" target="_blank">SettingsComands</a> a nuestro <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.applicationsettings.settingspane.aspx#properties" target="_blank">SettingsPane</a><strong>.</strong> Hay muchos pasos para crear un SettingsCommand:</p>
<ul>
<li><strong>Crear un nuevo SettingsCommand:</strong> Esto requiere tres propiedades; un ID, una etiqueta y una acción para realizar cuando el comando sea presionado. En nuestro caso esto será creando un control Popup, llenarlo con un control de usuario que vamos a crear y desplazarlo desde un lado de la pantalla.</li>
<li><strong>Manejar todos los casos de la destitución del control Popup:</strong> Nosotros también necesitaremos manejar el como regresar a nuestra aplicación cuando el usuario haya terminado la operación.</li>
</ul>
<p>Si no lo has generado, necesitas un método para el manejador de eventos llamado <strong>App_CommandRequested</strong> o como elijas que puedes llamarlo. Aquí es donde haremos el volumen de nuestra lógica para que <strong>SettingsPane</strong> se comporte de la manera que queremos. Aquí está como luce el mío.</p>
<p>&nbsp;</p>
<pre class="brush: csharp">void App_CommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args)
{
SettingsCommand comando = new SettingsCommand(&quot;about&quot;, &quot;Acerca de esta aplicación&quot;, (handler) =&gt;
{
Popup popup = CrearItemConfiguracion(new AcercaDe(), 646);
popup.IsOpen = true;
});

args.Request.ApplicationCommands.Add(comando);
}</pre>
<p>&nbsp;</p>
<p>Como puedes ver arriba, creamos un nuevo objeto de tipo SettingsCommand y lo completamos con tres valores. A menos de que planees cambiar tu SettingsPane en tiempo de ejecución, el primero no importará mucho. Es un simple ID que puedes usar para hacer referencia al SettingsCommand después.La etiqueta “Acerca de esta aplicación” puede ser cualquier valor de tipo cadena pero recomendaría mantenerla por debajo de los 40 caracteres porque usar más podría truncarla. Finalmente, tenemos nuestro manejador para este comando. Este es el código que será ejecutado cuando el usuario seleccione la etiqueta. He simplificado este proceso usando una expresión lambda para definir el código y puedes ver que estoy creando un control de tipo <strong>Popup</strong> y ajustando su propiedad <strong>isOpen </strong>a true. Cambiar esta propiedad es lo que hace que el control Popup aparezca en la pantalla.</p>
<p><strong><span style="font-size: large;">Creando el control Popup</span></strong></p>
<p>En esta sección vamos a dar un vistazo al método BuildSettingsItem que he creado. Quizá hayas notadoque en el código de ejemplo de arriba que se están pasando dos valores. El primero es un control de usuario personalizado que estaremos creando en poco. Por ahora solo checa que AboutPage.xaml es un control de usuario que deberemos crear y que es usado para llenar al control Popup.</p>
<pre class="brush: csharp">private Popup CrearItemConfiguracion(UserControl control, int ancho)
{
Popup mensaje = new Popup();
mensaje.IsLightDismissEnabled = true;
mensaje.ChildTransitions = new TransitionCollection();
mensaje.ChildTransitions.Add(new PaneThemeTransition()
{
Edge = (SettingsPane.Edge == SettingsEdgeLocation.Right) ? EdgeTransitionLocation.Right : EdgeTransitionLocation.Left
});

control.Width = ancho;
control.Height = Window.Current.Bounds.Height;
mensaje.Child = control;

mensaje.SetValue(Canvas.LeftProperty, SettingsPane.Edge == SettingsEdgeLocation.Right ? (Window.Current.Bounds.Width - ancho) : 0);
mensaje.SetValue(Canvas.TopProperty, 0);

return mensaje;
}</pre>
<p>Mucho del código de este método es de “relleno” lo cual es para hacer de la IU un poco más amena y fluida. Las líneas específicas que son importantes son las últimas seis. Definimos el ancho y el alto de nuestro control de usuario, <strong>control </strong>y después lo asignamos como un hijo de nuestro control Popup <strong>mensaje </strong>(El ancho es recomendado de 346 o 646, el alto debería ser del tamaño de la pantalla del usuario de acuerdo a la <a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh770544.aspx" target="_blank">guía de Microsoft</a>). Finalmente ajustamos las propiedades <strong>left</strong> y <strong>top</strong> del popup de modo que aparezca en la ubicación adecuada y pasamos el popup de vuelta a nuestro SettingsCommand.</p>
<p><strong>NOTA:</strong> Windows 8 puede de hecho transformar un bit basado en los ajustes de localización que han sido aplicados a la máquina. En países donde el lenguaje es leído de derecha a izquierda la barra de accesos está ubicada a la izquierda en lugar de la derecha. Esta es la razón por la que cuando asigne la propiedad <strong>LeftProperty</strong> de nuestra popup tenemos que verificar para ver en cual <strong>límite</strong> se encuentra el SettingPane. Deberías ver una lógica similar para el límite de <strong>PaneThemeTransition</strong> poco antes en este método.</p>
<p>Ciertamente no debes romper todo el código en pedazos como yo lo hice pero creo que eso hace las cosas más simples, especialmente cuando quieres crear múltiples elementos de tipo <strong>SettingsCommand.</strong></p>
<p><strong><span style="font-size: large;">Creando el control de usuario</span></strong></p>
<p>Lo prometí antes, volveríamos aquí y aquí estamos. En este punto hemos tomado consideración de todo el andamio que es requerido para hacer funcionar al contrato de ajustes. Ahora todo lo que tenemos que hacer es construir una página para que se muestre. Agrega un nuevo control de usuario (<strong>UserControl</strong>) a tu proyecto. Yo lo he llamado <strong>AcercaDe.xaml </strong>para coincidir con el código que escribimos antes pero obviamente tu podrás usar el nombre que gustes.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/image1.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/image_thumb2.png" width="500" height="304" border="0" /></a></p>
<p>El código de este archivo esta enteramente en tus manos. Aunque hay algunas recomendaciones en como debería lucir tu panel de ajustes, no hay reglas específicas al respecto. Lo que yo te estoy dando en el siguiente código de ejemplo y una plantilla de orden. Hará a tus aplicaciones lucir como esto.</p>
<p><img alt="" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/5SettingsPanelShowing.png" width="500" height="312" /></p>
<p>De cualquier forma puedes usar cualquier XAML que te guste para hacer brillar a tu Popup.</p>
<pre class="brush: xml">&lt;border BorderBrush=&quot;#00b2f0&quot; BorderThickness=&quot;1,0,0,0&quot;&gt;
&lt;grid Background=&quot;White&quot; VerticalAlignment=&quot;Stretch&quot;&gt;
&lt;/grid&gt;&lt;grid .RowDefinitions&gt;
&lt;rowdefinition Height=&quot;Auto&quot;&gt;&lt;/rowdefinition&gt;
&lt;rowdefinition Height=&quot;*&quot;&gt;&lt;/rowdefinition&gt;
&lt;/grid&gt;

&lt;!-- HEADER --&gt;
&lt;grid Background=&quot;#00b2f0&quot; Grid.Row=&quot;0&quot;&gt;
&lt;/grid&gt;&lt;grid .ColumnDefinitions&gt;
&lt;columndefinition Width=&quot;*&quot;&gt;&lt;/columndefinition&gt;
&lt;/grid&gt;

&lt;stackpanel Orientation=&quot;Horizontal&quot; Grid.Column=&quot;0&quot; Margin=&quot;40, 32, 17, 13&quot;&gt;
&lt;button x:Name=&quot;btnAtras&quot; Margin=&quot;0,3,0,0&quot; Style=&quot;{StaticResource BackButtonStyle}&quot; Click=&quot;btnAtras_Click&quot;&gt;&lt;/button&gt;
&lt;textblock Margin=&quot;10,10,0,0&quot; FontFamily=&quot;Segoe UI&quot; FontWeight=&quot;SemiLight&quot; FontSize=&quot;24.6667&quot; Text=&quot;Acerca de esta app&quot; Foreground=&quot;White&quot;&gt;&lt;/textblock&gt;
&lt;/stackpanel&gt;
&lt;image Source=&quot;Assets/SmallLogo.png&quot; Width=&quot;29&quot; Height=&quot;29&quot; Margin=&quot;353,46,17,21&quot;&gt;&lt;/image&gt;


&lt;!-- CONTENT AREA --&gt;
&lt;scrollviewer VerticalScrollBarVisibility=&quot;Auto&quot; Grid.Row=&quot;1&quot;&gt;
&lt;grid Margin=&quot;40,33,40,39&quot; VerticalAlignment=&quot;Top&quot; Grid.RowSpan=&quot;3&quot;&gt;
&lt;stackpanel&gt;

&lt;/stackpanel&gt;
&lt;/grid&gt;
&lt;/scrollviewer&gt;

&lt;/border&gt;</pre>
<p>No hay nada sustancialmente complicado acerca de este diseño. Tenemos tres controles que son importantes para el encabezado.</p>
<ul>
<li><strong>Button – </strong>El control del botón es la flecha con círculo. Hemos colocado un manejador del evento click llamado <strong>btnAtras_Click</strong> y te mostraré el código que contiene al final de este artículo.</li>
<li><strong>Textblock – </strong>Contiene el nombre de los ajustes que el usuario estará viendo. En la mayoría de los casos, esto debería coincidir con las palabras que muestras en el SettingsPane.</li>
<li><strong>Image</strong> – Esta imagen ciertamente no es requerida pero contribuye a reforzar tu marca y logo de una manera adicional. Puedo recomendarte el mostrar tu logo tanto como puedas y este es un gran lugar para hacerlo.</li>
</ul>
<p>Hasta el fondo, tenemos una sección marcada como área de contenido. Dentro del contenedor StackPanel es donde deberías agregar tu contenido. Este puede ser lo que sea. pero trata de mantenerlo simple. CheckBox. ToggleButton, TextBox, RedioButton, etc. Los controles simples con la vista puesta en una tarea simple.</p>
<p>Aquí está el código para el método</p>
<pre class="brush: csharp">private void BackButton_Click(object sender, RoutedEventArgs e)
{
Popup parent = this.Parent as Popup;
if (parent != null)
{
parent.IsOpen = false;
}

// If the app is not snapped, then the back button shows the Settings pane again.
if (Windows.UI.ViewManagement.ApplicationView.Value != Windows.UI.ViewManagement.ApplicationViewState.Snapped)
{
SettingsPane.Show();
}
}</pre>
<p>Puedes ver que cerramos nuestro control popup padre y si la aplicacion no está en un estado <strong>snapped</strong> reabrirá el SettingsPane como lo haría un botón de retroceso. ¡Eso es todo!</p>
<p>Oh. Espera. ¡Querías saber como <strong>salvar</strong> la información del usuario?</p>
<p>Guardando información</p>
<p>Windows 8 ha cambiado muchas cosas y una de las conductas base que se han ido es el concepto del botón <strong>Guardar. </strong>Tanto como sea posible quiero que elimines ese concepto de tu cabeza.</p>
<p>Cuando un usuario cambia un valor en sus preferencias.</p>
<p>NO esperes para que ellos presionen un botón de <strong>Guardar cambios.</strong></p>
<p>NO les preguntes <strong>¿Está seguro?</strong> cuando el cambio es reversible.</p>
<p>Guarda la información en el momento en que ellos la cambien y dale a tu usuario crédito suficiente para hacer solo los cambios que el quiera hacer. Si ellos presionan la opción <strong>Borrar toda tu información</strong> esa podría ser la razón para confirmar que ellos están seguros pero solo hazlo porque no es reversible. No porque pienses que tu usuario es un idiota.</p>
<p>Y para el COMO, vamos a esperar en este tema para el día 8 y entonces consumiremos nuestro tiempo en guardar la información de ambas formas, tanto local como los valores en todas las máquinas en las que el usuario tenga una cuenta.</p>
<p><strong><span style="font-size: large;">Resumen</span></strong></p>
<p>Cuando toqué por primera vez Windows 8 yo seguía escuchando la frase “Win as 1” (Gana como uno). Gana como 1 es uno de los principales principios de Windows. Al principio esto sonaba como un discurso de marketing pero de hecho esta muy lejos de serlo. Habiendo trabajado con Windows 8 por un tiempo, los contratos son una prueba genial de este principio. Cosas como los ajustes de la aplicación ahora están centralizados en el usuario, nuestras aplicaciones ahora pueden pasar mas tiempo enfocadas en mostrar sus elementos clave en lugar de lidiar con cosas como las configuraciones. Además, ahora que las configuraciones son consistentes en todas las aplicaciones, nunca más tendremos que enseñar a un usuario a usar las configuraciones más que una sola vez.</p>
<p><em>Yo solo tuve que pensar en como abrir una puerta y después, las pude abrir todas</em></p>
<p>-Yo lo invente</p>
<p>Hoy, vimos el contrato de configuraciones el cual es solo uno de muchos contratos que encontrarás en Windows 8. Así como una interfaz de programación, los contratos en Windows 8 le ofrecen a tu aplicación una manera única de extender tu aplicación más allá de la definición tradicional de un <strong>proceso de aplicación</strong> dando mejor una consistencia en el uso de interfaces a nuestros usuarios.</p>
<p>Puedes descargar la solución entera de ejemplo aquí.</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia3.zip"><img alt="" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadXAML5.png" /></a></p>
<p>Mañana vamos a mirar al contrato de Búsqueda. Buscar el algo que encontrarás muy útil no solo desde una perspectiva de usabilidad sino también porque es una manera rápida de continuar manteniendo tu aplicación en la cima de tus usuarios. ¡Nos vemos!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/01/31-das-de-windows-8-da-5-el-contrato-de-configuraciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 d&#237;as de Windows 8 &#124; D&#237;a 4: Controles Nuevos</title>
		<link>http://blogs.ligasilverlight.com/2013/01/31-das-de-windows-8-da-4-controles-nuevos/</link>
		<comments>http://blogs.ligasilverlight.com/2013/01/31-das-de-windows-8-da-4-controles-nuevos/#comments</comments>
		<pubDate>Mon, 07 Jan 2013 17:09:00 +0000</pubDate>
		<dc:creator>Jorge Castro</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>
		<category><![CDATA[controles]]></category>
		<category><![CDATA[XAML]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3845</guid>
		<description><![CDATA[Este artículo es una traducción del Día #4 de la serie 31 días de Windows 8 de Jeff Blakenburg. Hoy volveremos a lo básico, y vamos a ver algunos de los nuevos controles de layout que tenemos disponibles en aplicaciones XAML. Éste artículo cubrirá específicamente ésta lista de controles: AppBar FlipView GridView ProgressRing ScrollViewer SemanticZoom WebView Si quieres ver la lista completa de controles disponibles en XAML para Windows 8, puedes darle un vistazo a MSDN y leer más aquí. AppBar La primera vez que me senté a escribir ésta sección, me acorde de cuando estaba trabajando con la ApplicationBar en el desarrollo de Windows Phone. Era bastante claro y conciso, pero tenías que crear imágenes para cada icono, y luego el SO de Windows Phone agregaba el círculo por ti. Cuando empecé a ver el AppBar para Windows 8, me encanto descubrir que no solo las imágenes eran innecesarias para la mayoría de los iconos que verás, pero también implementarlo es de lo más simple. Aquí tienes un vistazo a la AppBar que vamos a crear: Como puedes ver en la imagen arriba (clic para agrandar), vamos a implementar ambos una AppBar superior e inferior. Aunque técnicamente puedes poner [...]]]></description>
				<content:encoded><![CDATA[<p>Este artículo es una traducción del Día #4 de la serie <a href="http://31daysofwindows8.com/">31 días de Windows 8</a> de Jeff Blakenburg.</p>
<p>Hoy volveremos a lo básico, y vamos a ver algunos de los nuevos controles de layout que tenemos disponibles en aplicaciones XAML. Éste artículo cubrirá específicamente ésta lista de controles:</p>
<ul>
<li>AppBar</li>
<li>FlipView</li>
<li>GridView</li>
<li>ProgressRing</li>
<li>ScrollViewer</li>
<li>SemanticZoom</li>
<li>WebView</li>
</ul>
<p>Si quieres ver la lista completa de controles disponibles en XAML para Windows 8, puedes <a href="http://msdn.microsoft.com/library/windows/apps/BR227716">darle un vistazo a MSDN y leer más aquí</a>.</p>
<h3>AppBar</h3>
<p>La primera vez que me senté a escribir ésta sección, me acorde de cuando estaba trabajando con la <a href="http://www.jeffblankenburg.com/2010/10/06/31-days-of-windows-phone-day-6-application-bar/">ApplicationBar en el desarrollo de Windows Phone</a>. Era bastante claro y conciso, pero tenías que crear imágenes para cada icono, y luego el SO de Windows Phone agregaba el círculo por ti.</p>
<p>Cuando empecé a ver el AppBar para Windows 8, me encanto descubrir que no solo las imágenes eran innecesarias para la mayoría de los iconos que verás, pero también implementarlo es de lo más simple. Aquí tienes un vistazo a la AppBar que vamos a crear:</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/AppBarSample1.png"><img style="border-width: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image001" alt="clip_image001" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image001.png" width="644" height="403" border="0" /></a></p>
<p>Como puedes ver en la imagen arriba (clic para agrandar), vamos a implementar ambos una AppBar superior e inferior. Aunque técnicamente puedes poner cualquier cosa en el AppBar, hay un par de “reglas” que se deben destacar:</p>
<ol>
<li>El AppBar inferior está generalmente dividido en dos mitades. La izquierda es para comandos específicos del contexto, basado en el contenido actual en pantalla. La derecha es usado más para comandos universales que pueden ser accedidos desde cualquier lugar en tu aplicación.</li>
<li>El AppBar superior supuestamente se usa para navegación y otras opciones necesarias en tu app, similar al listón que puedes encontrar en alguna de las apps de Office.</li>
</ol>
<p>Mencione antes que no necesitas ningún arte para los iconos con círculos alrededor de ellos, y es totalmente cierto. De hecho, no necesitas hacer casi nada más que crear un botón y aplicar alguno de los 202 estilos de botón de AppBar que Microsoft ha provisto por defecto. Cada uno de ellos usa la fuente “Segoe UI Icons” para su iconografía, y hay muchos de ellos incluidos en tu archivo StandardStyles.xaml:</p>
<p><a href="http://www.jeffblankenburg.com/downloads/31daysofwindows8/AppBarIconList.png"><img style="border-width: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image002" alt="clip_image002" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image002.png" width="644" height="370" border="0" /></a></p>
<p>Haz click en la imagen para verlo en su magnífico tamaño completo. Vas a querer conservarlo. (También, un GRAN agradecimiento a <a href="http://twitter.com/browniepoints">Mike Brown</a> por crear la <a href="http://jeffblankenburg.com/downloads/31daysofwindows8/appbariconlistlight.png">versión invertida de ésta imagen</a> para impresión. Definitivamente te ahorrar algo de tinta.</p>
<p><a href="http://jeffblankenburg.com/downloads/31daysofwindows8/appbariconlistlight.png"><img style="border-width: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image004" alt="clip_image004" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image004.jpg" width="644" height="371" border="0" /></a></p>
<p>OK, tiempo de pasar a la parte de implementación de ésta sección. Para que el AppBar responda a los gestos del usuario, simplemente necesitas crear una nueva Page.TopAppBar o Page.BottomAppBar, de esta forma:</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:2b574e23-bf9b-4e5a-9546-413dfe2ecf26" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;Page.BottomAppBar&gt;
    &lt;AppBar&gt;
        &lt;!--Pon aquí cualquier contenido que quieras. --&gt; 
    &lt;/AppBar&gt; 
&lt;/Page.BottomAppBar&gt;</pre>
</div>
<p>Realmente puedes poner cualquier cosa en donde están los comentarios en el ejemplo anterior, pero si quieres seguir las reglas, preferirás dividir el AppBar en dos secciones. En ese caso, aquí hay un ejemplo que incorpora un Grid para dividir el AppBar a la mitad, y usa dos StackPanels para orientar los iconos apropiadamente. Ésta es la barra inferior del screenshot que use arriba con los bloques de colores del arcoíris arriba.</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:23b8ae3d-4565-48d2-9d9e-6eb8d20ba16e" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;Page.BottomAppBar&gt;
    &lt;AppBar&gt;
        &lt;Grid&gt;
            &lt;Grid.ColumnDefinitions&gt;
                &lt;ColumnDefinition Width="50*" /&gt;
                &lt;ColumnDefinition Width="50*" /&gt;
            &lt;/Grid.ColumnDefinitions&gt;
            &lt;StackPanel Orientation="Horizontal" HorizontalAlignment="Left"&gt;
                &lt;Button x:Name="EditButton" Style="{StaticResource EditAppBarButtonStyle}" Tag="Edit" /&gt;
            &lt;/StackPanel&gt;
            &lt;StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right"&gt;
                &lt;Button Style="{StaticResource AddAppBarButtonStyle}" /&gt;
                &lt;Button Style="{StaticResource HelpAppBarButtonStyle}" /&gt;
                &lt;Button Style="{StaticResource DiscardAppBarButtonStyle}" /&gt;
                &lt;Button Style="{StaticResource DeleteAppBarButtonStyle}" /&gt;

            &lt;/StackPanel&gt;
        &lt;/Grid&gt;
    &lt;/AppBar&gt;
&lt;/Page.BottomAppBar&gt;</pre>
</div>
<p>Puedes ver que cada icono en la barra consiste simplemente de un control de Button con un Style aplicado. Como recordatorio, todos estos 202 estilos pueden encontrarse y editarse en el archivo StandardStyles.xaml de tu proyecto. Por defecto, todos estos estilos están comentados, así puedes elegir descomentarlos todos, o solo descomentar lo que vas a usar.</p>
<p>De cualquier forma, para demostrar que podemos poner cualquier cosa en un AppBar, veamos como hice los botones arcoíris arriba de la página.</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:91704b71-a5f3-46cc-af8a-36ca0181e92c" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;Page.TopAppBar&gt;
    &lt;AppBar&gt;
        &lt;StackPanel Orientation="Horizontal" Margin="10,10,10,10" Height="200"&gt;
            &lt;Rectangle Width="200" Height="200" Fill="Red" Margin="0,0,20,0" Tapped="Rectangle_Tapped" /&gt;
            &lt;Rectangle Width="200" Height="200" Fill="Orange" Margin="0,0,20,0" Tapped="Rectangle_Tapped" /&gt;
            &lt;Rectangle Width="200" Height="200" Fill="Yellow" Margin="0,0,20,0" Tapped="Rectangle_Tapped" /&gt;
            &lt;Rectangle Width="200" Height="200" Fill="Green" Margin="0,0,20,0" Tapped="Rectangle_Tapped" /&gt;
            &lt;Rectangle Width="200" Height="200" Fill="Blue" Margin="0,0,20,0" Tapped="Rectangle_Tapped" /&gt;
            &lt;Rectangle Width="200" Height="200" Fill="Purple" Margin="0,0,20,0" Tapped="Rectangle_Tapped" /&gt;
        &lt;/StackPanel&gt;
    &lt;/AppBar&gt;
&lt;/Page.TopAppBar&gt;</pre>
</div>
<p>He agregado algunos controles Rectangle dentro de un StackPanel, y agregue el evento Tapped a cada uno de ellos. En mi archivo code-behind, determino el color de Fill del rectángulo seleccionado, y pongo el fondo de la página de ese color, usando este método:</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:9c2a1e3a-cf66-46b5-a176-bd46cfade8b8" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">private void Rectangle_Tapped(object sender, TappedRoutedEventArgs e)
        {
            Rectangle rect = sender as Rectangle;
            LayoutRoot.Background = rect.Fill;
        }</pre>
</div>
<p>Descarga el código de ejemplo al final de este artículo para obtener una versión funcional que te permitirá verlo en acción, así como otra página que contiene todos los estilos de iconos en código. Al correr el código, nota que los gestos por defecto de Windows 8 ya funcionan. Arrastrando desde la parte superior o inferior de la pantalla mostrara el AppBar, de igual forma cuando se hace click derecho en la aplicación misma. Dale un vistazo!</p>
<h3>FlipView</h3>
<p>El control <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.flipview.aspx">FlipView</a> es uno de los que construí varias veces desde cero para Windows Phone, porque no existía. El propósito básico de un control FlipView es permitir al usuario “hojear” un grupo específico de contenido. En este ejemplo, vamos a hacer que hojee un grupo de imágenes, y como el FlipView hereda de ItemsControl, podemos enlazarle cualquier tipo de datos, inclusive usando DataTemplates para diseños complejas. Aquí está una vista rápida a nuestro control FlipView en acción (click para agrandar):</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/FlipView1.png"><img style="border-width: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image005" alt="clip_image005" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image005.png" width="644" height="391" border="0" /></a></p>
<p>Como puedes ver, se nos provee con flechas de atrás y adelante que son conscientes de tu posición en la lista de datos, y previene moverse más allá del inicio o final de la lista. Implementar este control no podría ser más simple:</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:0185bb91-082b-4864-b348-0be479bf7af3" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;FlipView x:Name="Flipper" Grid.ColumnSpan="2" Margin="0,240,0,-800"&gt;
    &lt;Image Source="Assets/meme1.jpg" /&gt;
    &lt;Image Source="Assets/meme2.jpg" /&gt;
    &lt;Image Source="Assets/meme3.jpg" /&gt;
    &lt;Image Source="Assets/meme4.jpg" /&gt;
&lt;/FlipView&gt;</pre>
</div>
<p>Todo lo que necesitas es agregar imagines a un FlipView, y así obtendrás un navegador de imágenes simple listo para usarse! Para algo más complejo, podrías querer agregar leyendas a tu navegador de imágenes. Para hacer esto, podemos usar FlipViewItems, y cada Item conteniendo sus propios valores únicos, como sigue:</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:b98ba36b-dcb1-4429-bb66-6770e106672f" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;FlipView x:Name="Flipper" Grid.ColumnSpan="2" Margin="0,240,0,-800"&gt;
    &lt;FlipViewItem&gt;
        &lt;StackPanel&gt;
            &lt;Image Source="Assets/meme1.jpg" Width="500" /&gt;
            &lt;TextBlock Text="Estupido Cerebro" TextAlignment="Center" FontSize="40" /&gt;
        &lt;/StackPanel&gt;
    &lt;/FlipViewItem&gt;
    &lt;FlipViewItem&gt;
        &lt;StackPanel&gt;
            &lt;Image Source="Assets/meme2.jpg" Width="500" /&gt;
            &lt;TextBlock Text="Bebé Borracho" TextAlignment="Center" FontSize="40" /&gt;
        &lt;/StackPanel&gt;
    &lt;/FlipViewItem&gt;
    &lt;FlipViewItem&gt;
        &lt;StackPanel&gt;
            &lt;Image Source="Assets/meme3.jpg" Width="500" /&gt;
            &lt;TextBlock Text="Link Bebé" TextAlignment="Center" FontSize="40" /&gt;
        &lt;/StackPanel&gt;
    &lt;/FlipViewItem&gt;
    &lt;FlipViewItem&gt;
        &lt;StackPanel&gt;
            &lt;Image Source="Assets/meme4.jpg" Width="500" /&gt;
            &lt;TextBlock Text="Keanu Mario" TextAlignment="Center" FontSize="40" /&gt;
        &lt;/StackPanel&gt;
    &lt;/FlipViewItem&gt;
&lt;/FlipView&gt;</pre>
</div>
<p>&nbsp;</p>
<p>Esto resulta en que cada una de nuestras imágenes tiene una pequeña leyenda debajo de esta, como aquí (click en la imagen!):</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/FlipView21.png"><img style="border-width: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image006" alt="clip_image006" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image006.png" width="644" height="391" border="0" /></a></p>
<p>Hay muchas formas de extender este control, así que recomiendo checar el <a href="http://www.jeffblankenburg.com/2012/11/04/31-days-of-windows-8-day-4-new-controls">ejemplo del control FlipView</a> en MSDN también. Me salte databinding específicamente en este ejemplo porque lo cubriremos extensivamente en el siguiente control de nuestra lista: el GridView.</p>
<h3>GridView</h3>
<p>El <a href="http://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.ui.xaml.controls.gridview.aspx">GridView</a> es uno de los controles distintivos que verás en varias aplicaciones Windows 8. Se muestra en casi cualquier demo/ejemplo que verás, y es también central en la plantilla de Grid Application en Visual Studio.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/GridView1.png"><img style="border-width: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image007" alt="clip_image007" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image007.png" width="644" height="362" border="0" /></a></p>
<p>El GridView, como el FlipView y ListView, heredan de ItemsControl, lo que significa que toman casi cualquier tipo de contenido XAML. En este ejemplo, vamos a crear el GridView en XAML, y lo poblamos con una Lista personalizada de datos de ejemplo. Primero, vamos a definir la clase del ejemplo de datos, Player, que será una simple lista de jugadores:</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:54e9d169-11fa-460c-95ea-859b20548846" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">namespace Day4_NewControls
{
    class Player
    {
        public string Name { get; set; }
        public double Weight { get; set; }
        public int Number { get; set; }
        public double Height { get; set; }
        public string TeamName { get; set; }
    }
}</pre>
</div>
<p>Si no has creado una clase en Visual Studio antes, haz click en tu nombre del proyecto, y elije “Agregar &gt; Clase…” o presiona Shift + Alt + C. Nombra el archivo de clase Player.cs, y usa el código arriba para definir nuestro objeto simple.</p>
<p>A continuación, necesitamos crear nuestro control GridView. Agregar uno a tu página es simple, primero:</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:65a078f6-b4ca-4f64-b594-de10af3504b0" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;GridView x:Name="mainGridView" Grid.Row="1" Background="#33FFFFFF" &gt;
        &lt;/GridView&gt;</pre>
</div>
<p>Sin embargo, hacer que se vea y actúe de la forma que quieres toma un poco más de trabajo. Si has leído artículos previos que he escrito sobre databinding en XAML (<a href="http://www.jeffblankenburg.com/2010/10/25/31-days-of-windows-phone-day-25-talking-to-external-apis/">checa este si no lo has hecho</a>), sabes que cualquier control que hereda de ItemsControl puede definir un ItemTemplate el cual va a especificar como cada objeto será presentado en pantalla. En este ejemplo, vamos a tomar cada uno de nuestros objetos Player y dibujarlos como un rectángulo en el GridView, con cada uno de los valores mostrados. Cada caja se verá como así:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image008.png"><img style="border-width: 0px;margin: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image008" alt="clip_image008" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image008_thumb.png" width="204" height="204" border="0" /></a></p>
<p>¿Entonces cómo hacemos esto? Al definir un diseño XAML que incluye controles por cada uno de los valores de datos que queremos mostrar. Aquí está el GridView completo otra vez, con un ItemTemplate definido esta vez.</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:dda4176b-fa3d-42d9-ba74-f4d056556cdc" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;GridView x:Name="mainGridView" Grid.Row="1" Background="#33FFFFFF" SelectionMode="Multiple"&gt;
            &lt;GridView.ItemTemplate&gt;
                &lt;DataTemplate&gt;
                    &lt;StackPanel Height="200" Width="200" Background="#33FFFFFF"&gt;
                        &lt;TextBlock Text="{Binding Name}" FontSize="24" Foreground="White" Margin="5" /&gt;
                        &lt;TextBlock Text="{Binding TeamName}" FontSize="16" Foreground="White" Margin="5"/&gt;
                        &lt;StackPanel Orientation="Horizontal"&gt;
                            &lt;TextBlock Text="Peso: " FontSize="16" Foreground="White" Margin="5"/&gt;
                            &lt;TextBlock Text="{Binding Weight}" FontSize="16" Foreground="White" Margin="5"/&gt;
                        &lt;/StackPanel&gt;
                        &lt;StackPanel Orientation="Horizontal"&gt;
                            &lt;TextBlock Text="Altura:" FontSize="16" Foreground="White" Margin="5" /&gt;
                            &lt;TextBlock Text="{Binding Height}" FontSize="16" Foreground="White" Margin="5" /&gt;
                        &lt;/StackPanel&gt;
                    &lt;/StackPanel&gt;
                &lt;/DataTemplate&gt;
            &lt;/GridView.ItemTemplate&gt;
            &lt;GridView.ItemsPanel&gt;
                &lt;ItemsPanelTemplate&gt;
                    &lt;WrapGrid Orientation="Vertical" MaximumRowsOrColumns="2" /&gt;
                &lt;/ItemsPanelTemplate&gt;
            &lt;/GridView.ItemsPanel&gt;
        &lt;/GridView&gt;</pre>
</div>
<p>&nbsp;</p>
<p>Con esto casi terminamos. Puedes ver que tenemos sentencias {Binding} por cada propiedad de nuestro objeto, pero aún no hemos realmente creado ningún objeto enlazado a este control GridView. Vamos a hacer eso vía código, así que abre tu archivo Xaml.cs.</p>
<p>En este ejemplo, he creado un nuevo manejador del evento OnNavigatedTo, y usar este para poblar mis datos. Estoy creando una nueva colección List&lt;Player&gt;, y después estableciendo esa colección como ItemsSource de nuestro control “mainGridView”.</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:3043d2f3-f361-4afd-8775-b72ae4fd07af" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    List&lt;Player&gt; players = new List&lt;Player&gt;();
    players.Add(new Player { Name = "Frank Richard", TeamName = "Albany Old Schoolers", Height=74.2, Weight=245, Number=03});
    players.Add(new Player { Name = "Buddy Hobbs", TeamName = "New York Elves", Height = 76.8, Weight = 227, Number = 04 });
    players.Add(new Player { Name = "Ron Burgundy", TeamName = "San Diego Anchormen", Height = 77.1, Weight = 275, Number = 05 });
    players.Add(new Player { Name = "Ricky Bobby", TeamName = "Talladega Racers", Height = 70.6, Weight = 198, Number = 06 });
    players.Add(new Player { Name = "Chazz Reinhold", TeamName = "Washington Crashers", Height = 70.6, Weight = 198, Number = 06 });

    mainGridView.ItemsSource = players;
}</pre>
</div>
<p>Si lo haces bien, debes terminar con una interfaz que se ve como esta:</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/GridViewData21.png"><img style="border-width: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image009" alt="clip_image009" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image009.png" width="644" height="403" border="0" /></a></p>
<p>Mientras esto es aceptable, cuando empecé a escribir este ejemplo, estaba esperando algo más parecido a la imagen inicial que mostré, que tenía 3 elementos en la primera fila, y 2 en la segunda, para definir este tipo de diseño, puedes escribir mucho más XAML, o puedes echar un vistazo al GridView.<a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.itemscontrol.itemspanel.aspx">ItemsPanel</a>.</p>
<p>Redefinir el WrapGrid que está ahí por defecto te permitirá definir el número de filas o columnas que se usaran. Dentro de tu control GridView, agrega estas líneas:</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:bde50d29-0592-489d-89a3-c781f17e25f4" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;GridView.ItemsPanel&gt;
                &lt;ItemsPanelTemplate&gt;
                    &lt;WrapGrid Orientation="Vertical" MaximumRowsOrColumns="2" /&gt;
                &lt;/ItemsPanelTemplate&gt;
  &lt;/GridView.ItemsPanel&gt;</pre>
</div>
<p>Una vez que has hecho esto, tu GridView se debe ver un poco más familiar:</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/GridViewDataFinal1.png"><img style="border-width: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image010" alt="clip_image010" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image010.png" width="644" height="391" border="0" /></a></p>
<h3>ProcessRing</h3>
<p>Mientras esto es probablemente uno de los controles más simples en este artículo, no es menos importante. El <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.progressring.aspx">ProgressRing</a> está diseñado para ser una herramienta fácil de usar para distraer a tu usuario por un momento mientras cargas o procesar algo en el fondo. Es una alerta visual de que estás haciendo algo, y que amablemente aprecias la paciencia del usuario por un momento. Puedes ver uno aquí en acción:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image011.png"><img style="border-width: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image011" alt="clip_image011" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image011_thumb.png" width="68" height="68" border="0" /></a></p>
<p>Para poner un ProgressRing en tu página, solo necesitas una línea de XAML:</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:9ea59f5c-7440-4bbb-ab7b-c95b13623cb0" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;ProgressRing x:Name="progressRing" IsActive="True" Visibility="Visible" Grid.Row="1" Width="400" Height="400" /&gt;</pre>
</div>
<p>&nbsp;</p>
<p>En las aplicaciones más practicas, sin embargo, vas a necesitar controlarlo via codigo como sea necesario. Esto es tan simple como modificar su propiedad de Visibilidad de Collapsed a Visible y de regreso.</p>
<p>Algo interesante que descubrí, sin embargo, es que también puede ser escalado a diferentes tamaños. Por ejemplo, He hecho el ProgressRing en el siguiente screenshot 400&#215;400. Ese es el tipo de mensaje que quiero dar a mis usuarios. “Espera y quédate quieto” J</p>
<h3>ScrollViewer</h3>
<p>El ScrollViewer es otro control increíblemente simple que es prácticamente invaluable. ¿Cuántas veces has tenido un conjunto grande de datos que no cabría en la pantalla, y tenías que crear un mecanismo de desplazamiento o paginación para hacer el resto de los datos visibles al usuario? El ScrollViewer lo hace simple. Mete tu contenido dentro de un ScrollViewer, define que barras de desplazamiento quieres ver, y estas listo. Aquí hay un ejemplo que tiene dos StackPanel lleno de imágenes, excepto que solo el segundo está dentro de un ScrollViewer.</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:f6b89f58-0868-4c20-853a-6337b3a98b00" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;StackPanel Orientation="Horizontal"&gt;
        &lt;Image Source="Assets/meme1.jpg" Height="300" /&gt;
        &lt;Image Source="Assets/meme2.jpg" Height="300" /&gt;
        &lt;Image Source="Assets/meme3.jpg" Height="300" /&gt;
        &lt;Image Source="Assets/meme4.jpg" Height="300" /&gt;
        &lt;Image Source="Assets/meme1.jpg" Height="300" /&gt;
        &lt;Image Source="Assets/meme2.jpg" Height="300" /&gt;
        &lt;Image Source="Assets/meme3.jpg" Height="300" /&gt;
        &lt;Image Source="Assets/meme4.jpg" Height="300" /&gt;
    &lt;/StackPanel&gt;
    &lt;ScrollViewer VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Auto"&gt;
        &lt;StackPanel Orientation="Horizontal"&gt;
            &lt;Image Source="Assets/meme1.jpg" Height="300" /&gt;
            &lt;Image Source="Assets/meme2.jpg" Height="300" /&gt;
            &lt;Image Source="Assets/meme3.jpg" Height="300" /&gt;
            &lt;Image Source="Assets/meme4.jpg" Height="300" /&gt;
            &lt;Image Source="Assets/meme1.jpg" Height="300" /&gt;
            &lt;Image Source="Assets/meme2.jpg" Height="300" /&gt;
            &lt;Image Source="Assets/meme3.jpg" Height="300" /&gt;
            &lt;Image Source="Assets/meme4.jpg" Height="300" /&gt;
        &lt;/StackPanel&gt;
    &lt;/ScrollViewer&gt;</pre>
</div>
<h3>SemanticZoom</h3>
<p>La primera vez que vi el <a href="http://msdn.microsoft.com/library/windows/apps/Hh702601">SemanticZoom</a> en acción, fue en la pantalla de inicio de Windows 8. Pellizcar para alejar te permite ver una meta-versión de las apps y mosaicos. (Si no tienes una pantalla touch, también puedes usar Ctrl + Rueda de desplazamiento. Desde entonces, lo he visto en un gran número de apps, incluyendo la Windows Store, Noticias y Netflix. Aquí hay un vistazo de mi app Netflix. Sin juzgar el contenido, mi familia entera usa esta cuenta:</p>
<p><b>Acercado (vista por defecto):</b></p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/SemanticZoomOut1.png"><img style="border-width: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image012" alt="clip_image012" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image012.png" width="644" height="403" border="0" /></a></p>
<p><b>Alejado (meta vista):</b></p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/SemanticZoomIn1.png"><img style="border-width: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image013" alt="clip_image013" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image013.png" width="644" height="403" border="0" /></a></p>
<p>Lo que está bueno del control SemanticZoom es que se nos dan dos estados, el ZoomedOutView y ZoomedInView, y podemos generalmente poner cualquier cosa que queramos en cada vista. (<a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh465319.aspx">De hecho hay una guía específica acerca de cómo y cuándo usar el SemanticZoom de Microsoft en MSDN</a>) En este ejemplo, tendremos un grupo de elementos de la Tabla Periódica, y mostraremos ambos la lista de elementos así como una vista agrupada que la muestra agrupada en familias, como los Gases Nobles y los Metales Alcalinos, como la siguiente pantalla muestra:</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/SemanticZoomIn21.png"><img style="border-width: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image014" alt="clip_image014" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image014.png" width="644" height="391" border="0" /></a></p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/SemanticZoomOut21.png"><img style="border-width: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image015" alt="clip_image015" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image015.png" width="644" height="391" border="0" /></a></p>
<p>Entonces, para hacer esto, necesitamos iniciar con el control SemanticZoom. Agrega uno a tu página, así:</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:d15608ab-6069-4e8e-8927-ea8103a62b8b" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;SemanticZoom Grid.Row="1" Margin="120,0,0,0"&gt;
            &lt;SemanticZoom.ZoomedInView&gt;
                &lt;GridView&gt;
                &lt;/GridView&gt;
            &lt;/SemanticZoom.ZoomedInView&gt;
            &lt;SemanticZoom.ZoomedOutView&gt;
                &lt;GridView&gt;
                &lt;/GridView&gt;
            &lt;/SemanticZoom.ZoomedOutView&gt;
        &lt;/SemanticZoom&gt;</pre>
</div>
<p>Vas a notar que hay varias piezas que necesitan ser agregadas para empezar. Primero, hay un nodo para ZoomedInView y ZoomedOutView. Me gusta ponerlos en este orden, porque el ZoomedInView es la vista por defecto que vera el usuario, y el ZoomedOutView es la vista “acercada”. Lo hace más fácil mantenerlo en mi mente.</p>
<p>Dentro de esos contenedores, necesitas un control que implemente la interfaz <a href="http://msdn.microsoft.com/en-US/library/windows/apps/xaml/windows.ui.xaml.controls.isemanticzoominformation">ISemanticZoomInformation</a>, que es actualmente solo los controles GridView y ListView. Dado que ya hemos usado el GridView en este artículo, continuaremos con ese.</p>
<p>Antes de que hagamos esto, sin embargo, hablemos de datos. Este ejemplo va a usar elementos de la tabla periódica, así que necesitaremos una clase Element para empezar.</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:4579d994-4d6f-48b1-925c-08ae222617a5" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">namespace Day4_NewControls
{
    class Element
    {
        public double AtomicWeight { get; set; }
        public int AtomicNumber { get; set; }
        public string Symbol { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public string State { get; set; }
    }
}</pre>
</div>
<p>Adicionalmente, necesitamos crear y cargar algunos datos en nuestra página. Abre tu archivo Xaml.cs y agrega un nuevo manejador de eventos OnNavigatedTo, como este:</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:4dac0400-d935-4a0f-8e70-414570e755f4" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            List&lt;Element&gt; elements = new List&lt;Element&gt;();
            elements.Add(new Element { AtomicNumber = 1, AtomicWeight = 1.01, Category = "Alkali Metals", Name = "Hydrogen", Symbol = "H", State = "Gas" });
            elements.Add(new Element { AtomicNumber = 2, AtomicWeight = 4.003, Category = "Noble Gases", Name = "Helium", Symbol = "He", State = "Gas" });
            elements.Add(new Element { AtomicNumber = 3, AtomicWeight = 6.94, Category = "Alkali Metals", Name = "Lithium", Symbol = "Li", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 4, AtomicWeight = 9.01, Category = "Alkaline Earth Metals", Name = "Beryllium", Symbol = "Be", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 5, AtomicWeight = 10.81, Category = "Non Metals", Name = "Boron", Symbol = "B", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 6, AtomicWeight = 12.01, Category = "Non Metals", Name = "Carbon", Symbol = "C", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 7, AtomicWeight = 14.01, Category = "Non Metals", Name = "Nitrogen", Symbol = "N", State = "Gas" });
            elements.Add(new Element { AtomicNumber = 8, AtomicWeight = 15.999, Category = "Non Metals", Name = "Oxygen", Symbol = "O", State = "Gas" });
            elements.Add(new Element { AtomicNumber = 9, AtomicWeight = 18.998, Category = "Non Metals", Name = "Fluorine", Symbol = "F", State = "Gas" });
            elements.Add(new Element { AtomicNumber = 10, AtomicWeight = 20.18, Category = "Noble Gases", Name = "Neon", Symbol = "Ne", State = "Gas" });
            elements.Add(new Element { AtomicNumber = 11, AtomicWeight = 22.99, Category = "Alkali Metals", Name = "Sodium", Symbol = "Na", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 12, AtomicWeight = 24.31, Category = "Alkaline Earth Metals", Name = "Magnesium", Symbol = "Mg", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 13, AtomicWeight = 26.98, Category = "Other Metals", Name = "Aluminum", Symbol = "Al", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 14, AtomicWeight = 28.09, Category = "Non Metals", Name = "Silicon", Symbol = "Si", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 15, AtomicWeight = 30.97, Category = "Non Metals", Name = "Phosphorus", Symbol = "P", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 16, AtomicWeight = 32.06, Category = "Non Metals", Name = "Sulfur", Symbol = "S", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 17, AtomicWeight = 35.45, Category = "Non Metals", Name = "Chlorine", Symbol = "Cl", State = "Gas" });
            elements.Add(new Element { AtomicNumber = 18, AtomicWeight = 39.95, Category = "Noble Gases", Name = "Argon", Symbol = "Ar", State = "Gas" });
            elements.Add(new Element { AtomicNumber = 19, AtomicWeight = 39.10, Category = "Alkali Metals", Name = "Potassium", Symbol = "K", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 20, AtomicWeight = 40.08, Category = "Alkaline Earth Metals", Name = "Calcium", Symbol = "Ca", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 21, AtomicWeight = 44.96, Category = "Transitional Metals", Name = "Scandium", Symbol = "Sc", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 22, AtomicWeight = 47.90, Category = "Transitional Metals", Name = "Titanium", Symbol = "Ti", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 23, AtomicWeight = 50.94, Category = "Transitional Metals", Name = "Vanadium", Symbol = "V", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 24, AtomicWeight = 51.996, Category = "Transitional Metals", Name = "Chromium", Symbol = "Cr", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 25, AtomicWeight = 54.94, Category = "Transitional Metals", Name = "Manganese", Symbol = "Mn", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 26, AtomicWeight = 55.85, Category = "Transitional Metals", Name = "Iron", Symbol = "Fe", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 27, AtomicWeight = 58.93, Category = "Transitional Metals", Name = "Cobalt", Symbol = "Co", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 28, AtomicWeight = 58.70, Category = "Transitional Metals", Name = "Nickel", Symbol = "Ni", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 29, AtomicWeight = 63.55, Category = "Transitional Metals", Name = "Copper", Symbol = "Cu", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 30, AtomicWeight = 65.37, Category = "Transitional Metals", Name = "Zinc", Symbol = "Zn", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 31, AtomicWeight = 69.72, Category = "Other Metals", Name = "Gallium", Symbol = "Ga", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 32, AtomicWeight = 72.59, Category = "Other Metals", Name = "Germanium", Symbol = "Ge", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 33, AtomicWeight = 74.92, Category = "Non Metals", Name = "Arsenic", Symbol = "As", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 34, AtomicWeight = 78.96, Category = "Non Metals", Name = "Selenium", Symbol = "Se", State = "Solid" });
            elements.Add(new Element { AtomicNumber = 35, AtomicWeight = 79.90, Category = "Non Metals", Name = "Bromine", Symbol = "Br", State = "Liquid" });
            elements.Add(new Element { AtomicNumber = 36, AtomicWeight = 83.80, Category = "Noble Gases", Name = "Krypton", Symbol = "Kr", State = "Gas" });

            ElementData.Source = elements;
            CategoryData.Source = from el in elements group el by el.Category into grp orderby grp.Key select grp;
        }</pre>
</div>
<p>Para este ejemplo, he incluido los primeros 36 elementos en la tabla periódica, pero puedes expandirlo a más si tienes el tiempo. Ahora mismo, probablemente te preguntaras sobre las ultimas dos líneas que se refieren a ElementData y CategoryData. Estos son elementos CollectionViewSource que he agregado a nuestra sección Resources de la página XAML. Aquí esta como luce nuestra sección Page.Resources:</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:8abfb4b1-2c08-49c4-a31e-7bbfeff27d4d" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;Page.Resources&gt;
    &lt;x:String x:Key="AppName"&gt;Ejemplo SemanticZoom&lt;/x:String&gt;
    &lt;CollectionViewSource x:Name="ElementData" /&gt;
    &lt;CollectionViewSource x:Name="CategoryData" IsSourceGrouped="True"/&gt;
&lt;/Page.Resources&gt;</pre>
</div>
<p>Esta es una forma simple para definir algunas colecciones de datos en XAML, y poblarlas como necesitemos desde código. Vamos a revisar esto en un momento, pero por ahora, representan las dos versiones de nuestros datos, agrupados y desagrupados.</p>
<p>Vamos a enfocarnos en el ZoomedInView primero, pero dado que es mucho más similar a nuestro ejemplo anterior de un GridView. En el código de ejemplo siguiente, he incluido el nodo entero ZoomedInView, y nota que estamos declarando el ItemsSource en XAML en vez de código. Estamos tomando el CollectionViewSource para nuestros datos.</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:162e0d21-be77-4a00-b34c-d0592dcf4518" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;SemanticZoom.ZoomedInView&gt;
                &lt;GridView ItemsSource="{Binding Source={StaticResource ElementData}}" SelectionMode="None"&gt;
                    &lt;GridView.ItemTemplate&gt;
                        &lt;DataTemplate&gt;
                            &lt;Grid Width="150" Height="150" Background="#33FFFFFF"&gt;
                                &lt;Grid.ColumnDefinitions&gt;
                                    &lt;ColumnDefinition Width="10" /&gt;
                                    &lt;ColumnDefinition Width="65" /&gt;
                                    &lt;ColumnDefinition Width="65" /&gt;
                                    &lt;ColumnDefinition Width="10" /&gt;
                                &lt;/Grid.ColumnDefinitions&gt;
                                &lt;Grid.RowDefinitions&gt;
                                    &lt;RowDefinition Height="10" /&gt;
                                    &lt;RowDefinition Height="35" /&gt;
                                    &lt;RowDefinition Height="60" /&gt;
                                    &lt;RowDefinition Height="35" /&gt;
                                    &lt;RowDefinition Height="10" /&gt;
                                &lt;/Grid.RowDefinitions&gt;
                                &lt;TextBlock Text="{Binding AtomicNumber}" Grid.Column="1" Grid.Row="1" FontWeight="Bold" /&gt;
                                &lt;TextBlock Text="{Binding AtomicWeight}" Grid.Column="2" Grid.Row="1" TextAlignment="Right" FontWeight="Bold" /&gt;
                                &lt;TextBlock Text="{Binding Symbol}" FontSize="50" Grid.Row="2" Grid.RowSpan="2" Grid.Column="1" Grid.ColumnSpan="2" TextAlignment="Center" Width="130" /&gt;
                                &lt;TextBlock Text="{Binding Name}" Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2" TextAlignment="Center" VerticalAlignment="Bottom" /&gt;
                            &lt;/Grid&gt;
                        &lt;/DataTemplate&gt;
                    &lt;/GridView.ItemTemplate&gt;
                    &lt;GridView.ItemsPanel&gt;
                        &lt;ItemsPanelTemplate&gt;
                            &lt;WrapGrid MaximumRowsOrColumns="8" Orientation="Horizontal" /&gt;
                        &lt;/ItemsPanelTemplate&gt;
                    &lt;/GridView.ItemsPanel&gt;
                &lt;/GridView&gt;
            &lt;/SemanticZoom.ZoomedInView&gt;</pre>
</div>
<p>El resto de nuestro marcado es un diseño de la caja de la tabla periódica. Cuando se muestra, se ve como esto:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image016.png"><img style="border-width: 0px;margin: 0px;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image016" alt="clip_image016" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image016_thumb.png" width="160" height="160" border="0" /></a></p>
<p>Eso es todo para el ZoomedInView. En una nota aparte, use <a href="http://en.wikipedia.org/wiki/Gallium">Gallium</a> para este screen shot porque es asombroso. Es un metal que se ve como aluminio en bruto u hojalata, con un peso similar. Lo que esta genial es que tiene un punto de fusión alrededor de los 85F o 30C grados. Esto significa que cuando tomas un pedazo de Gallium, se derrite en un charco en tu mano, y se parece mucho al Mercurio en ese punto. (Gracias a mi amigo <a href="https://twitter.com/JimTocco">Jim Tacco</a> por presentarme al Gallium hace unos años.)</p>
<div>http://www.youtube.com/watch?v=QYioZFOhxow</div>
<p>Vamos a ver ahora el ZoomedOutView. Aquí es donde las cosas se ponen un poco más interesantes. El código siguiente debe verse idéntico al ZoomedInView excepto los tamaños son todos más pequeños para nuestras fuentes y Grid, y eso es porque realmente lo es.</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:1eb81568-5f75-4c6b-8bb1-75b9c42a415d" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;SemanticZoom.ZoomedOutView&gt;
                &lt;GridView x:Name="GridIn" ItemsSource="{Binding Source={StaticResource CategoryData}}" SelectionMode="None"&gt;
                    &lt;GridView.ItemTemplate&gt;
                        &lt;DataTemplate&gt;
                            &lt;Grid Width="75" Height="75" Background="#33FFFFFF"&gt;
                                &lt;Grid.ColumnDefinitions&gt;
                                    &lt;ColumnDefinition Width="5" /&gt;
                                    &lt;ColumnDefinition Width="33" /&gt;
                                    &lt;ColumnDefinition Width="32" /&gt;
                                    &lt;ColumnDefinition Width="5" /&gt;
                                &lt;/Grid.ColumnDefinitions&gt;
                                &lt;Grid.RowDefinitions&gt;
                                    &lt;RowDefinition Height="5" /&gt;
                                    &lt;RowDefinition Height="18" /&gt;
                                    &lt;RowDefinition Height="30" /&gt;
                                    &lt;RowDefinition Height="17" /&gt;
                                    &lt;RowDefinition Height="5" /&gt;
                                &lt;/Grid.RowDefinitions&gt;
                                &lt;TextBlock Text="{Binding AtomicNumber}" Grid.Column="1" Grid.Row="1" FontSize="12" /&gt;
                                &lt;TextBlock Text="{Binding AtomicWeight}" Grid.Column="2" Grid.Row="1" FontSize="12" TextAlignment="Right" /&gt;
                                &lt;TextBlock Text="{Binding Symbol}" FontSize="25" Grid.Row="2" Grid.Column="1" Grid.RowSpan="2" Grid.ColumnSpan="2" TextAlignment="Center" Width="65" /&gt;
                                &lt;TextBlock Text="{Binding Name}" Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2" FontSize="12" TextAlignment="Center" VerticalAlignment="Bottom" /&gt;
                            &lt;/Grid&gt;
                        &lt;/DataTemplate&gt;
                    &lt;/GridView.ItemTemplate&gt;
                &lt;/GridView&gt;
            &lt;/SemanticZoom.ZoomedOutView&gt;</pre>
</div>
<p>Del modo que vamos a hacer nuestro ZoomedOutView único es agregando un GroupStyle a nuestro GridView, que agregara encabezados a cada una de nuestras secciones. El GroupStyle define un HeaderTemplate para nuestra sección, y se enlaza a nuestro nombre de categoría.</p>
<p>Aquí está como se ve mi marcado de GridView.GroupStyle. Puedes insertar esto inmediatamente después del nodo GridView.ItemTemplate de nuestro ejemplo anterior.</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:803891fd-453d-4f6c-9197-b434544e2a3c" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;GridView.GroupStyle&gt;
                        &lt;GroupStyle HidesIfEmpty="True"&gt;
                            &lt;GroupStyle.HeaderTemplate&gt;
                                &lt;DataTemplate&gt;
                                    &lt;StackPanel Background="LightGray" Margin="0,0,20,0"&gt;
                                        &lt;TextBlock Text="{Binding Key}" Foreground="Black" Margin="30" FontSize="32" Width="350" /&gt;
                                    &lt;/StackPanel&gt;
                                &lt;/DataTemplate&gt;
                            &lt;/GroupStyle.HeaderTemplate&gt;
                            &lt;GroupStyle.Panel&gt;
                                &lt;ItemsPanelTemplate&gt;
                                    &lt;VariableSizedWrapGrid/&gt;
                                &lt;/ItemsPanelTemplate&gt;
                            &lt;/GroupStyle.Panel&gt;
                        &lt;/GroupStyle&gt;
                    &lt;/GridView.GroupStyle&gt;</pre>
</div>
<p>Este GroupStyle tiene s upropio HeaderTemplate, que define como se ve cada encabezado de sección.</p>
<p>En este punto, si corres tu proyecto (o descargas el ejemplo al final del artículo), vas a ver que puedes fácilmente intercalar entre las dos vistas SemanticView, con solo un poco de XAML para hacerlo.</p>
<p>Recomiendo mucho usar SemanticZoom en tus aplicaciones donde hace sentido. Los usuarios lo esperarán, así que no los decepciones. Dales la experiencia rica y absorbente que merecen.</p>
<h3>WebView</h3>
<p>El control <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webview.aspx">WebView</a> es similar al <a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/microsoft.phone.controls.webbrowser(v=vs.92).aspx">WebBrowser</a> en el desarrollo Windows Phone. En otras palabras, está diseñado para permitirte mostrar contenido HTML in tu app desde el web or desde archivos locales en tu proyecto. Esto se vuelve increíblemente útil cuando varias de las páginas de tu app de otra forma se verían idéntica a tu sitio. Puedes meter un control WebView y mostrar contenido sin haber construido paginas adicionales!</p>
<p>Un WebView es también una gran forma de aplicar análisis y códigos de rastreo a tus apps también. Haz el WebView pequeño, ocúltalo en un rincón de tu aplicación, ¡Y listo! Obtendrás un rastreo fácil dentro de la app.</p>
<p>Usar el control WebView es simple. Define una propiedad source, y ya estás.</p>
<div class="wlWriterEditableSmartContent" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:55201f65-2559-47b5-b7b9-9e335baa56b4" style="margin: 0px;padding: 0px;float: none">
<pre class="crayon-plain-tag">&lt;WebView Grid.Row="1" Source="http://31DaysOfWindows8.com" /&gt;</pre>
</div>
<p>Es otro control realmente simple, pero uno del que debes tenerlo presente. Nunca sabes cuándo necesitaras incrustar contenido web dentro de tu aplicación, y no hay una forma más sencilla.</p>
<h3>Resumen</h3>
<p>Este largo y exhaustivo artículo cubrió siete de los nuevos controles que están disponibles para nosotros en el desarrollo XAML de aplicaciones Windows 8. Espero que hayas aprendido uno o dos trucos en el camino.</p>
<p>Si gustas descargar la solución entera y código de ejemplo para este artículo, haz click en el botón de abajo:</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia4.zip"><img style="border: 0px currentColor;padding-top: 0px;padding-right: 0px;padding-left: 0px" title="clip_image017" alt="clip_image017" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/clip_image017.png" width="154" height="154" border="0" /></a></p>
<p>Mañana, empezaremos con una serie de artículos referentes a los contratos, y en Día #5 nos enfocaremos específicamente a los Settings en tu app. ¡Hasta entonces!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/01/31-das-de-windows-8-da-4-controles-nuevos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 D&#237;as de Windows 8 &#124; D&#237;a 3: La pantalla de inicio (splash screen)</title>
		<link>http://blogs.ligasilverlight.com/2013/01/31-das-de-windows-8-da-3-la-pantalla-de-inicio-splash-screen/</link>
		<comments>http://blogs.ligasilverlight.com/2013/01/31-das-de-windows-8-da-3-la-pantalla-de-inicio-splash-screen/#comments</comments>
		<pubDate>Thu, 03 Jan 2013 05:51:04 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[Windows 8]]></category>
		<category><![CDATA[Splash Screens]]></category>
		<category><![CDATA[XAML]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3808</guid>
		<description><![CDATA[Este artículo es una traducción de “Día 3: La pantalla de inicio” de Jeff Blakenburg. Puedes encontrar aquí la versión original en inglés. Hoy vamos a hablar acerca de una pequeña pero muy importante parte del ciclo de vida de la aplicación. La pantalla de inicio. Algunos de ustedes lo verán como un tema simple al principio, pero de hecho es increíblemente importante desde el punto de vista de experiencia de usuario. Digamos, como ejemplo, que tu aplicación se conecta a internet para obtener cierta información. Quizá es una aplicación del clima. Cada vez que el usuario inicia tu aplicación, ellos van necesitar cierta información secundaria. Sabes que tomará generalmente 2-3 segundos obtener la información, las imágenes adecuadas y colocarlas dentro de la página de tu aplicación. Lo que vemos que pasa en muchas aplicaciones es que la aplicación se inicia vacía, casi tanto como una página sin interés que se llenará 2 ó 3 segundos después. Al utilizar la pantalla de inicio y sus eventos nosotros podemos “extender” la experiencia de la pantalla de inicio de modo que los usuarios no vean nuestra aplicación hasta que  estemos listos para que eso pase. Un par de segundos extra mirando a [...]]]></description>
				<content:encoded><![CDATA[<p>Este artículo es una traducción de “Día 3: La pantalla de inicio” de Jeff Blakenburg. Puedes encontrar aquí la versión original en inglés.</p>
<p>Hoy vamos a hablar acerca de una pequeña pero muy importante parte del ciclo de vida de la aplicación. La pantalla de inicio. Algunos de ustedes lo verán como un tema simple al principio, pero de hecho es increíblemente importante desde el punto de vista de experiencia de usuario.</p>
<p>Digamos, como ejemplo, que tu aplicación se conecta a internet para obtener cierta información. Quizá es una aplicación del clima. Cada vez que el usuario inicia tu aplicación, ellos van necesitar cierta información secundaria. Sabes que tomará generalmente 2-3 segundos obtener la información, las imágenes adecuadas y colocarlas dentro de la página de tu aplicación.</p>
<p>Lo que vemos que pasa en muchas aplicaciones es que la aplicación se inicia vacía, casi tanto como una página sin interés que se llenará 2 ó 3 segundos después. Al utilizar la pantalla de inicio y sus eventos nosotros podemos “extender” la experiencia de la pantalla de inicio de modo que los usuarios no vean nuestra aplicación hasta que  estemos listos para que eso pase. Un par de segundos extra mirando a la pantalla de inicio es <strong>siempre</strong> preferible a abrir una aplicación vacía.</p>
<p>Así que lo que estaremos haciendo en este artículo es determinar cunado fue colocada la pantalla de inicio y reemplazarla con nuestra imagen de inicio que sirva como <strong>marcador de posición</strong> hasta que nuestra aplicación este correctamente lista.</p>
<p><span style="font-size: medium;"><strong>Para comenzar</strong></span></p>
<p>Si revisas el artículo del día 1, la pantalla de inicio es siempre de 620 x 300 píxeles. Para este ejemplo vamos a darte dos versiones de esta imagen. La primera es la roja original.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/SplashScreen3.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="SplashScreen3" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/SplashScreen3_thumb.png" alt="SplashScreen3" width="450" height="218" border="0" /></a></p>
<p>Adicionalmente, hemos creado una versión idéntica de la imagen en un color púrpura de modo que podamos ver la diferencia cuando estas imágenes se cambien mientras que aún seremos capaces de notar que la posición del texto no cambie para nada.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/SplashScreenPlaceholder2.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="SplashScreenPlaceholder2" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/SplashScreenPlaceholder2_thumb.png" alt="SplashScreenPlaceholder2" width="450" height="218" border="0" /></a></p>
<p>Agrega estas dos imágenes  en tu folder de <strong>Assets</strong> en un proyecto en blanco. Si ejecutas el proyecto después de reemplazar las imágenes, deberás ver la imagen roja por un segundo o dos antes de que tu aplicación cargue una pantalla negra.</p>
<p><span style="font-size: medium;"><strong>Creando una página de pantalla de inicio</strong></span></p>
<p>Nuestro siguiente paso es crear una página separada para continuar con la ilusión de una pantalla de inicio. Agrega una nueva página blanca a tu proyecto.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/image.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/image_thumb.png" alt="image" width="500" height="304" border="0" /></a></p>
<p>He nombrado a la página Splash.xaml, pero tu puedes llamarla de la manera que más sentido tenga para tu aplicación. Después de agregar la imagen púrpura a la página el código debe lucir de la siguiente manera.</p>
<pre class="brush: xml">&lt;page x:Class=&quot;Pantalla_de_inicio.Splash&quot;
xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
xmlns:local=&quot;using:Pantalla_de_inicio&quot;
xmlns:d=&quot;http://schemas.microsoft.com/expression/blend/2008&quot;
xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;
mc:Ignorable=&quot;d&quot;&gt;

&lt;grid Background=&quot;{StaticResource ApplicationPageBackgroundThemeBrush}&quot;&gt;
&lt;image Source=&quot;Assets/SplashScreen2.png&quot; Stretch=&quot;Fill&quot; Width=&quot;620&quot; Height=&quot;300&quot; VerticalAlignment=&quot;Center&quot; HorizontalAlignment=&quot;Center&quot;/&gt;
&lt;/grid&gt;
&lt;/page&gt;</pre>
<p>Como puedes ver es muy simple. Solo agrega una imagen a tu página. El siguiente paso es modificar nuestro archivo App.xaml.cs para dirigir al usuario a esta página primero.</p>
<p><strong><span style="font-size: medium;">Modificar nuestro App.xaml.cs</span></strong></p>
<p>Los desarrolladores que crean aplicaciones simples quizá nunca hayan abierto este archivo, pero es aquí donde mucha de la magia ocurre. App.xaml.cs contiene nuestros métodos de inicio y otra funcionalidad a nivel de sistema como manejar el estado de la aplicación entre sesiones. En este caso, estamos buscando el método OnLaunched(). He retirado todos los comentarios que están aquí por defecto pero tu estás buscando específicamente por el lugar donde se está tratando de navegar Navigate(typeof(MainPage), args.Arguments)<strong>.</strong></p>
<pre class="brush: csharp">protected override void OnLaunched(LaunchActivatedEventArgs args)
{
Frame rootFrame = Window.Current.Content as Frame;

if (rootFrame == null)
{
rootFrame = new Frame();

if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
}

Window.Current.Content = rootFrame;
}

if (rootFrame.Content == null)
{
if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
{
throw new Exception(&quot;Failed to create initial page&quot;);
}
}
Window.Current.Activate();
}</pre>
<p>Por defecto nuestra aplicación esta tratando de navegar a MainPage.xaml y queremos tratar de cambiar esto. Reemplaza la referencia a MainPage con una referencia a Splash, lo he hecho en el ejemplo de arriba. Esto llevará al usuario a nuestra página Splash primero donde podemos hacer la carga que necesitamos completar.</p>
<p>Anda, prueba tu aplicación. Cuando ponemos nuestra imagen púrpura en un contenedor la destinamos en una ubicación centrada. Deberás ver que la caja púrpura reemplaza a la caja roja perfectamente. Aquí hay un video para ilustrar, en el caso de que solo estés leyendo y no escribiendo código en estos momentos (¿Por qué no estás escribiendo código?).</p>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/6txV1uDgI8c" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>¿Hemos terminado? Ni siquiera un poco. Lo que hemos hecho es lo barato, la forma sencilla de prolongar a la pantalla de inicio. Hay un modelo mucho más complicado para esto si estás interesado.</p>
<p><strong><span style="font-size: medium;">El más difícil, más involucrado camino</span></strong></p>
<p>Vamos a decir que estás buscando por algo mas que solo extender la longitud de la vista de la pantalla de inicio. Quizá quieres saber cuando la pantalla de inicio desapareció o la ubicación específica en la que la pantalla de inicio fue desplegada en la pantalla. Puedes hacer esto gracias al objeto <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.applicationmodel.activation.splashscreen.aspx" target="_blank">SplashScreen</a> que el espacio de nombres <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.applicationmodel.activation.aspx" target="_blank">Windows.ApplicationModel.Activation</a> nos da.</p>
<p>Primero, vamos a mirar de nuevo nuestro archivo App.xaml.cs. Vamos a cambiar como hacemos la llamada inicial a la página Splash.xaml pasando el objeto SplashScreen al constructor de nuestra página. Para simplificar, hemos eliminado todo el código predeterminado en nuestro método OnLaunched y lo cambiamos por el siguiente. Agregamos comentarios para explicar cada línea de código del código.</p>
<pre class="brush: csharp">protected override void OnLaunched(LaunchActivatedEventArgs args)
{
// Primero queremos verificar si la aplicación ya está corriendo
if (args.PreviousExecutionState != ApplicationExecutionState.Running)
{
//Si no lo estaba, entonces queremos checar si fue terminada la última vez que se ejecutó
//lo cual nos hará pasar por la página de inicio
bool estadoDeCarga = (args.PreviousExecutionState == ApplicationExecutionState.Terminated);

//Crea un nuevo objeto de la página Splash pasando el objeto SplashScreen al constructor
Splash paginaInicio = new Splash(args.SplashScreen, estadoDeCarga);

//Ajusta el contenido actual de la aplicación igual a la página Splash
Window.Current.Content = paginaInicio;

}
Window.Current.Activate();
}</pre>
<p>Ahora que hemos pasado esa información, necesitamos modificar como está escrito el constructor de nuestro Splash.xaml.cs para que pueda obtener esos valores cuando lleguen. Abre tu archivo Splash.xaml.cs y reescribe tu método Splash() de la siguiente manera.</p>
<pre class="brush: csharp">public SplashScreen PantallaInicio;
public Rect imagenInicio;

public Splash(SplashScreen pantallaInicio, bool estadoCarga)
{
this.InitializeComponent();
PantallaInicio = pantallaInicio;
imagenInicio = PantallaInicio.ImageLocation;
}</pre>
<p>Como puedes ver, dado que cambiamos como llamamos a nuestra página Splash en nuestro archivo App.xaml.cs también necesitamos que el método constructor coincida con la misma forma, recibiendo un objeto SplashScreen y un valor booleano. El valor estadoCarga es pasado a nuestra página para dejarnos saber si estamos cargando desde un estado previo o no. (Recuerda que ajustamos este valor en el archivo App.xaml.cs arriba).</p>
<p><strong><span style="font-size: medium;">Reconociendo cuando la pantalla de inicio este desaparecida</span></strong></p>
<p>Nuestro siguiente paso es suscribir el manejador de eventos para cuando la página de inicio haya desaparecido. Hacemos esto como en casi cualquier manejador de eventos. Agrega esta línea de código al final del nuevo método constructor que creamos.</p>
<pre class="brush: csharp">PantallaInicio.Dismissed += new TypedEventHandler&lt;splashscreen ,object&gt; (PantallaInicio_Dismissed);</pre>
<p>Dado que ahora hemos definido un nuevo manejador de eventos, también necesitamos crear el método que atrape ese evento el cual es llamado PantallaInicio_Dismissed. En este ejemplo hemos dejado vacío el código pero este es el lugar en donde agregarías el código que debería ser ejecutado cuando la pantalla de inicio haya desaparecido.</p>
<pre class="brush: csharp">void PantallaInicio_Dismissed(SplashScreen sender, object args)
{

}</pre>
<p><strong><span style="font-size: medium;">Determinando la ubicación y tamaño de la imagen de la pantalla de inicio</span></strong></p>
<p>Finalmente, necesitamos determinar donde fue colocada la pantalla de inicio en la pantalla. En esta parte del ejemplo vamos a usar la ubicación de la pantalla de inicio para determinar donde colocar una imagen publicitaria como la de abajo mientras la aplicación se carga.</p>
<p>Primero, aquí está la imagen que usaremos. (Siéntete libre de usarla en tus aplicaciones)</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/advertisementsample.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="advertisementsample" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/advertisementsample_thumb.png" alt="advertisementsample" width="500" height="81" border="0" /></a></p>
<p>Agrégala a tu proyecto  y después actualiza tu archivo Splash.xaml para que luzca así.</p>
<pre class="brush: xml">&lt;grid Background=&quot;{StaticResource ApplicationPageBackgroundThemeBrush}&quot;&gt;
&lt;canvas Background=&quot;#464646&quot;&gt;
&lt;image x:Name=&quot;SplashScreenImage&quot; Source=&quot;Assets/SplashScreen2.png&quot; Width=&quot;620&quot; Height=&quot;300&quot; Visibility=&quot;Collapsed&quot;/&gt;
&lt;image x:Name=&quot;AdvertisementImage&quot; Source=&quot;Assets/advertisementsample.png&quot; Width=&quot;620&quot; Height=&quot;100&quot; Visibility=&quot;Collapsed&quot;/&gt;
&lt;/canvas&gt;
&lt;/grid&gt;</pre>
<p>Como puedes ver en el XAML de arriba he removido el interior del control Grid y lo reemplace con un Canvas. Esto es realmente solo para mostrar que no estoy usando ninguna propiedad de centrado del Grid y en su lugar voy a tener que ser completamente acertado en la ubicación de mi imagen.</p>
<p>Regresa un poco a tu archivo Splash.xaml.cs y agrega una línea adicional a tu método constructor (la llamada a un método llamado PosicionPublicidad) de modo que al final luzca de la siguiente manera.</p>
<pre class="brush: csharp">public SplashScreen PantallaInicio;
public Rect imagenInicio;

public Splash(SplashScreen pantallaInicio, bool estadoCarga)
{
this.InitializeComponent();
PantallaInicio = pantallaInicio;
imagenInicio = PantallaInicio.ImageLocation;

PantallaInicio.Dismissed += new TypedEventHandler&lt;/splashscreen&gt;&lt;splashscreen ,object&gt; (PantallaInicio_Dismissed);
PosicionPublicidad();
}

void PantallaInicio_Dismissed(SplashScreen sender, object args)
{

}</pre>
<p>Finalmente, necesitamos crear un método con el mismo nombre y mover nuestras imágenes a sus posiciones apropiadas antes de cambiar sus propiedades de Visibility a Visible. Para acceder a las propiedades X, Y, Height y Width del objeto SplashScreen.ImageLocation.</p>
<pre class="brush: csharp">private void PosicionPublicidad()
{
imagenPantallaInicio.SetValue(Canvas.TopProperty, imagenInicio.Y);
imagenPantallaInicio.SetValue(Canvas.LeftProperty, imagenInicio.X);
imagenPantallaInicio.Height = imagenInicio.Height;
imagenPantallaInicio.Width = imagenInicio.Width;
imagenPantallaInicio.Visibility = Windows.UI.Xaml.Visibility.Visible;

imagenPublicidad.SetValue(Canvas.TopProperty, (imagenInicio.Y + imagenInicio.Height + 100));
imagenPublicidad.SetValue(Canvas.LeftProperty, imagenInicio.X);
imagenPublicidad.Visibility = Windows.UI.Xaml.Visibility.Visible;
}</pre>
<p>Como puedes ver, estamos posicionando la imagenPantallaInicio a la misma posición que la imagen preestablecida de la página de inicio de la aplicación. Después ajustamos la publicidad para que se muestre 100 píxeles por debajo de la pantalla de inicio. Así que al final, el archivo Splash.xaml deberá lucir de la siguiente manera.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/image_thumb1.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image_thumb" src="http://blogs.ligasilverlight.com/wp-content/uploads/2013/01/image_thumb_thumb.png" alt="image_thumb" width="400" height="250" border="0" /></a></p>
<p>¡Y eso es todo!</p>
<p><strong><span style="font-size: medium;">Conclusión</span></strong></p>
<p>En corto, la página de inicio puede ser tu amiga. Se convierte en un velo temporal para esconder tu aplicación mientras esté lista así como un lugar para colocar algo de publicidad en aplicaciones gratuitas. Es una pieza altamente valiosa del estado de tu aplicación y definitivamente pienso que es algo que deberías considerar para aprovechar en cada aplicación.</p>
<p>Para descargar la solución entera de ejemplo de este artículo, puedes descargarla aquí.</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia3.zip" target="_blank"><img src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadXAML5.png" alt="" /></a></p>
<p>Mañana, vamos a enfocarnos en algunos de los nuevos controles comunes que están disponibles para nosotros en el desarrollo de aplicaciones XAML para Windows 8. Miraremos cosas como el GridView, FlipView y más. Pero eso es mañana ¡Nos vemos!</splashscreen></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2013/01/31-das-de-windows-8-da-3-la-pantalla-de-inicio-splash-screen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crear una cuenta de publicaci&#243;n para Windows Phone Marketplace</title>
		<link>http://blogs.ligasilverlight.com/2012/12/crear-una-cuenta-de-publicacin-para-windows-phone-marketplace/</link>
		<comments>http://blogs.ligasilverlight.com/2012/12/crear-una-cuenta-de-publicacin-para-windows-phone-marketplace/#comments</comments>
		<pubDate>Mon, 03 Dec 2012 23:16:12 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[WP7]]></category>
		<category><![CDATA[WP71]]></category>
		<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[windows phone 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3794</guid>
		<description><![CDATA[Crear una aplicación para Windows Phone puede ser una experiencia genial. Pero publicarla para que todos los usuarios de Windows Phone puedan acceder a ella es la mitad complementaria que definitivamente te hará sentir mucho mejor pues habrá muchas mas personas disfrutando de tu trabajo. Para poder publicar aplicaciones en la tienda de Windows Phone (anteriormente llamada Windows Phone Marketplace), debes contar con una cuenta de desarrollador Windows Phone. Te anticipo que el costo es de $ 99 USD (lo dejo de manera genérica para que puedas hacer la conversión adecuada a tu moneda). Así que mientras estas leyendo esto te recomiendo que vayas sacando una poderosa tarjeta de crédito para terminar el proceso por completo. Para comenzar deber unirte al centro de desarrolladores de Windows Phone, puedes hacerlo desde aquí. Antes de continuar te recuerdo que ya debes contar con una cuenta Windows Live ID, así que si no la tienes deberás hacerlo pues de lo contrario no podrás continuar con el proceso. Al presionar el botón Join Now, verás una pantalla similar a la siguiente. &#160; La opción de Country/region of residence or business&#160; deberá tener marcado el nombre del país en el que radicas. Para el tipo [...]]]></description>
				<content:encoded><![CDATA[<p>Crear una aplicación para Windows Phone puede ser una experiencia genial. Pero publicarla para que todos los usuarios de Windows Phone puedan acceder a ella es la mitad complementaria que definitivamente te hará sentir mucho mejor pues habrá muchas mas personas disfrutando de tu trabajo.</p>
<p>Para poder publicar aplicaciones en la tienda de Windows Phone (anteriormente llamada Windows Phone Marketplace), debes contar con una cuenta de desarrollador Windows Phone. Te anticipo que el costo es de $ 99 USD (lo dejo de manera genérica para que puedas hacer la conversión adecuada a tu moneda). Así que mientras estas leyendo esto te recomiendo que vayas sacando una poderosa tarjeta de crédito para terminar el proceso por completo.</p>
<p>Para comenzar deber unirte al centro de desarrolladores de Windows Phone, puedes hacerlo desde <a href="https://dev.windowsphone.com/en-us/join" target="_blank">aquí</a>. Antes de continuar te recuerdo que ya debes contar con una cuenta <a href="https://signup.live.com/signup.aspx?lic=1" target="_blank">Windows Live ID</a>, así que si no la tienes deberás hacerlo pues de lo contrario no podrás continuar con el proceso. </p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image_thumb.png" width="450" height="291" /></a></p>
<p>Al presionar el botón <strong>Join Now</strong>, verás una pantalla similar a la siguiente.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image1.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image_thumb1.png" width="361" height="259" /></a></p>
<p>&#160;</p>
<p>La opción de <strong>Country/region of residence or business</strong>&#160; deberá tener marcado el nombre del país en el que radicas.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image2.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image_thumb2.png" width="282" height="60" /></a></p>
<p>Para el tipo de cuenta existen dos posiblidades:</p>
<p><strong>Company: </strong>Esta opción es para cuando tu cuenta venderá aplicaciones como un negocio de manera formal o a organizaciones gubernamentales.</p>
<p><strong>Individual or student: </strong>Esta opción es para cuando quieres vender aplicaciones con solo tu nombre, simplemente si quieres conocer el mercado de manera individual o cuentas con una cuenta con <a href="https://www.dreamspark.com/" target="_blank">DreamSpark</a></p>
<p>Después de haber habilitado el tipo de cuenta que utilizarás, solo debes aceptar los términos legales para poder continuar.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image3.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image_thumb3.png" width="450" height="148" /></a></p>
<p>Al momento de continuar, en caso de que no te lo hayan pedido antes o no tengas tu sesión abierta. El sitio te pedirá ingresar con tu cuenta de Windows Live.</p>
<p>En la página de registro deberás ingresar toda la información solicitada o al menos la que tenga un asterisco ( * ) al finalizar cada campo pues se trata de información obligatoria. La primera sección son datos de la cuenta.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image4.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image_thumb4.png" width="450" height="296" /></a></p>
<p>En la segunda opción, la de <strong>Publisher info</strong>, escribe el nombre con el que deseas aparecer al momento de publicar tus aplicaciones. Cuando lo hayas definido, solo debes confirmar que esté disponible. </p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image5.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image_thumb5.png" width="400" height="112" /></a></p>
<p>&#160;</p>
<p>Para darte una mejor referencia de lo importante que es considerar un nombre de publicador, puedes darte una vuelta por la <a href="http://www.windowsphone.com/es-mx/store" target="_blank">tienda de aplicaciones de Windows Phone</a> y verás que en cualquier aplicación que veas se mostrará el nombre que elegiste.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image6.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image_thumb6.png" width="500" height="362" /></a></p>
<p>La mas grande diferencia entre los dos tipos de cuentas radica en el siguiente apartado. En el caso de la cuenta de tipo <strong>Company</strong> necesitarás indicar la información de quien quede a cargo de esta cuenta. Esto es sencillamente para evitar que se pueda publicar una aplicación sin la aprobación directa del responsable de publicación y en esto hago una mención importante, el administrador de la cuenta no debe ser exactamente el mismo que la administre.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image7.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image_thumb7.png" width="450" height="236" /></a></p>
<p>&#160;</p>
<p>En la siguiente pantalla podrás ingresar los datos de algún código promocional, de lo contrario solo presiona <strong>Next</strong>, aquí es donde verás el cobro real de tu licencia en moneda local.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image8.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image_thumb8.png" width="360" height="93" /></a></p>
<p>En el último paso a seguir hay dos grandes opciones para poder pagar la cuenta de desarrollo de Windows Phone. Por medio de una tarjeta de crédito o PayPal. En cualquiera de los dos casos se te solicitará información relativa al método de pago.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image9.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image_thumb9.png" width="450" height="349" /></a></p>
<p>&#160;</p>
<p>Después de este paso y si todo salió en orden, ya deberás ver solo una pantalla de agradecimiento por haber terminado satisfactoriamente tu proceso de activación. La cuenta tomará cerca de 24 horas en activarse de manera completa y solo bastará que entres a la <a href="https://dev.windowsphone.com/en-us/" target="_blank">página inicial</a> y simplemente ingreses con la cuenta que configuraste todo.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image10.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image_thumb10.png" width="450" height="120" /></a></p>
<p>Después de haber ingresado, simplemente bastará que des clic sobre tu correo y podrás ver una imagen como la siguiente.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image11.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/12/image_thumb11.png" width="450" height="285" /></a></p>
<p>¡Ahí tienes! Ahora ya es momento de que puedas compartir con todos los usuarios Windows Phone esas geniales aplicaciones que has hecho.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/12/crear-una-cuenta-de-publicacin-para-windows-phone-marketplace/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 D&#237;as de Windows 8 &#124; D&#237;a 2: Orientaci&#243;n y snapping</title>
		<link>http://blogs.ligasilverlight.com/2012/11/31-das-de-windows-8-da-2-orientacin-y-snapping/</link>
		<comments>http://blogs.ligasilverlight.com/2012/11/31-das-de-windows-8-da-2-orientacin-y-snapping/#comments</comments>
		<pubDate>Sat, 17 Nov 2012 00:30:10 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Windows 8]]></category>
		<category><![CDATA[XAML]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3764</guid>
		<description><![CDATA[Este artículo es una traducción de “Día 2: Orientación y snapping” de Jeff Blakenburg. Puedes encontrar aquí la versión original en inglés. Hoy vamos a hablar acerca de tamaños de pantalla y porqué ellos son importantes para el desarrollo en Windows 8. En la primera parte de este artículo discutiremos la orientación y algunas maneras simples en las que podemos hacer nuestra aplicación mas útil basados en la forma en que nuestro usuario sostiene su dispositivo.  En la segunda parte, vamos a mirar a nuestra aplicación en un estado “snapped” y como podríamos cambiar nuestra interfaz para acomodarla en un tamaño de pantalla mucho menor. La orientación y el snap son importantes porque si tu no los consideras en t aplicación, tu aplicación no será aprobada en la Tienda de Windows. Si miras en los requerimientos de la certificación de aplicaciones de Windows 8, en la sección 3.6 podrás leer. Tu aplicación debe soportar un diseño acortado. En una orientación horizontal, las funciones de tu aplicación deben ser completamente accesibles cuando el tamaño de la pantalla es de 1024 x 768. Tu aplicación debe permanecer funcional cuando el cliente acorte o agrande la aplicación. Lo que esto dice es que [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.jeffblankenburg.com/2012/11/02/31-days-of-windows-8-day-2-orientation-snap">Este artículo es una traducción de “Día 2: Orientación y snapping” de Jeff Blakenburg. Puedes encontrar aquí la versión original en inglés.</a></p>
<p>Hoy vamos a hablar acerca de tamaños de pantalla y porqué ellos son importantes para el desarrollo en Windows 8. En la primera parte de este artículo discutiremos la orientación y algunas maneras simples en las que podemos hacer nuestra aplicación mas útil basados en la forma en que nuestro usuario sostiene su dispositivo.  En la segunda parte, vamos a mirar a nuestra aplicación en un estado “snapped” y como podríamos cambiar nuestra interfaz para acomodarla en un tamaño de pantalla mucho menor.</p>
<p>La orientación y el snap son importantes porque si tu no los consideras en t aplicación, tu aplicación no será aprobada en la Tienda de Windows.</p>
<p>Si miras en los requerimientos de la certificación de aplicaciones de Windows 8, en la sección 3.6 podrás leer.</p>
<p>Tu aplicación debe soportar un diseño acortado. En una orientación horizontal, las funciones de tu aplicación deben ser completamente accesibles cuando el tamaño de la pantalla es de 1024 x 768. Tu aplicación debe permanecer funcional cuando el cliente acorte o agrande la aplicación.</p>
<p>Lo que esto dice es que nuestra aplicación necesita soportar tres estados visuales por lo menos.</p>
<ul>
<li>1024 x 768 (la resolución mínima y el estado completo)</li>
<li>320 x 768 (snapped)</li>
<li>La resolución por defecto para la que estés planeando será generalmente 1366 x 768.</li>
</ul>
<p>Aquí hay un ejemplo de una aplicación en pantalla completa moviéndose a un tamaño reducido.</p>
<p><img title="A multi-column layout in the unsnapped and snapped states" src="http://i.msdn.microsoft.com/dynimg/IC536094.png" alt="A multi-column layout in the unsnapped and snapped states" border="0" /></p>
<p>Puedes ver en este caso, hemos re acomodado nuestro contenido para que pueda caber en un tamaño mas reducido. También hay una oportunidad para mover tu aplicación a un estado “completo” el cual es representado por el bloque gris claro a la derecha de nuestra vista acortada.</p>
<p>Afortunadamente, hay algunas maneras simples de reconocer en que estado se encuentra nuestra aplicación y el resto de este artículo será dedicado a mostrar exactamente como poder hacerlo.</p>
<p><span style="font-size: medium;"><strong>Soportar rotación</strong></span></p>
<p>Para comenzar vamos a crear nuestra casi famosa aplicación desde la plantilla en blanco de Visual Studio 2012. Una vez que la has creado, corre tu aplicación en el simulador o en una máquina remota ( más de esto adelante). Verás tu asombrosa aplicación blanca y si la rotas, la aplicación estará de hecho rotando también. ¿Por qué? ¿Cómo?</p>
<p>Por defecto, todas las plantillas en Visual Studio están configuradas para soportar todas las rotaciones. Recuerdas el archivo package.appmanifest? En la tabla de la UI de la aplicación encontrarás una sección llamada <strong>Orientaciones soportadas</strong> (Suported orientations). Al checar una o más de las preferencias estás seleccionando que orientaciones podrá soportar tu aplicación. De nuevo, por defecto las soportará todas.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/image_thumb42.png"><img title="image_thumb4" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/image_thumb4_thumb.png" alt="image_thumb4" width="500" height="75" border="0" /></a></p>
<p>Dependiendo de tu situación, este podría ser un valor agregado para la experiencia general de tu aplicación. Por ejemplo, si estás creando un juego quizá solo quieras un modo horizontal.</p>
<p><strong><span style="font-size: medium;">Reconocer el cambio de orientación</span></strong></p>
<p>El primer paso al trabajar con orientaciones es asegurarnos que podemos reconocer cuando un cambio de orientación ha sucedido. Afortunadamente, el SDK de Windows 8 nos ha proveído con el sensor SimpleOrientationSensor que tiene eventos para este propósito exacto. Para este ejemplo, hemos comenzado de nuevo con solo una plantilla en blanco en Visual Studio 2012.</p>
<p>Primero, hemos agregado un control simple de TextBox a nuestro archivo MainPage.xaml. Aquí está el conjunto entero de código para este archivo.</p>
<pre class="brush: xml">&lt;page x:Class=&quot;Dia_2.MainPage&quot;
xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
xmlns:local=&quot;using:Dia_2&quot;
xmlns:d=&quot;http://schemas.microsoft.com/expression/blend/2008&quot;
xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;
mc:Ignorable=&quot;d&quot;&gt;

&lt;grid Background=&quot;{StaticResource ApplicationPageBackgroundThemeBrush}&quot;&gt;
&lt;textblock Text=&quot;No orientation reading.&quot; x:Name=&quot;AlertBox&quot; FontSize=&quot;50&quot; TextAlignment=&quot;Center&quot; Margin=&quot;0,100,0,0&quot; /&gt;
&lt;/grid&gt;
&lt;/page&gt;</pre>
<p>Ahora, abre el archivo MainPage.xaml.cs. Necesitamos agregar algo de código para usar este sensor.</p>
<p>Lo primero que agregaremos es una nueva sentencia using: <strong>using Windows.Devices.Sensors;</strong>. Lo siguiente que agregaremos es una nueva instancia de la clase SimpleOrientationSensor y agregar algunos manejadores de eventos para ser capaces de reconocer el cambio de orientación. Aquí está el código entero de mi archivo MainPage.xaml.cs. Explicaremos el código después. Hay algunas piezas del código C# que debería explicar.</p>
<pre class="brush: csharp">using System;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
using Windows.Devices.Sensors;

namespace Dia_2
{
public sealed partial class MainPage : Page
{
private SimpleOrientationSensor sensorOrientacion;

public MainPage()
{
this.InitializeComponent();
sensorOrientacion = SimpleOrientationSensor.GetDefault();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
if(sensorOrientacion != null)
sensorOrientacion.OrientationChanged += sensorOrientacion_OrientationChanged;
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
if(sensorOrientacion != null)
sensorOrientacion.OrientationChanged -= sensorOrientacion_OrientationChanged;
}

async private void sensorOrientacion_OrientationChanged(SimpleOrientationSensor sender, SimpleOrientationSensorOrientationChangedEventArgs args)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =&gt;
{
MostrarTextoOrientacion(args.Orientation);
});
}

private void MostrarTextoOrientacion(SimpleOrientation orientacionSimple)
{
switch (orientacionSimple)
{
case SimpleOrientation.Facedown:
txtAlerta.Text = &quot;Hacia abajo&quot;;
break;
case SimpleOrientation.Faceup:
txtAlerta.Text = &quot;Hacia arriba&quot;;
break;
case SimpleOrientation.NotRotated:
txtAlerta.Text = &quot;Sin rotación&quot;;
break;
case SimpleOrientation.Rotated180DegreesCounterclockwise:
txtAlerta.Text = &quot;Rotado 180 grados&quot;;
break;
case SimpleOrientation.Rotated270DegreesCounterclockwise:
txtAlerta.Text = &quot;270 grados a la izquierda&quot;;
break;
case SimpleOrientation.Rotated90DegreesCounterclockwise:
txtAlerta.Text = &quot;90 grados a la izquierda&quot;;
break;
default:
txtAlerta.Text = &quot;Desconocido&quot;;
break;
}
}
}
}</pre>
<p>Primero, creamos un nuevo objeto SimpleOrientationSensor llamado orientationSensor. En el método constructor, MainPage(), instanciamos el objeto con la orientación preestablecida del sensor del dispositivo.</p>
<p>En el manejador de eventos OnNavigatedTo() y OnNavigatedFrom(), agregamos y retiramos un evento sensorOrientacion_OrientationChanged a nuestro nuevo objeto. Es importante asegurarnos que el objeto no sea nulo porque hay dispositivos que no tienen este sensor obtendrás un error.</p>
<p>Después, tenemos un nuevo manejador de eventos llamado sensorOrientacion_OrientationChanged(). Deberías notar que esta decorado con un descriptor <strong>async</strong> y utiliza la palabra reservada <strong>await</strong> cuando ejecuta su acción. Esto es hecho para evitar cuellos de botella en nuestro código que podría de otra manera podría colapsar la aplicación. (<a href="http://msdn.microsoft.com/en-us/library/hh191443.aspx">Puedes leer un poco más acerca de async/await en MSDN</a>).</p>
<p>Una vez que la información haya sido obtenida, llamamos a un nuevo método, MostrarTextoOrientacion() pasando los datos de la orientación.</p>
<p>Finalmente, MostrarTextoOrientacion() ejecuta un simple ciclo switch con todas las posibiles orientaciones que puedan existir: NotRotated, Rotated90DegreesCounterclockwise, Rotated180DegreesCounterclockwise, Rotated270DegreesCounterclockwise, Facedown, Faceup, ó Unknown. Yo creo que es chistoso que uno haya sido nombrado Rotated180DegreesCounterclockwise dado que a los 180° no importaría desde que dirección haya llegado.</p>
<p>Aquí hay un vistazo rápido de la aplicación en su estado actual.</p>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/qqnGPmp5NnE" frameborder="0" allowfullscreen></iframe></p>
<p><span style="font-size: medium;"><strong>Depuración remota</strong></span></p>
<p>Ahora, si no eres como Clark y yo, te gusta entonces escribir tu código en una máquina de escritorio con un procesador de cuatro núcleos, quizá 8-12 GB de RAM, monitor dual de 27’&#8217;, mouse y teclado, seleccionar tu monitos para cambiar la orientación simplemente no funcionará. Además del SimpleOrientationSensor, lo que nosotros estamos usando no es una aplicación emulada sino que necesitaremos un dispositivo real para hacerlo.</p>
<p>Otra lección importante que aprendimos: Es un <strong>simulador</strong>, no un emulador como en Windows Phone. Esto es porque solo simulará la máquina en donde estará corriendo, no como un dispositivo completamente diferente y capaz.</p>
<p>Afortunadamente, Microsoft a dado una forma para que nosotros la podamos utilizar y ver nuestra aplicación en un dispositivo secundario, tal y como lo hacemos al crear aplicaciones Windows Phone. Aquí hay una pequeña historia de como funciona (MSDN tiene la mas larga y completa historia):</p>
<p>Instala las herramientas de depuración remota en el dispositivo secundario. Yo estoy usando una <a href="http://www.amazon.com/gp/product/B005OUQ9JC/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B005OUQ9JC&amp;linkCode=as2&amp;tag=thomasworthin-20">Samsung Series 7 Slate</a>, pero cualquier dispositivo Windows 8 colocado de fábrica en una tableta podría funcionar. Puedes descargar las herramientas de depuración remota desde <a href="http://www.microsoft.com/en-us/download/details.aspx?id=30674">aquí.</a> Asegúrate de escoger el sabor adecuado entre, x86, x64 o ARM dependiendo de tu dispositivo.</p>
<p>Corre las herramientas remotas en el dispositivo secundario. Verás un ícono se se asemeja a esto:</p>
<p><img title="RemoteDebuggerIcon" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/RemoteDebuggerIcon1.png" alt="RemoteDebuggerIcon" width="120" height="120" border="0" /></p>
<p>Una vez que el depurador remoto esta corriendo en tu dispositivo secundario, regresa a tu máquina primaria y selecciona “Remote Machine” como el objeto para desplegar tu aplicación.</p>
<p><img title="RemoteMachineDebuggingOption" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/RemoteMachineDebuggingOption1.png" alt="RemoteMachineDebuggingOption" width="214" height="181" border="0" /></p>
<p>Cuando eligas “Remote Machine” por primera vez, te aparecerá un diálogo que se parece al de la imagen de abajo. Recuerda, los dispositivos en una subred solo aparecerán si las herramientas de depuración remota han sido instaladas y estén ejecutándose.</p>
<p><img title="RemoteDebuggerConnections" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/RemoteDebuggerConnections1.png" alt="RemoteDebuggerConnections" width="400" height="500" border="0" /></p>
<p>&nbsp;</p>
<p>Después, cuando quieras cambiar dispositivos, vas a molestarte cuando quieras saber donde esta esta opción guardada. Estoy aquí mis queridos lectores para evitarles esa molestia. Abre las propiedades de tu proyecto ( Alt + Enter ) y escoge la tabla de Depuración. Desde aquí, podrás cambiar o remover tu selección previa. Si tu retiras la elección, la próxima vez que escojas la depuración remota, obtendrás el cuadro de diálogo anterior.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/ProjectPropertiesDebug2.png"><img title="ProjectPropertiesDebug" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/ProjectPropertiesDebug_thumb2.png" alt="ProjectPropertiesDebug" width="500" height="305" border="0" /></a></p>
<p><span style="font-size: medium;"><strong>De vuelta al código…</strong></span></p>
<p>Ok, hasta este punto, tenemos una aplicación que reconoce que la orientación del dispositivo ha cambiado. Todo esto esta bien cuando queremos hacer algo específico “en código” con orientación, pero ¿Qué pasa si nosotros queremos que nuestra aplicación se re oriente a si misma para ser utilizable para nuestro usuario? Hay una manera mucho mas sencilla gracias al VisualStateManager.</p>
<p>Ve de vuelta a tu proyecto y da un clic derecho para abrir el cuadro de diálogo de un nuevo elemento.</p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/AddNewBasicPageDialog2.png"><img title="AddNewBasicPageDialog" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/AddNewBasicPageDialog_thumb2.png" alt="AddNewBasicPageDialog" width="500" height="339" border="0" /></a></p>
<p>Agrega una nueva página básica, nosotros la nombramos PaginaOrientacion. Si le das un vistazo al XAML para esta página, descubrirás que estamos trabajando con una objeto de página justo afuera de la caja. Esta es una LayoutAwarePage y por defecto ya tiene la suficiente estructura para orientarse a si misma apropiadamente e incluso te da un VisualState para la vista acortada también.</p>
<p>Además, al usar este tipo de página el simulador también respeta los cambios de orientación.</p>
<p>Esto quiere decir que solo por utilizar este tipo de página, automáticamente obtenemos una página lista para la orientación y vista acordada que tiene un conjunto estático de estados visuales que podemos manipular para hacer que nuestra página haga lo que nos gustaría. Para hacer esto mas obvio, voy a modificar mis estados visuales para que cada una tenga un fondo diferente de color.</p>
<p><img title="LandscapeOrientation" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/LandscapeOrientation1.png" alt="LandscapeOrientation" width="400" height="247" border="0" /></p>
<p><img title="PortraitOrientation" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/PortraitOrientation1.png" alt="PortraitOrientation" width="247" height="400" border="0" /></p>
<p><img title="SnappedState" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/SnappedState1.png" alt="SnappedState" width="400" height="247" border="0" /></p>
<p>Aquí hay un vistazo de los valores modificadoes de nuestra PaginaOrientacion.xaml:</p>
<pre class="brush: xml">&lt;visualstatemanager .VisualStateGroups&gt;
&lt;visualstategroup x:Name=&quot;ApplicationViewStates&quot;&gt;
&lt;visualstate x:Name=&quot;FullScreenLandscape&quot;&gt;
&lt;storyboard&gt;
&lt;objectanimationusingkeyframes Storyboard.TargetName=&quot;layoutRoot&quot; Storyboard.TargetProperty=&quot;Background&quot;&gt;
&lt;discreteobjectkeyframe KeyTime=&quot;0&quot; Value=&quot;Purple&quot;/&gt;
&lt;/objectanimationusingkeyframes&gt;
&lt;/storyboard&gt;
&lt;/visualstate&gt;
&lt;visualstate x:Name=&quot;Filled&quot;&gt;
&lt;storyboard&gt;
&lt;objectanimationusingkeyframes Storyboard.TargetName=&quot;layoutRoot&quot; Storyboard.TargetProperty=&quot;Background&quot;&gt;
&lt;discreteobjectkeyframe KeyTime=&quot;0&quot; Value=&quot;Orange&quot;/&gt;
&lt;/objectanimationusingkeyframes&gt;
&lt;/storyboard&gt;
&lt;/visualstate&gt;
&lt;visualstate x:Name=&quot;FullScreenPortrait&quot;&gt;
&lt;storyboard&gt;
&lt;objectanimationusingkeyframes Storyboard.TargetName=&quot;layoutRoot&quot; Storyboard.TargetProperty=&quot;Background&quot;&gt;
&lt;discreteobjectkeyframe KeyTime=&quot;0&quot; Value=&quot;DarkGreen&quot;/&gt;
&lt;/objectanimationusingkeyframes&gt;
&lt;objectanimationusingkeyframes Storyboard.TargetName=&quot;backButton&quot; Storyboard.TargetProperty=&quot;Style&quot;&gt;
&lt;discreteobjectkeyframe KeyTime=&quot;0&quot; Value=&quot;{StaticResource PortraitBackButtonStyle}&quot;/&gt;
&lt;/objectanimationusingkeyframes&gt;
&lt;/storyboard&gt;
&lt;/visualstate&gt;
&lt;visualstate x:Name=&quot;Snapped&quot;&gt;
&lt;storyboard&gt;
&lt;objectanimationusingkeyframes Storyboard.TargetName=&quot;layoutRoot&quot; Storyboard.TargetProperty=&quot;Background&quot;&gt;
&lt;discreteobjectkeyframe KeyTime=&quot;0&quot; Value=&quot;Blue&quot;/&gt;
&lt;/objectanimationusingkeyframes&gt;
&lt;objectanimationusingkeyframes Storyboard.TargetName=&quot;backButton&quot; Storyboard.TargetProperty=&quot;Style&quot;&gt;
&lt;discreteobjectkeyframe KeyTime=&quot;0&quot; Value=&quot;{StaticResource SnappedBackButtonStyle}&quot;/&gt;
&lt;/objectanimationusingkeyframes&gt;
&lt;objectanimationusingkeyframes Storyboard.TargetName=&quot;pageTitle&quot; Storyboard.TargetProperty=&quot;Style&quot;&gt;
&lt;discreteobjectkeyframe KeyTime=&quot;0&quot; Value=&quot;{StaticResource SnappedPageHeaderTextStyle}&quot;/&gt;
&lt;/objectanimationusingkeyframes&gt;
&lt;/storyboard&gt;
&lt;/visualstate&gt;
&lt;/visualstategroup&gt;
&lt;/visualstatemanager&gt;</pre>
<p>Como puedes ver, simplemente hemos agregado un nuevo nodo para cada sección que modifique la propiedad Background de mi Grid LayoutRoot. Lo que esta nueva LayoutAwarePage nos permite hacer, en lugar de escribir toneladas de código para administrar nuestra orientación, nos  preocupamos por lo que realmente interesa: Nuestra personalización. Al escribir estilos separados para los elementos de nuestra página basados en estados visuales de nuestra página, simplificamos nuestro proceso entero.</p>
<p><span style="font-size: medium;"><strong>En conclusión</strong></span></p>
<p>Hoy, dimos una vista a como podemos determinar la orientación del dispositivo de un usuario asó como poder utilizar el item LayoutAwarePage para manejar los diferentes estados visuales que nuestra aplicación puede encontrar. Hay toneladas de grandes ejemplos en la web relacionados a orientación y snap, pero hay UNA lección que puedes tomar de este artículo, es:</p>
<p><strong>Tu aplicación DEBE cubrir el estado snapped. Asegúrate de acomodarla.</strong></p>
<p>Para descargar la solución de ejemplo completa de este artículo, puedes descargarla aquí.</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia%202.zip"><img title="downloadXAML" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/11/downloadXAML5.png" alt="downloadXAML" width="150" height="150" border="0" /></a></p>
<p>Mañana, vamos a ver el uso de las pantallas de inicio. Es una herramienta valiosa para cargar tu aplicación así como monetizarla. Veremos a fondo esto mañana. ¡Nos vemos!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/11/31-das-de-windows-8-da-2-orientacin-y-snapping/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>31 D&#237;as de Windows 8 &#124; D&#237;a 1: La aplicaci&#243;n en blanco</title>
		<link>http://blogs.ligasilverlight.com/2012/11/31-das-de-windows-8-da-1-la-aplicacin-en-blanco/</link>
		<comments>http://blogs.ligasilverlight.com/2012/11/31-das-de-windows-8-da-1-la-aplicacin-en-blanco/#comments</comments>
		<pubDate>Thu, 15 Nov 2012 19:07:14 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Windows 8]]></category>
		<category><![CDATA[XAML]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3757</guid>
		<description><![CDATA[Este artículo es una traducción de “Día 1: La aplicación en blanco” de Jeff Blankenburg. Puedes encontrar aquí la versión original en inglés. En el primer artículo de esta serie, pensamos que era importante cubrir las bases de una plantilla de tipo Windows Store Blank App para Visual Studio 2012. Cubriremos cada uno de los archivos y la razón por la que es importante así como muchas de las configuraciones que podrían estar ocultas en cada una. Esto debería darte una base sólida para el resto de la serie donde estaremos utilizando cada uno de estos archivos bastante. Hay muchas otras plantillas de proyectos en Visual Studio 2012 pero somos de la opinión de que esas son excelentes plantillas de referencia en lugar de puntos de inicio para una aplicación real. Estas plantillas fueron hechas con un tipo específico de aplicación en mente y es complicado que tu idea encaje en esta arquitectura perfectamente. Casi siempre recomendamos iniciar con una plantilla en blanco cuando estás comenzando una aplicación real. Aquí esta una vista del Explorador de Soluciones para una aplicación en blanco en una solución XAML. Las imágenes Comencemos con las sencillas, las imágenes en el folder “Assets”. Hay cuatro [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.jeffblankenburg.com/2012/11/01/31-days-of-windows-8-day-1-the-blank-app">Este artículo es una traducción de “Día 1: La aplicación en blanco” de Jeff Blankenburg. Puedes encontrar aquí la versión original en inglés.</a></p>
<p>En el primer artículo de esta serie, pensamos que era importante cubrir las bases de una plantilla de tipo Windows Store Blank App para Visual Studio 2012. Cubriremos cada uno de los archivos y la razón por la que es importante así como muchas de las configuraciones que podrían estar ocultas en cada una. Esto debería darte una base sólida para el resto de la serie donde estaremos utilizando cada uno de estos archivos bastante.</p>
<p>Hay muchas otras plantillas de proyectos en Visual Studio 2012 pero somos de la opinión de que esas son excelentes plantillas de referencia en lugar de puntos de inicio para una aplicación real. Estas plantillas fueron hechas con un tipo específico de aplicación en mente y es complicado que tu idea encaje en esta arquitectura perfectamente. Casi siempre recomendamos iniciar con una plantilla en blanco cuando estás comenzando una aplicación real.</p>
<p>Aquí esta una vista del Explorador de Soluciones para una aplicación en blanco en una solución XAML.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/11/image.png"><img style="background-image: none; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; margin-right: auto; border: 0px;" title="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/11/image_thumb.png" alt="image" width="263" height="399" border="0" /></a></p>
<p><span style="font-size: large;"><strong>Las imágenes</strong></span></p>
<p>Comencemos con las sencillas, las imágenes en el folder “Assets”. Hay cuatro imágenes dentro de cada nuevo proyecto y cada una de ellas sirve a un propósito específico. Hemos creado cuatro versiones de esas imágenes (así como una adicional) de modo que es muy obvio de saber que imagen es cual cuando corras tu aplicación. Nosotros recomendamos ampliamente descargar estas imágenes y reemplazar las que se encuentran por defecto. <a href="http://jeffblankenburg.com/downloads/31daysofwindows8/defaultimages.zip">Puedes descargar las 5 desde aquí</a>. Una vez que hayas reemplazado las imágenes pre establecidas, corre tu proyecto para ver estas nuevas imágenes en sus ubicaciones como se describe abajo.</p>
<p><span style="font-size: medium;"><strong>Logo.png</strong></span></p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/10/Logo.png"><img title="Logo" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/10/Logo_thumb.png" alt="Logo" width="150" height="150" border="0" /></a></p>
<p>Esta es quizá la imagen más común que tu aplicación utilizará. Es una imagen pre establecida para el mosaico de tu aplicación en la pantalla de inicio del usuario. Es de 150 x 150 píxeles en tamaño.</p>
<p><span style="font-size: medium;"><strong>SmallLogo.png</strong></span></p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/10/SmallLogo.png"><img title="SmallLogo" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/10/SmallLogo_thumb.png" alt="SmallLogo" width="30" height="30" border="0" /></a></p>
<p>Esta imagen es usada cuando una lista de aplicaciones se muestra. Por ejemplo, cuando buscas por una aplicación en Windows 8 o en tu menú de Compartir. La imagen pequeña es de 30 x 30 píxeles. Con ese tamaño de imagen querrás asegurarte de que ti ícono realmente representa algo familiar para tu usuario. Yo recomiendo altamente solo un logo o cualquier imagen obvia.</p>
<p><span style="font-size: medium;"><strong>SplashScreen.png</strong></span></p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/10/splashscreen.png"><img title="splashscreen" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/10/splashscreen_thumb.png" alt="splashscreen" width="500" height="242" border="0" /></a></p>
<p>Esta es la imagen principal que carga cuando tu aplicación es iniciada. Hay algunos buenos trucos que puedes hacer con esto y los cubriremos más adelante en la serie. Por ahora, recuerda que esta imagen será <strong>siempre</strong> de 620 x 300 píxeles y estará vertical y horizontalmente centrada en la pantalla de tu usuario, sin importar el tamaño.</p>
<p><span style="font-size: medium;"><strong>StoreLogo.png</strong></span></p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/10/StoreLogo.png"><img title="StoreLogo" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/10/StoreLogo_thumb.png" alt="StoreLogo" width="50" height="50" border="0" /></a></p>
<p>Para ahorrar espacio en la tienda, tenemos un ícono mas pequeño a mostrar. Esta imagen es de 50 x 50 píxeles pero podrían ser los 2500 píxeles mas importantes en tu aplicación entera. Este es el ícono que los usuarios verán cuando se estén decidiendo acerca de que nuevas aplicaciones agregar a su dispositivo. Un ícono pobre indica una aplicación pobre para la mayoría de los usuario. Invierte un poco de tiempo en esta imagen.</p>
<p><span style="font-size: medium;"><strong>WideLogo.png</strong></span></p>
<p><a href="http://www.jeffblankenburg.com/wp-content/uploads/2012/10/WideLogo.png"><img title="WideLogo" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/10/WideLogo_thumb.png" alt="WideLogo" width="310" height="150" border="0" /></a></p>
<p>Este es un ícono adicional que yo incluí en mi proyecto inicial. Necesitarás agregarlo en tu proyecto al dar un clic derecho en el folder Assets y escoger <strong>Agregar elemento existente. </strong>Esta imagen es de 310 x 150 píxeles y es usada para permitir que tu aplicación tenga un mosaico más amplio que únicamente un mosaico mas grande que el del tamaño predefinido de Logo.png</p>
<p><span style="font-size: medium;"><strong>AssemblyInfo.cs</strong></span></p>
<p>Este archivo contiene toda la, espera un poco, información de ensamblados para tu aplicación. Cosas como el número de las versiones, títulos, descripciones, etc. Pero recuerda… estos son los valores para tu ensamblado. Todos los nombres oficiales que son usados públicamente para tu aplicación en la tienda se encuentran en el App Manifest, nuestro siguiente archivo.</p>
<p><span style="font-size: medium;"><strong>Package.appmanifest</strong></span></p>
<p>Este archivo contiene toda la configuración, ajustes y declaraciones para tu aplicación. Es donde irás para casi cada cosa que esté relacionada a tu aplicación corriendo en una máquina con Windows 8. Por ejemplo, es aquí donde tu defines que el contrato de búsqueda sea habilitado o que ícono usar en cada situación. También define los colores por defecto del fondo, orientaciones y capacidades específicas que tu aplicación requerirá como el acceso a ubicación.</p>
<p><strong><span style="font-size: medium;">StandardStyles.xaml</span></strong></p>
<p>Esas 1830 líneas amontonadas no son nada mas que una pila gigante de estilos predefinidos en XAML para que puedas utilizar. Estilos para cajas de texto, botones de radio, íconos de la barra de aplicación y mas. Realmente te recomiendo familiarizarte con estos estilos pero también es importante que recuerdes que cualquiera de estos estilos puede ser cambiado para encajar en tus necesidades. ¿No quieres un borde en todos tus botones? ¡Retíralo!</p>
<p>Quizá también consideres tus propios estilos para este archivo, solo recuerda que estos estilos estarán disponibles para cada página de tu aplicación gracias a nuestro siguiente archivo: App.xaml.</p>
<p><strong><span style="font-size: medium;">App.xaml</span></strong></p>
<p>Este archivo es donde todo comienza. Es el primer archivo en ser cargado cuando tu aplicación inicia y contiene todos los recursos y ajustes de tu aplicación. Por defecto, este archivo solo contiene una línea valiosa de marcado.</p>
<pre lang="xml"> <pre class="brush: xml">&lt;resourcedictionary Source=&quot;Common/StandardStyles.xaml&quot;/&gt;</pre>
<p>Esto carga nuestro archivo de StandarStyles.xaml como un diccionario de recursos, marcando aquellos estilos disponibles en cada página de nuestra aplicación. La magia real de App.xaml se encuentra en su archivo de código C#: App.xaml.cs. Démosle un vistazo al que sigue.</p>
<p><span style="font-size: medium;"><strong>App.xaml.cs</strong></span></p>
<p>Este archivo, tal como lo hizo en Windows Phone, es donde la acción comienza. Es aquí donde se encuentran todos los métodos de inicio de tu aplicación como <strong>OnLaunched()</strong>, <strong>OnSuspending()</strong> y más. También es quí el lugar donde la página de inicio de tu aplicación será referenciada. Verás unas cuantas líneas en el método OnLaunched() que se verán como lo siguiente.</p>
<pre lang="csharp"><pre class="brush: csharp">if (!rootFrame.Navigate(typeof(MainPage), args.Arguments))
{
throw new Exception(&quot;Failed to create initial page&quot;);
}</pre>
<p>El parámetro <strong>MainPage</strong> se refiere a nuestro siguiente archivo, <strong>MainPage.xaml</strong>.</p>
<p><span style="font-size: medium;"><strong>MainPage.xaml</strong></span></p>
<p>Este archivo es la “página de inicio” por defecto de tu aplicación. Es la primera que el usuario verá después de que la pantalla de carga se haya retirado. En tu proyecto básicamente se encontrará vacía salvo por un control de tipo Grid con un estilo aplicado. Vas a querer agregar mas a esta página casi inmediatamente y hay muchos controles geniales para utilizar. Te recomiendo ver los controles de <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.gridview.aspx">GridView</a> o <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.flipview.aspx">FlipView</a> para principiantes, pero utiliza lo que tenga más sentido para tu aplicación.</p>
<p><strong><span style="font-size: medium;">MainPage.xaml.cs</span></strong></p>
<p>De neuvo, así como MainPage.xaml, este archivo estará prácticamente vacío. Tenemos un método constructor para la página así como un manejador de eventos para el método OnNavigatedTo(). En Windows Phone, este estaba siempre disponible para su uso (y era altamente recomendado), pero ahora esta ahí por defecto significando que muchos desarrolladores comenzarán a utilizarlo en lugar del método constructor de la página.</p>
<p><span style="font-size: medium;"><strong>Dia1_TemporaryKey.pfx</strong></span></p>
<p>Cada aplicación para la tienda de Windows esta firmada por un certificado. Cuando tu creas un proyecto por primera vez en Visual Studio este creará un nuevo certificado de prueba automáticamente. En nuestro cado este certificado de prueba es llamado <strong>Dia1_TemporaryKey.pfx</strong> donde Dia_1 es nuestro proyecto. De nuevo puedes encontrar este conjunto en el archivo <strong>package.appxmanifest</strong> debajo de la tabla <strong>Packaging</strong>. Puedes incluso crear nuevos certificados de ser necesario.</p>
<p>Una vez que estés listo para ingresar a la tienda, necesitarás asociar tu aplicación con la cuenta de desarrollador de la tienda Microsoft. Puedes hacer esto yendo a Proyectos, Tienda, Asociar App con la tienda.</p>
<p><a href="file:///C:/Users/Jeff/AppData/Local/Temp/WindowsLiveWriter-1388407111/supfiles4B35C0/image3.png"><img title="image_thumb1" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/10/image_thumb1.png" alt="image_thumb1" width="432" height="352" border="0" /></a></p>
<p>Puedes encontrar mas información acerca de <a href="http://msdn.microsoft.com/en-us/library/windows/apps/br230260.aspx">firmar el paquete de una aplicación aquí</a>.</p>
<p>Conclusión</p>
<p>Así que ¡Eso es todo! Estamos solo empezando en esta serie, pero ahora ya tienes un entendimiento más sólido de cada uno de los archivos de una plantilla en blanco para XAML. En el caso de que no hayas instalado aún Visual Studio 2012, pero aún quieras dar una revisada a los archivos de código para este tipo de proyecto puedes descargarlo aquí.</p>
<p><a href="http://aminespinoza.com/materialBlog/31DiasWindows8/Dia1.zip"><img title="downloadXAML" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/10/downloadXAML.png" alt="downloadXAML" width="150" height="150" border="0" /></a></p>
<p>Mañana, vamos a enfocarnos en la orientación y snapping, dos aspectos importantes de tu aplicación que comúnmente son omitidos. Si aún no descargas las herramientas gratuitas para construir aplicaciones para WIndows 8, puedes hacerlo desde el enlace de abajo. ¡Nos vemos mañana!</p>
<p><a href="http://bit.ly/win8devgear"><img title="downloadTheTools" src="http://www.jeffblankenburg.com/wp-content/uploads/2012/10/downloadTheTools1.png" alt="downloadTheTools" width="500" height="61" border="0" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/11/31-das-de-windows-8-da-1-la-aplicacin-en-blanco/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>31 d&#237;as con Windows 8</title>
		<link>http://blogs.ligasilverlight.com/2012/11/31-das-con-windows-8/</link>
		<comments>http://blogs.ligasilverlight.com/2012/11/31-das-con-windows-8/#comments</comments>
		<pubDate>Thu, 15 Nov 2012 16:32:16 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3752</guid>
		<description><![CDATA[Una nueva serie cortesía de Jeff Blakenburg ha comenzado y así como el año pasado, te traemos la traducción para que puedas aprender de una manera más cómoda. En esta ocasión se trata de 31 días con Windows 8. Como muchos deben saber es que en el caso del desarrollo de aplicaciones para Windows 8 existe la posibilidad de desarrollar aplicaciones por medio de HTML y Javascript o utilizando XAML y C#. Esta última forma será en la que nos basaremos en esta serie. El índice original de estos artículos es el siguiente.]]></description>
				<content:encoded><![CDATA[<p>Una nueva serie cortesía de <a href="http://twitter.com/jeffblankenburg">Jeff Blakenburg</a> ha comenzado y así como el año pasado, te traemos la traducción para que puedas aprender de una manera más cómoda. En esta ocasión se trata de 31 días con Windows 8. Como muchos deben saber es que en el caso del desarrollo de aplicaciones para Windows 8 existe la posibilidad de desarrollar aplicaciones por medio de HTML y Javascript o utilizando XAML y C#. Esta última forma será en la que nos basaremos en esta serie. El índice original de estos artículos es el <a href="http://31daysofwindows8.com/">siguiente</a>.</p>
<p><a href="http://blogs.ligasilverlight.com/2012/11/31-das-de-windows-8-da-1-la-aplicacin-en-blanco/" target="_blank"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Dia 1" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/11/Dia-1_thumb.jpg" alt="Dia 1" width="173" height="173" border="0" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/11/31-das-con-windows-8/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WCF Ria Services V1.0 para Silverlight 4.- Eliminar un registro de la Base de Datos (Parte 9)</title>
		<link>http://blogs.ligasilverlight.com/2012/05/wcf-ria-services-v1-0-para-silverlight-4-eliminar-un-registro-de-la-base-de-datos-parte-9/</link>
		<comments>http://blogs.ligasilverlight.com/2012/05/wcf-ria-services-v1-0-para-silverlight-4-eliminar-un-registro-de-la-base-de-datos-parte-9/#comments</comments>
		<pubDate>Sat, 19 May 2012 00:44:17 +0000</pubDate>
		<dc:creator>Jorge Levy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3744</guid>
		<description><![CDATA[Para terminar con el tema de acciones CRUD con datos por medio de WCF Ria Services en Silverlight, en este post hablaremos del último tema pendiente, eliminar un registro. Nuevamente la recomendación es leer al menos los dos post previos en el tema para comprender de mejor manera las acciones de editar un registro y de agrear uno nuevo; ya que estaremos reutilizando los conceptos expuestos. Eliminando el registro Bajo la misma dinámica que hacer las cosas de la manera más facil, para eliminar un registro necesitaremos de solo dos lineas de código; o tres, en el caso de pedir la confirmación de la acción. Agregamos un nuevo botón que nos permita eliminar el registro que actualmente se tiene seleccionado en el grid. &#60;Button x:Name="btnRemove" Content="Eliminar" Height="23" Width="115" HorizontalAlignment="Left" Click="btnRemove_Click" /&#62; Y en la acción del click, escribiremos el código donde indicaremos que al DataView del Domain Data Source le removeremos el registro actual que podemos obtener desde el mismo DataView utilizando la propiedad CurrentItem y haciendo el cast al tipo de objeto que contiene. Y, como ya lo sabemos, tendremos que enviar los cambios a nuestro servicio wcf para que estos sean replicado a la base de datos. Adicionalmente [...]]]></description>
				<content:encoded><![CDATA[<p>Para terminar con el tema de acciones CRUD con datos por medio de WCF Ria Services en Silverlight, en este post hablaremos del último tema pendiente, eliminar un registro.</p>
<p>Nuevamente la recomendación es leer al menos los dos post previos en el tema para comprender de mejor manera las acciones de <a href="http://blogs.ligasilverlight.com/2011/03/wcf-ria-services-v1-0-para-silverlight-4-guardar-datos-hacia-la-base-de-datos-parte-7/">editar un registro</a> y de <a href="http://blogs.ligasilverlight.com/2012/05/wcf-ria-services-v1-0-para-silverlight-4-agregar-un-nuevo-registro-hacia-la-base-de-datos-parte-8/">agrear uno nuevo</a>; ya que estaremos reutilizando los conceptos expuestos.</p>
<h4>Eliminando el registro</h4>
<p>Bajo la misma dinámica que hacer las cosas de la manera más facil, para eliminar un registro necesitaremos de solo dos lineas de código; o tres, en el caso de pedir la confirmación de la acción.</p>
<p>Agregamos un nuevo botón que nos permita eliminar el registro que actualmente se tiene seleccionado en el grid.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:bd6f060e-fbb1-42b9-a258-f46edc38c88b" class="wlWriterEditableSmartContent">
<pre class="brush: xml;">&lt;Button x:Name="btnRemove"
        Content="Eliminar"
        Height="23"
        Width="115"
        HorizontalAlignment="Left"
        Click="btnRemove_Click" /&gt;</pre>
</div>
<p>Y en la acción del click, escribiremos el código donde indicaremos que al DataView del Domain Data Source le removeremos el registro actual que podemos obtener desde el mismo DataView utilizando la propiedad CurrentItem y haciendo el cast al tipo de objeto que contiene. Y, como ya lo sabemos, tendremos que enviar los cambios a nuestro servicio wcf para que estos sean replicado a la base de datos. Adicionalmente agregaremos una ventana de confirmación de la acción que permitirá al usuario pensar dos veces sobre la acción a realizar.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:1e8a9bec-e0b9-4f5b-b6dd-505fd6c82e88" class="wlWriterEditableSmartContent">
<pre class="brush: c#;">private void btnRemove_Click(object sender, RoutedEventArgs e)
{
    if (System.Windows.Browser.HtmlPage.Window.Confirm("Estas seguro de querer eliminar el producto"))
    {
        productDomainDataSource.DataView.Remove(
            productDomainDataSource.DataView.CurrentItem as Product);
        productDomainDataSource.SubmitChanges();
    }
}</pre>
</div>
<h4>Cerrando el tema</h4>
<p>Si bien, el tema de WCF Ria Services da para mucho más, con temas como validaciones desde el modelo o desde la misma vista, el indicador de actividad, entre muchos otros; con este post podremos decir que hemos cerrado los temas básicos sobre WCF Ria Services para Silverlight.</p>
<p>Gracias y saludos…</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/05/wcf-ria-services-v1-0-para-silverlight-4-eliminar-un-registro-de-la-base-de-datos-parte-9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCF Ria Services V1.0 para Silverlight 4.- Agregar un nuevo registro hacia la Base de Datos (Parte 8)</title>
		<link>http://blogs.ligasilverlight.com/2012/05/wcf-ria-services-v1-0-para-silverlight-4-agregar-un-nuevo-registro-hacia-la-base-de-datos-parte-8/</link>
		<comments>http://blogs.ligasilverlight.com/2012/05/wcf-ria-services-v1-0-para-silverlight-4-agregar-un-nuevo-registro-hacia-la-base-de-datos-parte-8/#comments</comments>
		<pubDate>Fri, 18 May 2012 22:53:48 +0000</pubDate>
		<dc:creator>Jorge Levy</dc:creator>
				<category><![CDATA[WCF Ria Services]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3740</guid>
		<description><![CDATA[En nuesto post pasado, pudimos ver cómo editar los datos que se presentan en nuestra aplicación silverlight (lado del cliente), pero aún más importante cómo es que se hace la actualización de estos cambio en la base de datos. Si no has leido este post, te recomiendo lo leas, ya que utilizaremos la información mostrada en este siguiente post. Nuestro siguiente tema abordará el conceto de agregar un nuevo registro, pero además se mostraran un par de puntos a considerar cuando se está agregando un registro. Agregando un nuevo registro al cliente Para agregar un nuevo registro solo basta escribir un par de lineas de código, en donde básicamente lo que se hace es crear un nuevo objecto del tipo de datos que vamos a insertar y este se agrega al DomainDataSource que contiene los datos. Para insertar el código del que hablabamos, en nuestra vista incluiremos un botón que nos permita indicar a la aplicación que queremos agregar un nuevo registro. &#60;Button x:Name="btnAddNew" Content="Agregar nuevo" Height="23" Width="115" HorizontalAlignment="Left" Click="btnAddNew_Click" /&#62; Y será en el evento del click donde escribiremos las lineas de creación del objecto del nuevo producto, añadiendolo a los elementos del DataView de nuestro Domain Data Source. [...]]]></description>
				<content:encoded><![CDATA[<p>En nuesto post pasado, pudimos ver cómo editar los datos que se presentan en nuestra aplicación silverlight (lado del cliente), pero aún más importante cómo es que se hace la actualización de estos cambio en la base de datos. Si no has leido <a href="http://blogs.ligasilverlight.com/2011/03/wcf-ria-services-v1-0-para-silverlight-4-guardar-datos-hacia-la-base-de-datos-parte-7/">este post</a>, te recomiendo lo leas, ya que utilizaremos la información mostrada en este siguiente post.</p>
<p>Nuestro siguiente tema abordará el conceto de agregar un nuevo registro, pero además se mostraran un par de puntos a considerar cuando se está agregando un registro.</p>
<h4>Agregando un nuevo registro al cliente</h4>
<p>Para agregar un nuevo registro solo basta escribir un par de lineas de código, en donde básicamente lo que se hace es crear un nuevo objecto del tipo de datos que vamos a insertar y este se agrega al DomainDataSource que contiene los datos.</p>
<p>Para insertar el código del que hablabamos, en nuestra vista incluiremos un botón que nos permita indicar a la aplicación que queremos agregar un nuevo registro.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:438eb3d8-2a40-4361-95fb-d74566d2d2eb" class="wlWriterEditableSmartContent">
<pre class="brush: xml;">&lt;Button x:Name="btnAddNew"
        Content="Agregar nuevo"
        Height="23"
        Width="115"
        HorizontalAlignment="Left"
        Click="btnAddNew_Click" /&gt;</pre>
</div>
<p>Y será en el evento del click donde escribiremos las lineas de creación del objecto del nuevo producto, añadiendolo a los elementos del DataView de nuestro Domain Data Source.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:eca9ca4c-ed54-4709-9061-1540ad89b22a" class="wlWriterEditableSmartContent">
<pre class="brush: c#;">private void btnAddNew_Click(object sender, System.Windows.RoutedEventArgs e)
{
    WcfRiaServices.Web.Models.Product newProduct = new Web.Models.Product();
    productDomainDataSource.DataView.Add(newProduct);
}
</pre>
</div>
<p>Con esto lo que estamos haciendo es agregar un nuevo elemento al Domain Data Source, quién es el encargado de contener los datos de lado del cliente. Y, al igual que cuando queremos editar un elemento, necesitamos replicar este cambio a nuestro servicio que será el que haga la actualización en la base de datos. Como a estas alturas ya tenemos nuestro botón de ‘Guardar Cambios’ esta parte ya la tenemos cubierta.</p>
<h4>Algunas consideraciones extras</h4>
<p>Debido a que la tabla de Productos tiene algunos campos que no pueden ser nulos, además de que a estas alturas no tenemos ningun tipo de validación ni en nuestro modelo ni al momento de guardar los cambios. Sugiero al momento de crear el nuevo objeto, inicializar las propiedades que así lo requieran</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:e12b83c5-f674-48ee-af1d-d6fc33aa68f9" class="wlWriterEditableSmartContent">
<pre class="brush: c#;">private void btnAddNew_Click(object sender, System.Windows.RoutedEventArgs e)
{
    WcfRiaServices.Web.Models.Product newProduct = new Web.Models.Product();
    newProduct.rowguid = System.Guid.NewGuid();
    newProduct.SafetyStockLevel = 1000;
    newProduct.ReorderPoint = 500;
    newProduct.DiscontinuedDate = System.DateTime.Now;
    newProduct.ModifiedDate = System.DateTime.Now;
    newProduct.SellEndDate = System.DateTime.Now;
    newProduct.SellStartDate = System.DateTime.Now;
    productDomainDataSource.DataView.Add(newProduct);
}
</pre>
</div>
<h4>Siguientes post…</h4>
<p>Ya solo nos falta revizar como eliminar un registro para poder terminar con el tema de CRUD, permitiendonos así continuar con temas como validaciones o el indicator de acción (Busy Indicator)</p>
<p>Gracias y saludos</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/05/wcf-ria-services-v1-0-para-silverlight-4-agregar-un-nuevo-registro-hacia-la-base-de-datos-parte-8/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
