<?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>Sat, 19 May 2012 00:44:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<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>0</slash:comments>
		</item>
		<item>
		<title>Jugando con el ApplicationBar en los elementos de una App Panorama</title>
		<link>http://blogs.ligasilverlight.com/2012/05/3725/</link>
		<comments>http://blogs.ligasilverlight.com/2012/05/3725/#comments</comments>
		<pubDate>Wed, 02 May 2012 18:00:53 +0000</pubDate>
		<dc:creator>Jorge Levy</dc:creator>
				<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3725</guid>
		<description><![CDATA[Publicado por LucioMSP en abril 28, 2012 Hola amigos, el día de hoy les quiero compartir un pequeño tutorial sobre como manipular el ApplicationBar en todos los ítems que agreguemos en una aplicación estilo Panorama, es decir, hacer que se muestre el ApplicationBar solo en ciertos elementos de la Aplicación en Panorama y es que me encontré con varios problemas cuando quise realizar esto, ya que no encontré ningún material que me explicara al 100% lo que quería, además de que varias personas me comentaban que no se podía, o que no sabían, es por eso que quiero darlo a conocer. Parte 1  http://luciomsp.wordpress.com/2012/04/28/jugando-con-el-applicationbar-en-los-elementos-de-una-app-panorama/]]></description>
			<content:encoded><![CDATA[<p>Publicado por <a href="http://luciomsp.wordpress.com">LucioMSP</a> en abril 28, 2012</p>
<div>
<div id="pd_rating_holder_1486558_post_852">
<blockquote>
<div id="pd_rate_1486558_post_852">Hola amigos, el día de hoy les quiero compartir un pequeño tutorial sobre como manipular el ApplicationBar en todos los ítems que agreguemos en una aplicación estilo Panorama, es decir, hacer que se muestre el ApplicationBar solo en ciertos elementos de la Aplicación en Panorama y es que me encontré con varios problemas cuando quise realizar esto, ya que no encontré ningún material que me explicara al 100% lo que quería, además de que varias personas me comentaban que no se podía, o que no sabían, es por eso que quiero darlo a conocer. Parte 1</div>
</blockquote>
<div> <a href="http://luciomsp.wordpress.com/2012/04/28/jugando-con-el-applicationbar-en-los-elementos-de-una-app-panorama/">http://luciomsp.wordpress.com/2012/04/28/jugando-con-el-applicationbar-en-los-elementos-de-una-app-panorama/</a></div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/05/3725/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crear y manipular un men&#250; contextual en Silverlight</title>
		<link>http://blogs.ligasilverlight.com/2012/04/crear-y-manipular-un-men-contextual-en-silverlight/</link>
		<comments>http://blogs.ligasilverlight.com/2012/04/crear-y-manipular-un-men-contextual-en-silverlight/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 16:20:47 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Blend]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3719</guid>
		<description><![CDATA[Una funcionalidad básica de prácticamente cualquier aplicación de escritorio es el uso del clic derecho para el común despliegue de un menú contextual, una funcionalidad que extraño mucho en las páginas web, afortunadamente en Silverlight podemos aprovechar la posibilidad de usar esta herramienta. Comienza por crear una nueva solución, después, al hacerlo, crea una nueva carpeta llamada Controles, ahí por último crea un nuevo UserControl llamado MenuContextual, al terminar, tu proyecto deberá verse de la siguiente manera. Ahora en ese UserControl llamado Menu Contextual, coloca el siguiente XAML. &#60;usercontrol x:Class=&#34;Menu_Contextual.MenuContextual&#34; xmlns=&#34;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#34; xmlns:x=&#34;http://schemas.microsoft.com/winfx/2006/xaml&#34; Width=&#34;150&#34; Height=&#34;70&#34;&#62; &#60;grid x:Name=&#34;LayoutRoot&#34;&#62; &#60;rectangle Fill=&#34;#FF666666&#34; Margin=&#34;0&#34; Stroke=&#34;Black&#34;/&#62; &#60;textblock x:Name=&#34;txtOpcion1&#34; Height=&#34;20&#34; Margin=&#34;8,8,8,0&#34; TextWrapping=&#34;Wrap&#34; Text=&#34;Opción 1&#34; VerticalAlignment=&#34;Top&#34; Foreground=&#34;White&#34; TextAlignment=&#34;Center&#34; FontSize=&#34;14.667&#34; MouseLeftButtonDown=&#34;txtOpcion_MouseLeftButtonDown&#34;/&#62; &#60;textblock x:Name=&#34;txtOpcion2&#34; Height=&#34;20&#34; Margin=&#34;8,0,8,8&#34; TextWrapping=&#34;Wrap&#34; Text=&#34;Opción 2&#34; VerticalAlignment=&#34;Bottom&#34; Foreground=&#34;White&#34; TextAlignment=&#34;Center&#34; FontSize=&#34;14.667&#34; MouseLeftButtonDown=&#34;txtOpcion_MouseLeftButtonDown&#34;/&#62; &#60;/grid&#62; &#60;/usercontrol&#62;[/sourceode] Nada complejo, simplemente un rectángulo de fondo y dos TextBlock que servirán como opciones. Cada uno de estos últimos tiene un manejador de eventos igual, este evento debes colocarlo en tu code behind. [sourcecode lang=&#039;csharp&#039;]private void txtOpcion_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { this.Visibility = Visibility.Collapsed; } Listo, ese es el menú, ahora solo compila el proyecto para poder hacer reconocible el control que acabas de crear, al haberlo hecho ve a tu MainPage y primero [...]]]></description>
			<content:encoded><![CDATA[<p>Una funcionalidad básica de prácticamente cualquier aplicación de escritorio es el uso del clic derecho para el común despliegue de un menú contextual, una funcionalidad que extraño mucho en las páginas web, afortunadamente en Silverlight podemos aprovechar la posibilidad de usar esta herramienta.</p>
<p>Comienza por crear una nueva solución, después, al hacerlo, crea una nueva carpeta llamada Controles, ahí por último crea un nuevo UserControl llamado MenuContextual, al terminar, tu proyecto deberá verse de la siguiente manera.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/04/ProyectoMenu.jpg"><img style="background-image: none; border-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px;" title="ProyectoMenu" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/04/ProyectoMenu_thumb.jpg" alt="ProyectoMenu" width="234" height="240" border="0" /></a></p>
<p>Ahora en ese UserControl llamado Menu Contextual, coloca el siguiente XAML.</p>
<pre class="brush: xml">&lt;usercontrol x:Class=&quot;Menu_Contextual.MenuContextual&quot;
xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot; Width=&quot;150&quot; Height=&quot;70&quot;&gt;

&lt;grid x:Name=&quot;LayoutRoot&quot;&gt;
&lt;rectangle Fill=&quot;#FF666666&quot; Margin=&quot;0&quot; Stroke=&quot;Black&quot;/&gt;
&lt;textblock x:Name=&quot;txtOpcion1&quot; Height=&quot;20&quot; Margin=&quot;8,8,8,0&quot; TextWrapping=&quot;Wrap&quot; Text=&quot;Opción 1&quot; VerticalAlignment=&quot;Top&quot; Foreground=&quot;White&quot; TextAlignment=&quot;Center&quot; FontSize=&quot;14.667&quot; MouseLeftButtonDown=&quot;txtOpcion_MouseLeftButtonDown&quot;/&gt;
&lt;textblock x:Name=&quot;txtOpcion2&quot; Height=&quot;20&quot; Margin=&quot;8,0,8,8&quot; TextWrapping=&quot;Wrap&quot; Text=&quot;Opción 2&quot; VerticalAlignment=&quot;Bottom&quot; Foreground=&quot;White&quot; TextAlignment=&quot;Center&quot; FontSize=&quot;14.667&quot; MouseLeftButtonDown=&quot;txtOpcion_MouseLeftButtonDown&quot;/&gt;
&lt;/grid&gt;
&lt;/usercontrol&gt;[/sourceode]

Nada complejo, simplemente un rectángulo de fondo y dos TextBlock que servirán como opciones. Cada uno de estos últimos tiene un manejador de eventos igual, este evento debes colocarlo en tu code behind.

[sourcecode lang=&#039;csharp&#039;]private void txtOpcion_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
this.Visibility = Visibility.Collapsed;
}</pre>
<p>Listo, ese es el menú, ahora solo compila el proyecto para poder hacer reconocible el control que acabas de crear, al haberlo hecho ve a tu MainPage y primero coloca el siguiente XAML.</p>
<pre class="brush: xml">&lt;usercontrol x:Class=&quot;Menu_Contextual.MainPage&quot; xmlns:local=&quot;clr-namespace:Menu_Contextual&quot;
xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
Width=&quot;640&quot; Height=&quot;480&quot;&gt;

&lt;grid x:Name=&quot;LayoutRoot&quot; Background=&quot;White&quot;&gt;
&lt;/grid&gt;&lt;grid .ColumnDefinitions&gt;
&lt;columndefinition Width=&quot;0.5*&quot;/&gt;
&lt;columndefinition Width=&quot;0.5*&quot;/&gt;
&lt;/grid&gt;
&lt;grid x:Name=&quot;contNormal&quot; Margin=&quot;0&quot;&gt;
&lt;textblock Height=&quot;24&quot; Margin=&quot;8,8,0,0&quot; TextWrapping=&quot;Wrap&quot; Text=&quot;Sin menú contextual&quot; VerticalAlignment=&quot;Top&quot; HorizontalAlignment=&quot;Left&quot; Width=&quot;124&quot;/&gt;
&lt;/grid&gt;
&lt;grid x:Name=&quot;contContextual&quot; Grid.Column=&quot;1&quot; Margin=&quot;0&quot; Background=&quot;#FF9F9F9F&quot;&gt;
&lt;/grid&gt;

&lt;/usercontrol&gt;</pre>
<p>Ahora reemplaza el tag del Grid que se llama “contContextual” con el siguiente XAML.</p>
<pre class="brush: xml">&lt;grid x:Name=&quot;contContextual&quot; Grid.Column=&quot;1&quot; Margin=&quot;0&quot; Background=&quot;#FF9F9F9F&quot; MouseRightButtonDown=&quot;contContextual_MouseRightButtonDown&quot;&gt;
&lt;textblock Height=&quot;24&quot; Margin=&quot;8,8,0,0&quot; TextWrapping=&quot;Wrap&quot; Text=&quot;Con menú contextual&quot; VerticalAlignment=&quot;Top&quot; HorizontalAlignment=&quot;Left&quot; Width=&quot;124&quot;/&gt;
&lt;local:menucontextual x:Name=&quot;ctrlMenu&quot; VerticalAlignment=&quot;Top&quot; HorizontalAlignment=&quot;Left&quot; Visibility=&quot;Collapsed&quot;/&gt;
&lt;/grid&gt;</pre>
<p>Así simplemente le colocas al grid un manejador para el evento MouseRightButtonDown y ahora lo último, colócate en el codeBehind para el evento generado y ahí escribe el siguiente código.</p>
<pre class="brush: csharp">private void contContextual_MouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
e.Handled = true;
double izquierda = e.GetPosition(contContextual).X;
double arriba = e.GetPosition(contContextual).Y;
ctrlMenu.Margin = new Thickness(izquierda, arriba, 0, 0);
ctrlMenu.Visibility = Visibility.Visible;
}</pre>
<p>La primera línea le indicará a tu aplicación que debe cancelar la conducta preestablecida para ese control, es decir, que deje de desplegar el menú contextual de Silverlight, después, por medio del manejador de eventos, podrás utilizar un método para obtener las coordenadas X e Y de tu puntero, para finalmente enviar esos valores al margen de tu control y hacerlo visible.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/04/MenuContextualSilverlight.jpg"><img style="background-image: none; border-width: 0px; border-style: none; border-color: -moz-use-text-color; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px;" title="MenuContextualSilverlight" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/04/MenuContextualSilverlight_thumb.jpg" alt="MenuContextualSilverlight" width="405" height="306" border="0" /></a></p>
<p>De este muy sencilla manera es como puedes crear y desplegar un menú contextual dentro de Silverlight.</p>
<p>Puedes descargar el código fuente <a href="http://aminespinoza.com/materialBlog/proyectos/MenuContextual.zip" target="_blank">aquí.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/04/crear-y-manipular-un-men-contextual-en-silverlight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Silverlight RIA Services y Windows Azure TableStorage</title>
		<link>http://blogs.ligasilverlight.com/2012/03/silverlight-ria-services-y-windows-azure-tablestorage/</link>
		<comments>http://blogs.ligasilverlight.com/2012/03/silverlight-ria-services-y-windows-azure-tablestorage/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 08:02:56 +0000</pubDate>
		<dc:creator>RicardoPons</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[TableStorage]]></category>
		<category><![CDATA[WCF Ria Services]]></category>
		<category><![CDATA[Windows Azure]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3680</guid>
		<description><![CDATA[&#160; Un escenario común al trabajar en Silverlight y SQL Server  es utilizar RIA Services para realizar operaciones CRUD, RIA services ofrece muchas ventajas, pero una vez más al pensar en la nube  debemos replantear cual es la mejor solución para minimizar costos de nuestra implementación . Una alternativa es usar TableStorage de Windows Azure para realizar estas operaciones. Para lograr esto necesitamos tener instalados los siguientes componentes: Windows Azure SDK La última version de RIA Services. Teniendo todo listo podemos comenzar. 1.- Creamos un nuevo proyecto de silverlight con RIA Services habilitado. 2.- Agregamos un nuevo proyecto Cloud de Windows Azure en limpio. 3.-En nuestro proyecto Cloud de Windows Azure agregamos nuestro WebRole que ya existe en nuestra solución. 4.- En nuestro proyecto Web  agregamos un Domain Services en Blanco . &#160; 5.-Necesitamos agregar a nuestro proyecto Web las siguientes referencias: System.Data.Services.Client Microsoft.WindowsAzure.ServiceRuntime Microsoft.WindowsAzure.StorageClient Microsoft.ServiceModel.DomainServices.WindowsAzure Con esto hemos preparado nuestro entorno para poder trabajar con TableStorage y RIA Services. TableEntity Como ya sabemos TableStorage ofrece muchas ventajas una de ellas es que ofrece un número practicamente ilimitado de tablas y registros , además que ofrece una forma estructurada de almacenamiento de nuestra información. Algo que debemos recordar es que [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Un escenario común al trabajar en Silverlight y SQL Server  es utilizar RIA Services para realizar operaciones CRUD, RIA services ofrece muchas ventajas, pero una vez más al pensar en la nube  debemos replantear cual es la mejor solución para minimizar costos de nuestra implementación .</p>
<p>Una alternativa es usar TableStorage de Windows Azure para realizar estas operaciones.</p>
<p>Para lograr esto necesitamos tener instalados los siguientes componentes:</p>
<p><a href="https://www.windowsazure.com/es-es/develop/downloads/">Windows Azure SDK</a></p>
<p>La última version de <a href="http://www.silverlight.net/learn/advanced-techniques/wcf-ria-services/get-started-with-wcf-ria-services">RIA Services</a>.</p>
<p>Teniendo todo listo podemos comenzar.</p>
<p>1.- Creamos un nuevo proyecto de silverlight con RIA Services habilitado.</p>
<p>2.- Agregamos un nuevo proyecto Cloud de Windows Azure en limpio.</p>
<p>3.-En nuestro proyecto Cloud de Windows Azure agregamos nuestro WebRole que ya existe en nuestra solución.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/03/image2.png"><img style="padding-top: 0px;padding-left: 0px;padding-right: 0px;border-width: 0px" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/03/image_thumb2.png" alt="image" width="520" height="244" border="0" /></a></p>
<p>4.- En nuestro proyecto Web  agregamos un Domain Services en Blanco .</p>
<p>&nbsp;</p>
<p>5.-Necesitamos agregar a nuestro proyecto Web las siguientes referencias:</p>
<ul>
<li><strong>System.Data.Services.Client</strong></li>
<li><strong>Microsoft.WindowsAzure.ServiceRuntime</strong></li>
<li><strong>Microsoft.WindowsAzure.StorageClient</strong></li>
<li><strong>Microsoft.ServiceModel.DomainServices.WindowsAzure</strong></li>
</ul>
<p>Con esto hemos preparado nuestro entorno para poder trabajar con TableStorage y RIA Services.</p>
<p><span style="font-size: large">TableEntity</span></p>
<p>Como ya sabemos TableStorage ofrece muchas ventajas una de ellas es que ofrece un número practicamente ilimitado de tablas y registros , además que ofrece una forma estructurada de almacenamiento de nuestra información.</p>
<p>Algo que debemos recordar es que cada registro deben tener obligatoriamente 3 propiedades <strong>PartitionKey,RowKey,Timestamp</strong>, la combinacion de estas 3 propiedades forman una unica llave que identifica nuestro registro.</p>
<p>Para simplificar este trabajo nosotros podemos hacer uso de la clase TableEntity , esta clase incluye ya estas propiedades.</p>
<p>Ejemplo:</p>
<pre> public class Producto:TableEntity
    {

        Public string Nombre {get;set;}
        public int Precio {get;set;}
    }</pre>
<p>Lo que sigue es crear el DataContext para el Table Storage esto lo logramos gracias a la clase <strong>TableEntityContext</strong></p>
<pre> public class ProductosDataContext:TableEntityContext
    {
        public ProductosDataContext():base(RoleEnvironment.GetConfigurationSettingValue("Conexion"))
        {

        }

        public TableEntitySet &lt; Producto &gt;  MisProductos
        {
            get
            {
                return base.GetEntitySet();
            }
        }
    }</pre>
<p>Por ultimo necesitamos agregar diversos metodos a nuestro Domain Service.</p>
<pre> [EnableClientAccess()]
    public class DomainService1:TableDomainService
    {

        public IQueryable getMisProductos()
        {
            return this.EntityContext.MisProductos;
        }

        public void AgregarProducto(Producto producto)
        {
            this.EntityContext.MisProductos.Add(producto);
        }
        public void EliminarProducto(Producto producto)
        {
            this.EntityContext.MisProductos.Delete(producto);
        }
        public void ActualizarProducto(Producto producto)
        {
            this.EntityContext.MisProductos.Update(producto);
        }
    }</pre>
<p>Con esto nostros podemos fácilmente realizar operaciones CRUD con RIA Services y Table Storage.</p>
<p><!--:--><!--:es--><br />
Puedes descargar el código fuente <a title="Aquí." href="https://skydrive.live.com/redir.aspx?cid=b6646f389c71fe2f&amp;resid=B6646F389C71FE2F!448&amp;parid=B6646F389C71FE2F!166" target="_blank">Aquí<!--:--></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/03/silverlight-ria-services-y-windows-azure-tablestorage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cambiando la apariencia de un DataGrid autom&#225;ticamente en un lapso de tiempo</title>
		<link>http://blogs.ligasilverlight.com/2012/03/cambiando-la-apariencia-de-un-datagrid-automticamente-en-un-lapso-de-tiempo/</link>
		<comments>http://blogs.ligasilverlight.com/2012/03/cambiando-la-apariencia-de-un-datagrid-automticamente-en-un-lapso-de-tiempo/#comments</comments>
		<pubDate>Sat, 17 Mar 2012 05:49:59 +0000</pubDate>
		<dc:creator>Rodrigo Díaz Concha</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Estilos]]></category>
		<category><![CDATA[silverlight 5]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3668</guid>
		<description><![CDATA[El día de hoy hicieron una pregunta muy interesante en el grupo de La Liga Silverlight en Facebook.&#160; Aquí la pongo textual: “AYUDA!!!Tengo un DataGrid en Silverlight con los siguientes campos {idhorario, horainicio, horafin, dia, idseccion}.necesito que los campos {horainicio y horafin}, cambien de color en una Hora indicada, me explico, tengo una materia de 12:00 a 2:00pm, y son las 1:00pm en mi reloj, que estos campos aparezcan en otro COLOR&#8230; o que llamen la atencion de alguna manera.COMO HAGO ESTO???” Se me ocurren unas 3 o 4 maneras para resolver esto, pero decidí irme por la que creo yo la más eficiente: usar la característica de enlace en los setters de los estilos, disponible a partir de Silverlight 5. ¡Manos a la obra! El Proyecto Iniciaremos creando un proyecto regular de Silverlight 5 llamado Horarios usando la plantilla de Silverlight Application. Clase Materia La primera tarea será modelar la clase para cada materia.&#160; A esta clase la llamaremos Materia.&#160; A continuación podrán observar la implementación completa: &#160; Puedes leer el artículo completo en esta dirección]]></description>
			<content:encoded><![CDATA[<p>El día de hoy hicieron una pregunta muy interesante en el grupo de <a href="http://www.facebook.com/groups/LaLigaSilverlight/" target="_blank">La Liga Silverlight en Facebook</a>.&nbsp; Aquí la pongo textual:</p>
<blockquote><p><em>“AYUDA!!!<br />Tengo un DataGrid en Silverlight con los siguientes campos {idhorario, horainicio, horafin, dia, idseccion}.<br />necesito que los campos {horainicio y horafin}, cambien de color en una Hora indicada, me explico, tengo una materia de 12:00 a 2:00pm, y son las 1:00pm en mi reloj, que estos campos aparezcan en otro COLOR&#8230; o que llamen la atencion de alguna manera.<br />COMO HAGO ESTO???”</em></p>
</blockquote>
<p>Se me ocurren unas 3 o 4 maneras para resolver esto, pero decidí irme por la que creo yo la más eficiente: usar la característica de enlace en los setters de los estilos, disponible a partir de Silverlight 5.</p>
<p>¡Manos a la obra!</p>
<h2>El Proyecto</h2>
<p>Iniciaremos creando un proyecto regular de Silverlight 5 llamado Horarios usando la plantilla de Silverlight Application.</p>
<h2>Clase Materia</h2>
<p>La primera tarea será modelar la clase para cada materia.&nbsp; A esta clase la llamaremos <strong>Materia</strong>.&nbsp; A continuación podrán observar la implementación completa:</p>
<h2>&nbsp;</h2>
<h2><a href="http://rdiazconcha.com/2012/03/cambiando-la-apariencia-de-un-datagrid-automticamente-en-un-lapso-de-tiempo/" target="_blank">Puedes leer el artículo completo en esta dirección</a></h2>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/03/cambiando-la-apariencia-de-un-datagrid-automticamente-en-un-lapso-de-tiempo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diplomado de desarrollo de aplicaciones para Windows Phone 7.1&#8211;Latinoam&#233;rica</title>
		<link>http://blogs.ligasilverlight.com/2012/03/diplomado-de-desarrollo-de-aplicaciones-para-windows-phone-7-1latinoamrica/</link>
		<comments>http://blogs.ligasilverlight.com/2012/03/diplomado-de-desarrollo-de-aplicaciones-para-windows-phone-7-1latinoamrica/#comments</comments>
		<pubDate>Wed, 14 Mar 2012 16:11:19 +0000</pubDate>
		<dc:creator>Rodrigo Díaz Concha</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WP71]]></category>
		<category><![CDATA[capacitación]]></category>
		<category><![CDATA[curso]]></category>
		<category><![CDATA[Entrenamiento]]></category>
		<category><![CDATA[formación]]></category>
		<category><![CDATA[latam]]></category>
		<category><![CDATA[mango]]></category>
		<category><![CDATA[mexico]]></category>
		<category><![CDATA[training]]></category>
		<category><![CDATA[wp7.1]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3661</guid>
		<description><![CDATA[Los invito cordialmente a que se inscriban al Diplomado de desarrollo de aplicaciones para Windows Phone 7.1, impulsado por Microsoft México para todo el mundo!&#160; Completamente gratuito, con una duración de 4 semanas. El diplomado está diseñado para perfil de desarrolladores con un mínimo de 6 meses de experiencia en el lenguaje C# que quieran conocer todo el proceso de desarrollo de aplicaciones para Windows Phone. Conocer las características de hardware principales de Windows Phone Diseñar aplicaciones con el lenguaje de diseño Metro Desarrollar aplicaciones bajo los componentes de Silverlight Aprovechar la experiencia de navegación de Windows Phone dentro de aplicaciones Almacenar datos para acceder a ellos desde tu aplicación Diferenciar entre el distinto uso de comunicaciones y redes Usar las diferentes APIs del teléfono Hacer uso del multitasking Publicar tus aplicaciones en el marketplace de Windows Phone Iniciaremos el curso el día Lunes 26 de Marzo. Te invitamos a conocer la página del diplomado donde podrás ver el video informativo que explica la metodología del curso para que inicies el diplomado de manera puntual. Para entrar a la página del curso haz clic aquí. Para tu inscripción formal, entra a nuestra página de registro aquí. Únete al grupo de [...]]]></description>
			<content:encoded><![CDATA[<p>Los invito cordialmente a que se inscriban al Diplomado de desarrollo de aplicaciones para Windows Phone 7.1, impulsado por <a href="http://www.microsoft.com.mx" target="_blank">Microsoft México</a> para todo el mundo!&nbsp; Completamente gratuito, con una duración de 4 semanas.</p>
<p><a href="http://ti-capacitacion.com/windowsphone7/" target="_blank"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="0574.clip_image002_5892168D" border="0" alt="0574.clip_image002_5892168D" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/03/0574.clip_image002_5892168D.gif" width="319" height="768"/></a></p>
<p><a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-96-44-metablogapi/3731.image_5F00_4001E1C5.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-96-44-metablogapi/6355.image_5F00_thumb_5F00_4D67F4CB.png" width="660" height="34"/></a>  </p>
<p>El diplomado está diseñado para perfil de desarrolladores con un mínimo de 6 meses de experiencia en el lenguaje C# que quieran conocer todo el proceso de desarrollo de aplicaciones para Windows Phone.  </p>
<p><a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-96-44-metablogapi/5850.image_5F00_53AECB59.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-96-44-metablogapi/0488.image_5F00_thumb_5F00_7EF5F311.png" width="662" height="34"/></a>
<ul>
<li>Conocer las características de hardware principales de Windows Phone  </li>
<li>Diseñar aplicaciones con el lenguaje de diseño Metro  </li>
<li>Desarrollar aplicaciones bajo los componentes de <a href="http://silverlight.net" target="_blank">Silverlight</a>  </li>
<li>Aprovechar la experiencia de navegación de Windows Phone dentro de aplicaciones  </li>
<li>Almacenar datos para acceder a ellos desde tu aplicación  </li>
<li>Diferenciar entre el distinto uso de comunicaciones y redes  </li>
<li>Usar las diferentes APIs del teléfono  </li>
<li>Hacer uso del multitasking  </li>
<li>Publicar tus aplicaciones en el marketplace de Windows Phone</li>
</ul>
<p><a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-96-44-metablogapi/8400.image_5F00_6C40F95A.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-96-44-metablogapi/2727.image_5F00_thumb_5F00_0E988ED4.png" width="659" height="34"/></a>  </p>
<p>Iniciaremos el curso el día <strong>Lunes 26 de Marzo</strong>. Te invitamos a conocer la página del diplomado donde podrás ver el video informativo que explica la metodología del curso para que inicies el diplomado de manera puntual.
<ul>
<li>
<p>Para entrar a la <b>página del curso</b> haz clic <u><a href="http://ti-capacitacion.com/windowsphone7/">aquí</a>.</u></p>
</li>
<li>
<p>Para tu inscripción formal, entra a nuestra <b>página de registro </b><u><a href="http://ti-capacitacion.com/registros/windowsphone7">aquí</a>.</u></p>
</li>
<li>
<p>Únete al grupo de <u><a href="http://www.facebook.com/#%21/groups/diplomadowp71/">Facebook</a></u> y de <u><a href="https://twitter.com/#%21/diplomadoWP71">Twitter</a></u> para mantenerte siempre informado y colabora con la comunidad.</p>
</li>
</ul>
<p>Una vez enviado el registro, tendrás que validar tu inscripción a través de un correo electrónico que recibirás, de otra manera no quedarás inscrito.  </p>
<p><b><i>Nota:</i></b><i> Ten en consideración que los correos que recibirás de este diplomado vendrán del dominio: ti-capacitacion.com por lo que te pedimos revises con tu departamento de TI o en tu correo electrónico que no se bloqueé ningún correo proveniente de este dominio.</i><br />
<h2>Pasos a seguir</h2>
</p>
<p>He resumido los pasos que debes seguir si estás interesado en este diplomado:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/03/Pasos.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Pasos" border="0" alt="Pasos" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/03/Pasos_thumb.png" width="500" height="273"/></a>
<ol>
<li><a href="http://ti-capacitacion.com/windowsphone7/" target="_blank">Ve la Sesión informativa</a>  </li>
<li><a href="http://www.facebook.com/groups/diplomadowp71/" target="_blank">Únete al grupo de Facebook</a>  </li>
<li><a href="http://www.facebook.com/groups/diplomadowp71/docs" target="_blank">Lee los requisitos de conocimientos que debes tener</a>  </li>
<li><a href="http://www.facebook.com/groups/diplomadowp71/docs" target="_blank">Lee los requisitos técnicos de hardware y software</a>  </li>
<li><a href="http://ti-capacitacion.com/registros/windowsphone7" target="_blank">¡Inscríbete!</a>  </li>
<li><a href="https://twitter.com/#!/diplomadoWP71" target="_blank">Síguenos en Twitter</a></li>
</ol>
<p><font style="background-color: #f3fcf9">¡Los esperamos!</font></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/03/diplomado-de-desarrollo-de-aplicaciones-para-windows-phone-7-1latinoamrica/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Consumir servicios web ASP.NET y WCF en Silverlight (Parte 4)</title>
		<link>http://blogs.ligasilverlight.com/2012/02/consumir-servicios-web-asp-net-y-wcf-en-silverlight-parte-4/</link>
		<comments>http://blogs.ligasilverlight.com/2012/02/consumir-servicios-web-asp-net-y-wcf-en-silverlight-parte-4/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 07:23:57 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3655</guid>
		<description><![CDATA[Este artículo es la cuarta parte de una mini serie que intenta enseñarte como crear, publicar y ahora consumir servicios web, el primer artículo habla de la base de datos que has estado usando, puedes ver aquí como crear servicios web ASP.NET y aquí como crear servicios WCF. Creo que la mejor manera de manejar ambos servicios anteriormente creados es en una sola aplicación, para ahorrar la parte del diseño te dejo una imagen guía. Pero para ahorrar aún mas, puedes descargar aquí el proyecto de inicio. Ya con el proyecto inicial, en Visual Studio, da clic derecho sobre tu proyecto y selecciona la opción de “Agregar referencia de servicio”. En el cuadro de diálogo, comienza con el servicio web ASP.NET, recuerda la URL, algo así como “http://localhost/ServicioASP/Service1.asmx” y después presiona “Go”, deberás ver algo así. Después de presionar “Ok”, repite la misma operación pero ahora con la liga del servicio WCF. Hasta aquí, como puedes ver, el procedimiento es exactamente el mismo para ambos tipos de servicios, la diferencia comenzará de aquí en adelante, vamos primero a declarar cada uno de los objetos de los servicios. //servicioASP ServicioDatosASP.Service1SoapClient servicioASP = new ServicioDatosASP.Service1SoapClient(); //servicioWCF ServicioDatosWCF.Service1Client servicioWCF = new ServicioDatosWCF.Service1Client(); Como [...]]]></description>
			<content:encoded><![CDATA[<p>Este artículo es la cuarta parte de una mini serie que intenta enseñarte como crear, publicar y ahora consumir servicios web, <a href="http://aminespinoza.com/crear-y-consumir-servicios-web-en-silverlight-parte-1/">el primer artículo</a> habla de la base de datos que has estado usando, <a href="http://aminespinoza.com/crear-y-publicar-un-servicio-web-asp-net-parte-2/">puedes ver aquí</a> como crear servicios web ASP.NET y <a href="http://aminespinoza.com/crear-y-publicar-una-aplicacin-wcf-parte-3/">aquí</a> como crear servicios WCF.</p>
<p>Creo que la mejor manera de manejar ambos servicios anteriormente creados es en una sola aplicación, para ahorrar la parte del diseño te dejo una imagen guía.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/Vista.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border: 0px;" title="Vista" src="http://aminespinoza.com/wp-content/uploads/2012/02/Vista_thumb.jpg" alt="Vista" width="600" height="450" border="0" /></a></p>
<p>Pero para ahorrar aún mas, <a href="http://aminespinoza.com/materialBlog/proyectos/ServiciosWeb(inicio).zip">puedes descargar aquí el proyecto de inicio.</a></p>
<p>Ya con el proyecto inicial, en Visual Studio, da clic derecho sobre tu proyecto y selecciona la opción de “Agregar referencia de servicio”.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/ReferenciaServicio.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border: 0px;" title="ReferenciaServicio" src="http://aminespinoza.com/wp-content/uploads/2012/02/ReferenciaServicio_thumb.jpg" alt="ReferenciaServicio" width="296" height="304" border="0" /></a></p>
<p>En el cuadro de diálogo, comienza con el servicio web ASP.NET, recuerda la URL, algo así como “http://localhost/ServicioASP/Service1.asmx” y después presiona “Go”, deberás ver algo así.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/ServicioASP1.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border: 0px;" title="ServicioASP" src="http://aminespinoza.com/wp-content/uploads/2012/02/ServicioASP_thumb1.jpg" alt="ServicioASP" width="373" height="305" border="0" /></a></p>
<p>Después de presionar “Ok”, repite la misma operación pero ahora con la liga del servicio WCF.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/ServicioWCF1.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border: 0px;" title="ServicioWCF" src="http://aminespinoza.com/wp-content/uploads/2012/02/ServicioWCF_thumb1.jpg" alt="ServicioWCF" width="373" height="303" border="0" /></a></p>
<p>Hasta aquí, como puedes ver, el procedimiento es exactamente el mismo para ambos tipos de servicios, la diferencia comenzará de aquí en adelante, vamos primero a declarar cada uno de los objetos de los servicios.</p>
<pre class="brush: csharp">//servicioASP
ServicioDatosASP.Service1SoapClient servicioASP = new ServicioDatosASP.Service1SoapClient();

//servicioWCF
ServicioDatosWCF.Service1Client servicioWCF = new ServicioDatosWCF.Service1Client();</pre>
<p>Como puedes ver, la diferencia es grande desde aquí, el protocolo de servicio de ASP.NET es <a href="http://es.wikipedia.org/wiki/Simple_Object_Access_Protocol">SOAP</a>, cuando en WCF utilizas un cliente sin ese protocolo, en los manejadores de eventos para consultar información, tendrás las diferentes líneas.</p>
<p align="center"><strong><span style="font-size: medium;">Consultar Información</span></strong></p>
<p>Para el servicio ASP.NET necesitas crear primero una clase, de la siguiente forma.</p>
<pre class="brush: csharp">public class NombreContacto
{
public string Nombre { get; set; }
public string Apellidos { get; set; }
public string Telefono { get; set; }
public string Email { get; set; }
}</pre>
<p>Y ya con la clase creada, poder usar un evento clic para poder consultar al servicio web.</p>
<pre class="brush: csharp">private void btnObtenerContactosASP_Click(object sender, System.Windows.RoutedEventArgs e)
{
servicioASP.MostrarTodosLosContactosCompleted += new EventHandler&lt;serviciodatosasp .MostrarTodosLosContactosCompletedEventArgs&gt;(servicioASP_MostrarTodosLosContactosCompleted);
servicioASP.MostrarTodosLosContactosAsync();
}

void servicioASP_MostrarTodosLosContactosCompleted(object sender, ServicioDatosASP.MostrarTodosLosContactosCompletedEventArgs e)
{
if (e.Error == null)
{
List&lt;nombrecontacto&gt; listaContactos = new List&lt;/nombrecontacto&gt;&lt;nombrecontacto&gt;();
foreach (string entidad in e.Result)
{
NombreContacto contacto = new NombreContacto();
contacto.Nombre = entidad.Split(&#039;|&#039;)[1];
contacto.Apellidos = entidad.Split(&#039;|&#039;)[2];
contacto.Telefono = entidad.Split(&#039;|&#039;)[3];
contacto.Email = entidad.Split(&#039;|&#039;)[4];
listaContactos.Add(contacto);
}

dgDatosASP.ItemsSource = listaContactos;
}
}</pre>
<p>Por el lado de WCF tendrás lo siguiente.</p>
<pre class="brush: csharp">private void btnObtenerContactosWCF_Click(object sender, System.Windows.RoutedEventArgs e)
{
servicioWCF.MostrarTodosLosContactosCompleted += new EventHandler&lt;serviciodatoswcf .MostrarTodosLosContactosCompletedEventArgs&gt;(servicioWCF_MostrarTodosLosContactosCompleted);
servicioWCF.MostrarTodosLosContactosAsync();
}

void servicioWCF_MostrarTodosLosContactosCompleted(object sender, ServicioDatosWCF.MostrarTodosLosContactosCompletedEventArgs e)
{
if (e.Error == null)
{
dgDatosWCF.ItemsSource = e.Result;
}
}</pre>
<p>¿Como ves? Una gran diferencia ¿no es así? Bueno, también debes considerar que por el lado de XAML hay una diferencia con los DataGrid que estás usando.</p>
<p>Este es el DataGrid que estamos usando para el servicio web ASP.NET.</p>
<pre class="brush: xml">&lt;sdk:datagrid x:Name=&quot;dgDatosASP&quot; Margin=&quot;8,51,401,8&quot; SelectionChanged=&quot;dgDatosASP_SelectionChanged&quot;/&gt;</pre>
<p>&nbsp;</p>
<p>Este es el DataGrid que estamos usando para el servicio WCF.</p>
<pre class="brush: xml">&lt;sdk:datagrid x:Name=&quot;dgDatosWCF&quot; Margin=&quot;8,51,401,8&quot; Grid.Row=&quot;1&quot; AutoGenerateColumns=&quot;False&quot; SelectionChanged=&quot;dgDatosWCF_SelectionChanged&quot;&gt;
&lt;/sdk:datagrid&gt;&lt;sdk:datagrid .Columns&gt;
&lt;sdk:datagridtextcolumn Width=&quot;130&quot; Header=&quot;Nombre&quot; Binding=&quot;{Binding Nombre}&quot;/&gt;
&lt;sdk:datagridtextcolumn Width=&quot;130&quot; Header=&quot;Apellidos&quot; Binding=&quot;{Binding APELLIDOS}&quot;/&gt;
&lt;sdk:datagridtextcolumn Width=&quot;130&quot; Header=&quot;Teléfono&quot; Binding=&quot;{Binding TELEFONO}&quot;/&gt;
&lt;sdk:datagridtextcolumn Width=&quot;130&quot; Header=&quot;Correo electrónico&quot; Binding=&quot;{Binding EMAIL}&quot;/&gt;
&lt;/sdk:datagrid&gt;
</pre>
<p style="text-align: left;">Si lo pongo en palabras sencillas, la lista que recibimos del servicio WCF es la misma lista que alimenta al DataGrid, solo que al hacer un enlazado de datos le estarás diciendo a que columna debe ir que información.</p>
<h3 style="text-align: center;">
<strong>Insertar Información</strong></h3>
<p style="text-align: left;">Para hacer esta operación los métodos requeridos son los siguientes, primero vamos con el servicio web ASP.NET.</p>
<pre class="brush: csharp">private void btnIngresarASP_Click(object sender, System.Windows.RoutedEventArgs e)
{
servicioASP.InsertarNuevoContactoCompleted += new EventHandler&lt;serviciodatosasp .InsertarNuevoContactoCompletedEventArgs&gt;(servicioASP_InsertarNuevoContactoCompleted);
servicioASP.InsertarNuevoContactoAsync(txtNombreNuevoASP.Text, txtApellidosNuevoASP.Text, txtTelefonoNuevoASP.Text, txtCorreoNuevoASP.Text);
}

void servicioASP_InsertarNuevoContactoCompleted(object sender, ServicioDatosASP.InsertarNuevoContactoCompletedEventArgs e)
{
if (e.Error == null)
{
txtNombreNuevoASP.Text = string.Empty;
txtApellidosNuevoASP.Text = string.Empty;
txtTelefonoNuevoASP.Text = string.Empty;
txtCorreoNuevoASP.Text = string.Empty;
MessageBox.Show(&quot;Tu nuevo contacto ha sido agregado&quot;);
}
}</pre>
<p>En el caso del servicio WCF, será de la siguiente forma.</p>
<pre class="brush: csharp">private void btnIngresarWCF_Click(object sender, System.Windows.RoutedEventArgs e)
{
servicioWCF.InsertarContactoCompleted += new EventHandler&lt;serviciodatoswcf .InsertarContactoCompletedEventArgs&gt;(servicioWCF_InsertarContactoCompleted);
ServicioDatosWCF.Contacto nuevoContacto = new ServicioDatosWCF.Contacto();
nuevoContacto.Nombre = txtNombreNuevoWCF.Text;
nuevoContacto.APELLIDOS = txtApellidosNuevoWCF.Text;
nuevoContacto.TELEFONO = txtTelefonoNuevoWCF.Text;
nuevoContacto.EMAIL = txtCorreoNuevoWCF.Text;
servicioWCF.InsertarContactoAsync(nuevoContacto);
}

void servicioWCF_InsertarContactoCompleted(object sender, ServicioDatosWCF.InsertarContactoCompletedEventArgs e)
{
if (e.Error == null)
{
txtNombreNuevoWCF.Text = string.Empty;
txtApellidosNuevoWCF.Text = string.Empty;
txtTelefonoNuevoWCF.Text = string.Empty;
txtCorreoNuevoWCF.Text = string.Empty;
MessageBox.Show(&quot;Tu nuevo contacto ha sido agregado&quot;);
}
}</pre>
<p align="center"><strong><span style="font-size: medium;">Actualizar información</span></strong></p>
<p>Para poder modificar elementos de nuestros contactos lo primero que debes hacer es manejar el manejador para el evento SelectionChanged de los respectivos DataGrid.</p>
<p>En el caso de ASP.NET te debe quedar así.</p>
<pre class="brush: csharp">private void dgDatosASP_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
contactoElegidoASP = new NombreContacto();
contactoElegidoASP = dgDatosASP.SelectedItem as NombreContacto;
txtNombreModificarASP.Text = contactoElegidoASP.Nombre;
txtApellidosModificarASP.Text = contactoElegidoASP.Apellidos;
txtTelefonoModificarASP.Text = contactoElegidoASP.Telefono;
txtCorreoModificarASP.Text = contactoElegidoASP.Email;
}</pre>
<p>Y en el caso de WCF será así.</p>
<pre class="brush: csharp">private void dgDatosWCF_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
contactoElegidoWCF = new ServicioDatosWCF.Contacto();
contactoElegidoWCF = dgDatosWCF.SelectedItem as ServicioDatosWCF.Contacto;
txtNombreModificarWCF.Text = contactoElegidoWCF.Nombre;
txtApellidosModificarWCF.Text = contactoElegidoWCF.APELLIDOS;
txtTelefonoWCF.Text = contactoElegidoWCF.TELEFONO;
txtCorreoModificarWCF.Text = contactoElegidoWCF.EMAIL;
}</pre>
<p>Y en el caso del evento clic de los respectivos botones, te debe quedar de la siguiente manera.</p>
<p>Para el evento del botón de ASP.</p>
<pre class="brush: csharp">private void btnModificarASP_Click(object sender, System.Windows.RoutedEventArgs e)
{
servicioASP.ActualizarContactoCompleted += new EventHandler&lt;serviciodatosasp .ActualizarContactoCompletedEventArgs&gt;(servicioASP_ActualizarContactoCompleted);
servicioASP.ActualizarContactoAsync(contactoElegidoASP.ID, txtNombreModificarASP.Text, txtApellidosModificarASP.Text, txtTelefonoModificarASP.Text, txtCorreoModificarASP.Text);
}

void servicioASP_ActualizarContactoCompleted(object sender, ServicioDatosASP.ActualizarContactoCompletedEventArgs e)
{
if (e.Error == null)
{
txtNombreModificarASP.Text = string.Empty;
txtApellidosModificarASP.Text = string.Empty;
txtTelefonoModificarASP.Text = string.Empty;
txtCorreoModificarASP.Text = string.Empty;
MessageBox.Show(&quot;Tu registro ha sido actualizado&quot;);
}
}</pre>
<p>Y para el evento del botón WCF.</p>
<pre class="brush: csharp">private void btnModificarWCF_Click(object sender, System.Windows.RoutedEventArgs e)
{
servicioWCF.ActualizarContactoCompleted += new EventHandler&lt;serviciodatoswcf .ActualizarContactoCompletedEventArgs&gt;(servicioWCF_ActualizarContactoCompleted);
servicioWCF.ActualizarContactoAsync(contactoElegidoWCF);
}

void servicioWCF_ActualizarContactoCompleted(object sender, ServicioDatosWCF.ActualizarContactoCompletedEventArgs e)
{
if (e.Error == null)
{
txtNombreModificarWCF.Text = string.Empty;
txtApellidosModificarWCF.Text = string.Empty;
txtTelefonoWCF.Text = string.Empty;
txtCorreoModificarWCF.Text = string.Empty;
MessageBox.Show(&quot;Tu registro ha sido actualizado&quot;);
}
}</pre>
<p>¡Listo! De esta manera podrás comenzar a hacer grandes aplicaciones, hay muchas “best practices” que debes considerar aquí, en este caso los fines son meramente didácticos, ya solo te falta a ti encontrar la opción de borrar elementos para que puedas comenzar con la base mas importante para poder crear aplicaciones empresariales de la manera mas sencilla posible.</p>
<p>Si tienes alguna duda o error con tu aplicación, puedes <a href="http://aminespinoza.com/materialBlog/proyectos/ServiciosWeb(final).zip">descargar el código aquí.</a></p>
<p>Ya lo sabes, si aún así te estás trabando en algo, solo escríbelo en los comentarios, con gusto veremos cuales son los problemas.</serviciodatoswcf></serviciodatosasp></serviciodatoswcf></serviciodatosasp></serviciodatoswcf></nombrecontacto></serviciodatosasp></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/02/consumir-servicios-web-asp-net-y-wcf-en-silverlight-parte-4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Crear y publicar una aplicaci&#243;n WCF (Parte 3)</title>
		<link>http://blogs.ligasilverlight.com/2012/02/crear-y-publicar-una-aplicacin-wcf-parte-3/</link>
		<comments>http://blogs.ligasilverlight.com/2012/02/crear-y-publicar-una-aplicacin-wcf-parte-3/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 07:23:12 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3653</guid>
		<description><![CDATA[En la primer entrada de esta mini serie de artículos comenzamos a ver las bases para crear una base de datos que utilizaríamos, en la segunda entrada vimos como crear y publicar un servicio web ASP.NET, ahora la idea es hacer exactamente lo mismo pero con una aplicación WCF para abarcar diferentes escenarios. Así que vamos a comenzar por crear la aplicación WCF Escoge la opción de WCF Service Application, recuerda en esta ocasión escoger el Framework 4. La estructura de tu proyecto quedará de la siguiente manera. La clase IService.cs nos servirá como interfaz de nuestro proyecto, es decir, aquí será en donde coloquemos las funciones públicas que permitiremos que puedan ser accedidas vía web. La clase Service1.svc.cs será la encargada de colocar toda la funcionalidad requerida de nuestro servicio, por ahora esas dos clases son las que nos interesan. Para continuar da clic derecho en tu proyecto y selecciona la opción Add&#62;New Item, ahí en la sección Data elige Linq to SQL Classes. &#160; La pantalla en blanco te servirá para comenzar a crear tu modelo de datos simplemente arrastrando tus tablas (para esto debiste haber creado ya una conexión a tu base de datos desde tu pestaña [...]]]></description>
			<content:encoded><![CDATA[<p>En la <a href="http://aminespinoza.com/crear-y-consumir-servicios-web-en-silverlight-parte-1/">primer entrada</a> de esta mini serie de artículos comenzamos a ver las bases para crear una base de datos que utilizaríamos, en la <a href="http://aminespinoza.com/crear-y-publicar-un-servicio-web-asp-net-parte-2/">segunda entrada</a> vimos como crear y publicar un servicio web ASP.NET, ahora la idea es hacer exactamente lo mismo pero con una aplicación WCF para abarcar diferentes escenarios.</p>
<p>Así que vamos a comenzar por crear la aplicación WCF</p>
<p>Escoge la opción de WCF Service Application, recuerda en esta ocasión escoger el Framework 4.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/NuevoServicioWCF.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="NuevoServicioWCF" src="http://aminespinoza.com/wp-content/uploads/2012/02/NuevoServicioWCF_thumb.jpg" alt="NuevoServicioWCF" width="600" height="418" border="0" /></a></p>
<p>La estructura de tu proyecto quedará de la siguiente manera.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/EstructuraWCF.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="EstructuraWCF" src="http://aminespinoza.com/wp-content/uploads/2012/02/EstructuraWCF_thumb.jpg" alt="EstructuraWCF" width="226" height="176" border="0" /></a></p>
<p>La clase IService.cs nos servirá como interfaz de nuestro proyecto, es decir, aquí será en donde coloquemos las funciones públicas que permitiremos que puedan ser accedidas vía web. La clase Service1.svc.cs será la encargada de colocar toda la funcionalidad requerida de nuestro servicio, por ahora esas dos clases son las que nos interesan. Para continuar da clic derecho en tu proyecto y selecciona la opción Add&gt;New Item, ahí en la sección Data elige Linq to SQL Classes.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/LinqToSQL.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="LinqToSQL" src="http://aminespinoza.com/wp-content/uploads/2012/02/LinqToSQL_thumb.jpg" alt="LinqToSQL" width="600" height="208" border="0" /></a></p>
<p>&nbsp;</p>
<p>La pantalla en blanco te servirá para comenzar a crear tu modelo de datos simplemente arrastrando tus tablas (para esto debiste haber creado ya una conexión a tu base de datos desde tu pestaña de Server Explorer).</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/Server-Explorer.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="Server Explorer" src="http://aminespinoza.com/wp-content/uploads/2012/02/Server-Explorer_thumb.jpg" alt="Server Explorer" width="365" height="195" border="0" /></a></p>
<p>Ya con tu modelo creado y tu tabla agregada, entonces podremos comenzar a crear los mismos tres métodos que vimos en el artículo anterior, comenzaremos en la clase Service1.svc.cs creando las operaciones.</p>
<p>Para empezar podrás notar que la clase hereda las propiedades de la clase IService1, es por ello que trabajan de una forma muy vinculada.</p>
<p><strong>Como mencioné en el artículo anterior, en el servicio web ASP.NET mostré una forma de hacerlo completamente diferente, pero aclaro que de esta manera también podría ser hecho, mi intención es demostrar la forma mas antigua y básica que hay así como la que a mi gusto no solo es la mas nueva, sino que la mas sencilla.</strong></p>
<p>Lo primero que debemos hacer es declarar un objeto de tipo ModeloDatosDataContext, esta clase puede variar de acuerdo a como nombraste a tu modelo anterior y será justamente eso, un contexto, un comunicador entre tus tablas inlcuidas dentro de tu modelo y tus operaciones. La sintaxis es la siguiente.</p>
<pre class="brush: csharp">ModeloDatosDataContext contexto;</pre>
<p align="center"><strong><span style="font-size: medium;">Consultar información</span></strong></p>
<p>Este método nos dará toda la información de nuestros contactos.</p>
<pre class="brush: csharp">public List&lt;contacto&gt; MostrarTodosLosContactos()
{
contexto = new ModeloDatosDataContext();
List&lt;/contacto&gt;&lt;contacto&gt; listaResultado = (from l in contexto.Contactos
select l).ToList();
return listaResultado;
}</pre>
<p>Creamos un método que nos regresará una lista del mismo tipo de la clase que necesitamos obtener, de esta forma y utilizando una sentencia LINQ muy sencilla obtendrás todos los registros.</p>
<p>&nbsp;</p>
<p align="center"><strong><span style="font-size: medium;">Insertar registros</span></strong></p>
<p>Este método nos dará la posibilidad de insertar nuevos registros en nuestra tabla.</p>
<pre class="brush: csharp">public bool InsertarContacto(Contacto nuevoContacto)
{
contexto = new ModeloDatosDataContext();
contexto.Contactos.InsertOnSubmit(nuevoContacto);
contexto.SubmitChanges();
return true;
}</pre>
<p>Esto es sumamente sencillo, utilizando el argumento recibido, el método InsertOnSubmit de la clase Contactos de nuestro modelo se encargará de agregar la nueva entidad y mantenerla en espera de poder ser ingresada y le método SubmitChanges termina la operación insertando los datos en la tabla correspondiente.</p>
<p align="center"><strong><span style="font-size: medium;">Actualizar registros</span></strong></p>
<p>Este método nos dará la posibilidad de modificar a los registros que ya tenemos, ya sea en uno solo o en todos sus atributos.</p>
<pre class="brush: csharp">public bool ActualizarContacto(Contacto contactoActualizado)
{
contexto = new ModeloDatosDataContext();
ModeloDatosDataContext contextoOriginal = new ModeloDatosDataContext();

Contacto contacto = (from c in contextoOriginal.Contactos
where c.ID == contactoActualizado.ID
select c).Single();

contexto.Contactos.Attach(contactoActualizado, contacto);
contexto.SubmitChanges();
return true;
}</pre>
<p>Aquí debido a utilizaremos un contexto para consultar nuestra información, simplemente debemos crear un objeto del mismo tipo para que uno pueda consultar y el otro se pueda encargar de ingresar la información, la mecánica es la misma que en el método de inserción, pero utilizarás el método Attach junto a sus dos parámetros requeridos.</p>
<p>Ya que tenemos los tres métodos que estarás utilizando, vete ahora a tu clase IService.cs y aquí debes crear los contratos para permitir a tus métodos ser operaciones accesibles desde la web. Tu clase debe quedar de la siguiente forma.</p>
<pre class="brush: csharp">[ServiceContract]
public interface IService1
{
[OperationContract]
List&lt;/contacto&gt;&lt;contacto&gt; MostrarTodosLosContactos();

[OperationContract]
bool InsertarContacto(Contacto nuevoContacto);

[OperationContract]
bool ActualizarContacto(Contacto contactoActualizado);

}</pre>
<p>Ya teniendo todo esto listo, presiona F5 para ejecutar tu servicio (ten la pestaña de IService1.cs en pantalla) y el resultado será así.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/Listado.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="Listado" src="http://aminespinoza.com/wp-content/uploads/2012/02/Listado_thumb.jpg" alt="Listado" width="351" height="224" border="0" /></a></p>
<p>Selecciona la ruta remarcada en la imagen de arriba y lo que obtendrás será esta pantalla.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/ServicioWCF.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="ServicioWCF" src="http://aminespinoza.com/wp-content/uploads/2012/02/ServicioWCF_thumb.jpg" alt="ServicioWCF" width="516" height="241" border="0" /></a></p>
<p>La primer diferencia que notarás con respecto a los servicios ASP.NET es que estos no exponen los métodos que contienen, la única forma de poder acceder a ellos es mediante un cliente, y eso es justamente lo que haremos, detén la ejecución y ahora ejecuta de nuevo, pero con la clase Service1.svc.cs en primer plano, de esta manera ejecutarás de manera automática una aplicación llamada WCF Test Client, que te permitirá ver tus métodos y trabajar con ellos.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/WCFTestClient.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="WCFTestClient" src="http://aminespinoza.com/wp-content/uploads/2012/02/WCFTestClient_thumb.jpg" alt="WCFTestClient" width="448" height="325" border="0" /></a></p>
<p>Si todo está en orden, entonces podrás publicar tu aplicación. El proceso es exactamente el mismo que en el <a href="http://aminespinoza.com/crear-y-publicar-un-servicio-web-asp-net-parte-2/">artículo anterior</a>, para no redundar en la información puedes ver la sección “Publicar mi servicio en IIS”, pero hay una diferencia al momento de convertir tu carpeta en aplicación.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/PublicarWCF.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="PublicarWCF" src="http://aminespinoza.com/wp-content/uploads/2012/02/PublicarWCF_thumb.jpg" alt="PublicarWCF" width="484" height="285" border="0" /></a></p>
<p>Cuando aparece el cuadro de diálogo de “Agregar aplicación”, en este caso deberás cambiar el Grupo de aplicaciones con el que publicarás, en lugar de utilizar DefaultAppPool selecciona ASP.NET v4.0 como se ve en la imagen.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/GrupoAplicaciones.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="GrupoAplicaciones" src="http://aminespinoza.com/wp-content/uploads/2012/02/GrupoAplicaciones_thumb.jpg" alt="GrupoAplicaciones" width="401" height="299" border="0" /></a></p>
<p>Si ya tienes tu carpeta virtual lista, sigue el mismo procedimiento que en el servicio web ASP.NET para publicar vía Visual Studio 2010. Cuando tu servicio web haya sido satisfactoriamente publicado, ve a un explorador y escribe una dirección con los siguientes términos http://NombreDeTuServidor/NombreDeTuCarpetaVirtual/NombreDeTuServicio.svc en mi caso el resultado quedó como “http://servidoramin/ServicioWCF/Service1.svc”.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/DireccionWCF.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="DireccionWCF" src="http://aminespinoza.com/wp-content/uploads/2012/02/DireccionWCF_thumb.jpg" alt="DireccionWCF" width="502" height="245" border="0" /></a></p>
<p>¡Listo! Tenemos la segunda liga de acceso a nuestros dos servicios, esta liga, junto a la anterior las estaremos utilizando en el siguiente artículo, al consumir datos de nuestros servicios web en una aplicación de Silverlight.</p>
<p><a href="http://aminespinoza.com/materialBlog/proyectos/ServicioWeb.zip">Puedes descargar la aplicación aquí.</a></contacto></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/02/crear-y-publicar-una-aplicacin-wcf-parte-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crear y publicar un servicio web ASP.NET (Parte 2)</title>
		<link>http://blogs.ligasilverlight.com/2012/02/crear-y-publicar-un-servicio-web-asp-net-parte-2/</link>
		<comments>http://blogs.ligasilverlight.com/2012/02/crear-y-publicar-un-servicio-web-asp-net-parte-2/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 07:22:20 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3651</guid>
		<description><![CDATA[En la primer entrada de esta mini serie de artículos relacionados vimos la introducción de la manera de como podemos vincular bases de datos con Silverlight, vamos a continuar con los servicios web ASP.NET. Crea un nuevo proyecto en Visual Studio, de tipo Web Service Application ¡Aguas! Debes haber seleccionado el Framework 3.5. &#160; Al aparecer el proyecto generado obtendrás una pantalla como la siguiente. &#160; Como puedes ver el método lleva antes el prefijo [WebMethod] y es público, debes considerar estos dos elementos para poder hacer tu método accesible desde la web, y es aquí en donde nos encargaremos de crear tres métodos, uno de consulta, uno de edición y uno de actualización (el de borrar quedará de tarea ¿Te late?). Antes de continuar, debo aclarar algo muy importante, seré un tanto injusto al crear estos servicios comparados con los WCF pero quiero hacerlo de la forma mas básica para que de paso puedas cubrir una gama mas amplia de tecnologías, pero para calmar mi conciencia debo decirte que puedes mezclar tecnologías sin problemas. Lo primero que insertaremos aquí será un método privado que nos permitirá el acceso a nuestra cadena de conexión. private string cadenaConexion() { string cadena [...]]]></description>
			<content:encoded><![CDATA[<p>En la <a href="http://aminespinoza.com/crear-y-consumir-servicios-web-en-silverlight-parte-1/">primer entrada de esta mini serie</a> de artículos relacionados vimos la introducción de la manera de como podemos vincular bases de datos con Silverlight, vamos a continuar con los servicios web ASP.NET.</p>
<p>Crea un nuevo proyecto en Visual Studio, de tipo Web Service Application ¡Aguas! Debes haber seleccionado el Framework 3.5.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/ServicioASP.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="ServicioASP" src="http://aminespinoza.com/wp-content/uploads/2012/02/ServicioASP_thumb.jpg" alt="ServicioASP" width="600" height="415" border="0" /></a></p>
<p>&nbsp;</p>
<p>Al aparecer el proyecto generado obtendrás una pantalla como la siguiente.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/CodigoASP.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="CodigoASP" src="http://aminespinoza.com/wp-content/uploads/2012/02/CodigoASP_thumb.jpg" alt="CodigoASP" width="600" height="362" border="0" /></a></p>
<p>&nbsp;</p>
<p>Como puedes ver el método lleva antes el prefijo [WebMethod] y es público, debes considerar estos dos elementos para poder hacer tu método accesible desde la web, y es aquí en donde nos encargaremos de crear tres métodos, uno de consulta, uno de edición y uno de actualización (el de borrar quedará de tarea ¿Te late?).</p>
<p><strong>Antes de continuar, debo aclarar algo muy importante, seré un tanto injusto al crear estos servicios comparados con los WCF pero quiero hacerlo de la forma mas básica para que de paso puedas cubrir una gama mas amplia de tecnologías, pero para calmar mi conciencia debo decirte que puedes mezclar tecnologías sin problemas.</strong></p>
<p>Lo primero que insertaremos aquí será un método privado que nos permitirá el acceso a nuestra cadena de conexión.</p>
<pre class="brush: csharp">private string cadenaConexion()
{
string cadena = &quot;Data Source=SERVIDORAMIN;Initial Catalog=Directorio;Integrated Security=True;&quot;;
return cadena;
}</pre>
<p>&nbsp;</p>
<p align="center"><strong><span style="font-size: medium;">Consultar información</span></strong></p>
<p>Este método nos dará toda la información de nuestros contactos.</p>
<p>&nbsp;</p>
<pre class="brush: csharp">[WebMethod]
public List&lt;string&gt; MostrarTodosLosContactos()
{
List&lt;/string&gt;&lt;string&gt; listaClientes = new List&lt;/string&gt;&lt;string&gt;();
SqlConnection conexion = new SqlConnection(cadenaConexion());
SqlDataAdapter adaptador;
string Consulta = &quot;SELECT * FROM Contacto&quot;;
DataTable datos = new DataTable();

adaptador = new SqlDataAdapter(Consulta, conexion);
adaptador.Fill(datos);

foreach (DataRow registros in datos.Rows)
{
listaClientes.Add(registros[&quot;ID&quot;].ToString() + &quot;|&quot; + registros[&quot;Nombre&quot;].ToString() + &quot;|&quot; + registros[&quot;APELLIDOS&quot;].ToString() +
&quot;|&quot; + registros[&quot;TELEFONO&quot;].ToString() + &quot;|&quot; + registros[&quot;EMAIL&quot;].ToString());
}

return listaClientes;
}</pre>
<p>Creamos una lista de tipo string y por medio de los datos que obtenemos de la consulta vamos llenando la lista, así de simple.</p>
<p>&nbsp;</p>
<p align="center"><strong><span style="font-size: medium;">Insertar registros</span></strong></p>
<p>Este método nos dará la posibilidad de insertar nuevos registros en nuestra tabla.</p>
<pre class="brush: csharp">[WebMethod]
public int InsertarNuevaFecha(string Nombre, string Apellidos, string Telefono, string Email)
{
string cadenaActualizar = &quot;INSERT INTO Contacto (Nombre, APELLIDOS, TELEFONO, EMAIL) values (@nombre, @apellidos, @telefono, @email)&quot;;
int t = 0;
using (SqlConnection conexion = new SqlConnection(cadenaConexion()))
{
SqlCommand comando = new SqlCommand(cadenaActualizar, conexion);
conexion.Open();
comando.Parameters.AddWithValue(&quot;@nombre&quot;, Nombre);
comando.Parameters.AddWithValue(&quot;@apellidos&quot;, Apellidos);
comando.Parameters.AddWithValue(&quot;@telefono&quot;, Telefono);
comando.Parameters.AddWithValue(&quot;@email&quot;, Email);
t = comando.ExecuteNonQuery();
conexion.Close();
}
return t;
}</pre>
<p>&nbsp;</p>
<p>Como puedes ver, lo que hacemos es simplemente recibir los parámetros y en base a ellos insertar un nuevo elemento en nuestra tabla, como es obligatorio que TODOS los métodos accesibles desde web regresen un valor, en este caso regresamos el valor de las operaciones realizadas.</p>
<p>&nbsp;</p>
<p align="center"><span style="font-size: medium;"><strong>Actualizar registros</strong></span></p>
<p>Este método nos dará la posibilidad de modificar a los registros que ya tenemos, ya sea en uno solo o en todos sus atributos.</p>
<pre class="brush: csharp">[WebMethod]
public int ActualizarContacto(string ID, string Nombre, string Apellidos, string Telefono, string Email)
{
string cadenaActualizar = &quot;UPDATE Contacto SET Nombre=@nombre, APELLIDOS=@apellidos, TELEFONO=@telefono, EMAIL=@email WHERE (ID =&quot; + ID + &quot;)&quot;;
int t = 0;
using (SqlConnection conexion = new SqlConnection(cadenaConexion()))
{
SqlCommand comando = new SqlCommand(cadenaActualizar, conexion);
conexion.Open();
comando.Parameters.AddWithValue(&quot;@nombre&quot;, Nombre);
comando.Parameters.AddWithValue(&quot;@apellidos&quot;, Apellidos);
comando.Parameters.AddWithValue(&quot;@telefono&quot;, Telefono);
comando.Parameters.AddWithValue(&quot;@email&quot;, Email);
t = comando.ExecuteNonQuery();
conexion.Close();
}
return t;}</pre>
<p>&nbsp;</p>
<p>Aquí de una forma muy parecida al método anterior recibimos todos los argumentos y con la sentencia SQL actualizamos los datos en función de su campo ID.</p>
<p>Bien, si ya tienes los métodos completados y ejecutas tu servicio web, el resultado será muy similar a esto.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/MetodosServicio.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="MetodosServicio" src="http://aminespinoza.com/wp-content/uploads/2012/02/MetodosServicio_thumb.jpg" alt="MetodosServicio" width="500" height="260" border="0" /></a></p>
<p>Vamos a hacer una pequeña prueba y seleccionar el método MostrarTodosLosContactos, veras una pantalla así.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/MetodoContactos.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="MetodoContactos" src="http://aminespinoza.com/wp-content/uploads/2012/02/MetodoContactos_thumb.jpg" alt="MetodoContactos" width="500" height="183" border="0" /></a></p>
<p>Si pruebas en los otros dos métodos notarás que te piden que llenes información, esto es debido a los parámetros que los métodos necesitan para poder operar de manera adecuada. En el caso del método que usamos, presiona el botón Invocar y tu resultado debe ser este.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/ResultadoOperacion.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="ResultadoOperacion" src="http://aminespinoza.com/wp-content/uploads/2012/02/ResultadoOperacion_thumb.jpg" alt="ResultadoOperacion" width="600" height="88" border="0" /></a></p>
<p>Así es, nada mas que un XML que nos estará regresando la información que le solicitamos. Hasta aquí ya tenemos nuestro servicio web realizado, pero para que Silverlight pueda consumirlo, deberemos publicarlo en nuestro IIS, así que vamos para eso.</p>
<p align="center"><span style="font-size: medium;"><strong>Publicar mi servicio en IIS</strong></span></p>
<p>En la ruta C:\inetpub\wwwroot (debes tener <a href="http://darkchicles.wordpress.com/2009/12/01/activar-iis-en-windows-7/">instalado IIS para esto</a>), crea una nueva carpeta.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/IIS.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="IIS" src="http://aminespinoza.com/wp-content/uploads/2012/02/IIS_thumb.jpg" alt="IIS" width="522" height="263" border="0" /></a></p>
<p>Ya con la carpeta creada, vete al administrador de tu equipo. (Presiona la tecla de Windows + R y escribe el comando compmgmt.msc), selecciona al administrador de IIS, expande los nodos de la derecha hasta llegar a la posición de la siguiente imagen.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/AplicacionIIS.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="AplicacionIIS" src="http://aminespinoza.com/wp-content/uploads/2012/02/AplicacionIIS_thumb.jpg" alt="AplicacionIIS" width="364" height="383" border="0" /></a></p>
<p>&nbsp;</p>
<p>Al seleccionar la opción marcada te aparecerá una ventana como la de abajo, solo da clic en aceptar.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/Aplicacioniis2.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="Aplicacioniis2" src="http://aminespinoza.com/wp-content/uploads/2012/02/Aplicacioniis2_thumb.jpg" alt="Aplicacioniis2" width="363" height="251" border="0" /></a></p>
<p>Y ahora verás que tu antigua carpeta se verá de la siguiente forma.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/Aplciacionterminada.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="Aplciacionterminada" src="http://aminespinoza.com/wp-content/uploads/2012/02/Aplciacionterminada_thumb.jpg" alt="Aplciacionterminada" width="183" height="252" border="0" /></a></p>
<p>Ahora podremos regresar a Visual Studio y seleccionar en el menú de “Build” la opción de “Publish Service”.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/publicarApp.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="publicarApp" src="http://aminespinoza.com/wp-content/uploads/2012/02/publicarApp_thumb.jpg" alt="publicarApp" width="405" height="206" border="0" /></a></p>
<p>En el cuadro de diálogo escoge la opción de File System en la opción de Publish method y en la de Target Location presiona el botón de “Examinar” (el de los tres puntitos pues).</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/VentanaPublicar.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border: 0px;" title="VentanaPublicar" src="http://aminespinoza.com/wp-content/uploads/2012/02/VentanaPublicar_thumb.jpg" alt="VentanaPublicar" width="314" height="272" border="0" /></a></p>
<p>Al presionar el botón de examinar, tendrás en pantalla ahora la siguiente ventana (si no te apareció es porque no estás corriendo tu Visual Studio en modo administrador), ahí simplemente selecciona la carpeta que acabas de crear.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/ServidorIIS.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border: 0px;" title="ServidorIIS" src="http://aminespinoza.com/wp-content/uploads/2012/02/ServidorIIS_thumb.jpg" alt="ServidorIIS" width="396" height="312" border="0" /></a></p>
<p>Tu cuadro de diálogo inicial quedará de la siguiente forma.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/VentanaFinal.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border: 0px;" title="VentanaFinal" src="http://aminespinoza.com/wp-content/uploads/2012/02/VentanaFinal_thumb.jpg" alt="VentanaFinal" width="314" height="271" border="0" /></a></p>
<p>Solo basta que presiones “Publish” y veas en la esquina inferior izquierda y en tu ventana de Output los siguientes mensajes.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/Publicacion.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border: 0px;" title="Publicacion" src="http://aminespinoza.com/wp-content/uploads/2012/02/Publicacion_thumb.jpg" alt="Publicacion" width="467" height="125" border="0" /></a></p>
<p>Ya que tienes ese letrero, puedes escribir la url de tu sitio con la siguiente secuencia http://NombreDeTuServidor/NombreDeTuCarpeta/NombreDeTuServicio, en mi caso quedó así “http://localhost/ServicioASP/Service1.asmx”.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/ServicioPublicado.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border: 0px;" title="ServicioPublicado" src="http://aminespinoza.com/wp-content/uploads/2012/02/ServicioPublicado_thumb.jpg" alt="ServicioPublicado" width="560" height="201" border="0" /></a></p>
<p>¡Listo! Ya tienes tu servicio web publicado. En el artículo cuatro de esta serie te mostraré como consumir este servicio web en tu aplicación, por ahora solo prueba los métodos, estos deben funcionar exactamente igual que en tu aplicación en modo de desarrollo ahora que ya esta en modo productivo.</p>
<p><a href="aminespinoza.com/materialBlog/proyectos/ServicioASP.zip">Descarga aquí el código de ejemplo.</a></string></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/02/crear-y-publicar-un-servicio-web-asp-net-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crear y consumir servicios web en Silverlight (Parte 1)</title>
		<link>http://blogs.ligasilverlight.com/2012/02/crear-y-consumir-servicios-web-en-silverlight-parte-1/</link>
		<comments>http://blogs.ligasilverlight.com/2012/02/crear-y-consumir-servicios-web-en-silverlight-parte-1/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 07:21:11 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3649</guid>
		<description><![CDATA[Cuando desarrollas una aplicación en la mayoría de los casos es necesario que para su correcto funcionamiento deba obtener su información desde una fuente en específico, puedes hacerlo desde una fuente RSS con un archivo XML o un archivo JSON, pero si tu necesidad va mas allá y debes consumir tu información desde una base de datos, tus opciones se limitan a una sola posibilidad, consumir un servicio web. Los servicios web no son nada mas que intermediarios entre la aplicación Silverlight y la base de datos, dado que Silverlight se ejecuta en el “lado cliente” no le es posible estar en contacto con la base de datos, la cual se encuentra en el “lado servidor”, dado que el servicio web se encuentra alojado en el servidor, puede acceder a la base de datos, solicitar la información y enviarla a nuestra aplicación, si lo vemos en un diagrama, el resultado si lo quieres ver de la forma mas básica es algo como esto. Bien, ya habiendo explicado de esta forma el funcionamiento, puedo comenzar a entrar en materia, hay dos tecnologías principales para poder crear un servicio web bajo el entorno Microsoft, y lo encierro en ese campo para descartar [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando desarrollas una aplicación en la mayoría de los casos es necesario que para su correcto funcionamiento deba obtener su información desde una fuente en específico, puedes hacerlo desde una fuente RSS con un archivo XML o un archivo JSON, pero si tu necesidad va mas allá y debes consumir tu información desde una base de datos, tus opciones se limitan a una sola posibilidad, consumir un <a href="http://es.wikipedia.org/wiki/Servicio_web">servicio web</a>.</p>
<p>Los servicios web no son nada mas que intermediarios entre la aplicación Silverlight y la base de datos, dado que Silverlight se ejecuta en el “lado cliente” no le es posible estar en contacto con la base de datos, la cual se encuentra en el “lado servidor”, dado que el servicio web se encuentra alojado en el servidor, puede acceder a la base de datos, solicitar la información y enviarla a nuestra aplicación, si lo vemos en un diagrama, el resultado si lo quieres ver de la forma mas básica es algo como esto.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/ServicioWeb.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="ServicioWeb" src="http://aminespinoza.com/wp-content/uploads/2012/02/ServicioWeb_thumb.jpg" alt="ServicioWeb" width="600" height="350" border="0" /></a></p>
<p>Bien, ya habiendo explicado de esta forma el funcionamiento, puedo comenzar a entrar en materia, hay dos tecnologías principales para poder crear un servicio web bajo el entorno Microsoft, y lo encierro en ese campo para descartar otras plataformas, como Java y PHP que son muy recurridas para esta funcionalidad también (y que Silverlight puede consumir sin problema).</p>
<p>Las dos tecnologías que te menciono son los servicios web ASP y WCF, ambos tienen características particulares que los hacen únicos, vamos viendo cuales pueden ser.</p>
<p align="center"><strong><span style="font-size: medium;">Servicios ASP.NET</span></strong></p>
<p>Son los primeros que aparecieron, en la actualidad no fueron incluidos como parte del Framework 4.0 de .NET para dar paso a sus sucesores (WCF), pero aún puedes incluirlos dentro de una solución como parte de esta (a mí no me late hacerlo, siempre he optado por tener el servicio web en una solución y la aplicación en otra, al menos en entornos productivos). La razón por la que debas utilizarlos obedece sencillamente a que el servidor donde vas a publicar tu servicio web aún no cuenta con el Framework 4.0 pues de lo contrario la mejor recomendación será usar un servicio WCF.</p>
<p align="center"><span style="font-size: medium;"><strong>Servicios WCF</strong></span></p>
<p>Son la nueva herramienta para intercambio de información, abismalmente mas equipados con herramientas y funcionalidades, tantas que son considerados como aplicaciones, es decir, aplicaciones orientadas a servicios, fueron creados efectivamente para reemplazar a los servicios ASP.NET y dotarlos de mejor funcionalidad, enseguida veremos cuales son.</p>
<p>Para comenzar a hacer pruebas lo primero que debes hacer es crear una base de datos, nada del otro mundo, simplemente crea una tabla que contenga los siguientes datos.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/TablaContacto.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="TablaContacto" src="http://aminespinoza.com/wp-content/uploads/2012/02/TablaContacto_thumb.jpg" alt="TablaContacto" width="335" height="162" border="0" /></a></p>
<p>Recuerda que el campo ID debe tener la propiedad de Identidad. Ya que tengas la tabla completa, ahora llénala con unos cuantos registros.</p>
<p><a href="http://aminespinoza.com/wp-content/uploads/2012/02/Registros-tablas.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="Registros tablas" src="http://aminespinoza.com/wp-content/uploads/2012/02/Registros-tablas_thumb.jpg" alt="Registros tablas" width="557" height="156" border="0" /></a></p>
<p>Esta tabla será la misma que utilizaremos en ambos servicios, así que ya podemos dejar de lado a SQL, y comenzar con la creación de los servicios. Así que tu escoges hacia donde ir ahora.</p>
<p><a href="http://aminespinoza.com/crear-y-publicar-un-servicio-web-asp-net-parte-2/" target="_blank">Parte 2.- Crear y publicar un servicio web ASP.NET</a></p>
<p><a href="http://aminespinoza.com/crear-y-publicar-una-aplicacin-wcf-parte-3/" target="_blank">Parte 3.- Crear y publicar un servicio WCF</a></p>
<p><a href="http://aminespinoza.com/consumir-servicios-web-asp-net-y-wcf-en-silverlight-parte-4/" target="_blank">Parte 4.- Consumir mis servicios web en una aplicación Silverlight</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/02/crear-y-consumir-servicios-web-en-silverlight-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uso y creaci&#243;n de Behaviors en Silverlight</title>
		<link>http://blogs.ligasilverlight.com/2012/02/uso-y-creacin-de-behaviors-en-silverlight/</link>
		<comments>http://blogs.ligasilverlight.com/2012/02/uso-y-creacin-de-behaviors-en-silverlight/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 01:29:05 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Blend]]></category>
		<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3640</guid>
		<description><![CDATA[Las conductas (o behaviors en inglés) son una de esas funcionalidades que he visto que muy pocos utilizan y que en lo personal se me hacen una herramienta sumamente potente, reutilizable y muy fáciles de dominar, por eso me animé a escribir sobre ellas. Para empezar creo que lo mejor es definir que es lo que pueden hacer o para que fueron hechas ¿no crees? Bueno, pues las conductas tienen un fin muy sencillo, hacerte la vida fácil al momento de implementar funcionalidad específica en tus controles, veamos un ejemplo para poder entenderlo mejor. Utilizar una conducta de forma básica Comienza por crear un nuevo proyecto en Expression Blend (si, aquí es en donde trabajaremos en esta ocasión), y vamos a colocar un rectángulo en la pantalla, para quedar de la siguiente manera. Utilizar las conductas no es nada del otro mundo, solo necesitamos presionar el botón de “Assets” para poder escribir el nombre de una conducta, la primera por la que comenzaremos se llama “MouseDragElementBehavoir”, el resultado de tu pantalla debe ser algo así. &#160; Solo debes arrastrarla hasta el control en cuestión para que en tu pestaña de objetos puedas ver esto. De esta forma el resultado es [...]]]></description>
			<content:encoded><![CDATA[<p>Las conductas (o behaviors en inglés) son una de esas funcionalidades que he visto que muy pocos utilizan y que en lo personal se me hacen una herramienta sumamente potente, reutilizable y muy fáciles de dominar, por eso me animé a escribir sobre ellas.</p>
<p>Para empezar creo que lo mejor es definir que es lo que pueden hacer o para que fueron hechas ¿no crees? Bueno, pues las conductas tienen un fin muy sencillo, hacerte la vida fácil al momento de implementar funcionalidad específica en tus controles, veamos un ejemplo para poder entenderlo mejor.</p>
<p><strong><span style="font-size: medium;">Utilizar una conducta de forma básica</span></strong></p>
<p>Comienza por crear un nuevo proyecto en Expression Blend (si, aquí es en donde trabajaremos en esta ocasión), y vamos a colocar un rectángulo en la pantalla, para quedar de la siguiente manera.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/Interfaz.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="Interfaz" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/Interfaz_thumb.jpg" alt="Interfaz" width="437" height="271" border="0" /></a></p>
<p>Utilizar las conductas no es nada del otro mundo, solo necesitamos presionar el botón de “Assets” para poder escribir el nombre de una conducta, la primera por la que comenzaremos se llama “MouseDragElementBehavoir”, el resultado de tu pantalla debe ser algo así.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/mouseDrag.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="mouseDrag" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/mouseDrag_thumb.png" alt="mouseDrag" width="600" height="262" border="0" /></a></p>
<p>&nbsp;</p>
<p>Solo debes arrastrarla hasta el control en cuestión para que en tu pestaña de objetos puedas ver esto.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/conducta.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="conducta" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/conducta_thumb.jpg" alt="conducta" width="228" height="374" border="0" /></a></p>
<p>De esta forma el resultado es un control arrastrable por toda la interfaz, dando funcionalidad de una forma muy práctica.</p>
<p><strong><span style="font-size: medium;">Utilizar una conducta con parámetros</span></strong></p>
<p>Hay algunas conductas previamente creadas que necesitan el uso de algunos argumentos para poder funcionar, para que veas como es esto, vamos a implementar en nuestro mismo rectángulo una conducta que requiere cierta configuración, pero antes deberemos crear una animación para el control, por lo que vamos a usar un nuevo control, para dejar intacto al anterior y al nuevo es al que le pondremos una nueva animación.</p>
<p>Crea la animación que gustes, al final el XAML que llevamos hasta ahora es algo así.</p>
<pre class="brush: xml">&lt;usercontrol xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
xmlns:i=&quot;http://schemas.microsoft.com/expression/2010/interactivity&quot;
xmlns:ei=&quot;http://schemas.microsoft.com/expression/2010/interactions&quot;
x:Class=&quot;Behaviors.MainPage&quot; Width=&quot;1024&quot; Height=&quot;768&quot;&gt;

&lt;/usercontrol&gt;&lt;usercontrol .Resources&gt;
&lt;storyboard x:Name=&quot;moverElemento&quot;&gt;
&lt;doubleanimationusingkeyframes Storyboard.TargetProperty=&quot;(UIElement.RenderTransform).(CompositeTransform.TranslateX)&quot; Storyboard.TargetName=&quot;rectangle&quot;&gt;
&lt;easingdoublekeyframe KeyTime=&quot;0&quot; Value=&quot;0&quot;/&gt;
&lt;easingdoublekeyframe KeyTime=&quot;0:0:0.5&quot; Value=&quot;300&quot;&gt;
&lt;/easingdoublekeyframe&gt;&lt;easingdoublekeyframe .EasingFunction&gt;
&lt;circleease EasingMode=&quot;EaseOut&quot;/&gt;
&lt;/easingdoublekeyframe&gt;

&lt;easingdoublekeyframe KeyTime=&quot;0:0:1&quot; Value=&quot;0&quot;&gt;
&lt;/easingdoublekeyframe&gt;&lt;easingdoublekeyframe .EasingFunction&gt;
&lt;circleease EasingMode=&quot;EaseOut&quot;/&gt;
&lt;/easingdoublekeyframe&gt;

&lt;/doubleanimationusingkeyframes&gt;
&lt;/storyboard&gt;
&lt;/usercontrol&gt;

&lt;grid x:Name=&quot;LayoutRoot&quot; Background=&quot;White&quot;&gt;
&lt;rectangle Fill=&quot;#FF4444F9&quot; HorizontalAlignment=&quot;Left&quot; Height=&quot;155&quot; Margin=&quot;60,65,0,0&quot; Stroke=&quot;Black&quot; VerticalAlignment=&quot;Top&quot; Width=&quot;165&quot; RenderTransformOrigin=&quot;0.5,0.5&quot;&gt;
&lt;i:interaction .Behaviors&gt;
&lt;ei:mousedragelementbehavior /&gt;
&lt;/i:interaction&gt;
&lt;/rectangle&gt;
&lt;rectangle x:Name=&quot;rectangle&quot; Fill=&quot;#FF4444F9&quot; HorizontalAlignment=&quot;Left&quot; Margin=&quot;60,377,0,236&quot; Stroke=&quot;Black&quot; Width=&quot;165&quot; RenderTransformOrigin=&quot;0.5,0.5&quot;&gt;
&lt;/rectangle&gt;&lt;rectangle .RenderTransform&gt;
&lt;compositetransform /&gt;
&lt;/rectangle&gt;

&lt;/grid&gt;
</pre>
<p>Y de nuevo vas a llamar una conducta, ahora usaremos “Control Storyboard Animation”.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/control.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="control" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/control_thumb.jpg" alt="control" width="600" height="380" border="0" /></a></p>
<p>Al haber arrastrado esta conducta dentro de tu control, en la pestaña de propiedades aparecerán los argumentos que debemos poder utilizar.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/argumentos.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="argumentos" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/argumentos_thumb.jpg" alt="argumentos" width="240" height="337" border="0" /></a></p>
<p>Como puedes ver, aquí al implementar la conducta debes poder establecerle ciertos elementos, al final, tu resultado puede ser algo como esto.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/configuracion.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="configuracion" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/configuracion_thumb.jpg" alt="configuracion" width="240" height="310" border="0" /></a></p>
<p>Si lo ves por XAML el resultado deberá ser así.</p>
<pre class="brush: xml">&lt;rectangle x:Name=&quot;rectangle&quot; Fill=&quot;#FF4444F9&quot; HorizontalAlignment=&quot;Left&quot; Margin=&quot;60,377,0,236&quot; Stroke=&quot;Black&quot; Width=&quot;165&quot; RenderTransformOrigin=&quot;0.5,0.5&quot;&gt;
&lt;i:interaction .Triggers&gt;
&lt;i:eventtrigger EventName=&quot;MouseLeftButtonDown&quot;&gt;
&lt;ei:controlstoryboardaction Storyboard=&quot;{StaticResource moverElemento}&quot;/&gt;
&lt;/i:eventtrigger&gt;
&lt;/i:interaction&gt;
&lt;/rectangle&gt;&lt;rectangle .RenderTransform&gt;
&lt;compositetransform /&gt;
&lt;/rectangle&gt;
</pre>
<p>La gran ventaja que tienes al implementar animaciones es que simplemente te ahorras muchísimo tiempo y además código por el lado de C#, entonces hasta aquí hemos visto como puedes usarlas en tu favor, pero como buen desarrollador no quedarás satisfecho con esto, sino que irás queriendo crear nuevas conductas de acuerdo a tus necesidades.</p>
<p><strong><span style="font-size: medium;">Crear tus propias conductas</span></strong></p>
<p>Vamos a brincarnos a Visual Studio 2010, lo primero que debemos hacer es crear una clase por separado y después agregar la referencia System.Windows.Interactivity.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/Proyecto.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="Proyecto" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/Proyecto_thumb.jpg" alt="Proyecto" width="212" height="318" border="0" /></a></p>
<p>&nbsp;</p>
<p>Una vez teniendo la clase “MiConducta” necesitamos crear la referencia al ensamblado que acabamos de llamar.</p>
<pre class="brush: csharp">using System.Windows.Interactivity;</pre>
<p>Ahora si, con el ensamblado y la referencia, modifica la línea que declara la clase de la siguiente forma</p>
<pre class="brush: csharp">public class MiConducta : TargetedTriggerAction&lt;rectangle&gt;</pre>
<p>De esta forma la clase que recién acabas de crear heredará de la clase TargetedTriggerAction y a su vez, tendrá la funcionalidad por medio de su constructor para un rectángulo (aclaro que si modificas esta funcionalidad, puedes hacerla sin problema para cualquier elemento que necesites, solo por ejemplo escogí al rectángulo).</p>
<p>Después vamos a declarar tres objetos que nos servirán para la funcionalidad de nuestra conducta.</p>
<pre class="brush: csharp">Shape elementoObjetivo;
Brush color1;
Brush color2 = new SolidColorBrush(Color.FromArgb(255, 0, 0, 0));</pre>
<p>Y ahora, gracias a la herencia que acabamos de asignar, podremos utilizar un método sobrecargado que se llama Invoke, este es el método que se desencadena al momento de llamar a la conducta dentro de nuestro XAML, y debe quedarte así.</p>
<pre class="brush: csharp">protected override void Invoke(object parameter)
{
elementoObjetivo = (Shape)this.AssociatedObject;
color1 = (Brush)elementoObjetivo.Fill;
elementoObjetivo.MouseLeftButtonDown += elementoObjetivo_MouseLeftButtonDown;
elementoObjetivo.MouseLeftButtonUp += elementoObjetivo_MouseLeftButtonUp;
}</pre>
<p>Como puedes ver, estamos utilizando dos manejadores para cuando nuestro objeto en cuestión sea utilizado, los dos manejadores tendrán lo siguiente.</p>
<pre class="brush: csharp">void elementoObjetivo_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
elementoObjetivo.Fill = color1;
}

void elementoObjetivo_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
elementoObjetivo.Fill = color2;
}</pre>
<p>Si compilas tu aplicación, ya podrás comenzar a utilizar tu nueva conducta desde Expression Blend.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/MiConducta.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="MiConducta" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/02/MiConducta_thumb.jpg" alt="MiConducta" width="600" height="380" border="0" /></a></p>
<p><strong><span style="font-size: medium;">Conclusión</span></strong></p>
<p>Crear conductas es una forma genial de ahorrar muchas líneas de código para personalizar tus controles, pueden quitarle a los diseñadores los problemas de interactuar con código y lo mejor es que pueden ser reutilizables si las creas como una biblioteca de clases, así que comienza a entretenerte con esta gran funcionalidad de Silverlight.</p>
<p><a href="http://aminespinoza.com/materialBlog/proyectos/Behaviors.zip">Puedes descargar el código desde aquí.</a></rectangle></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/02/uso-y-creacin-de-behaviors-en-silverlight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desplegando un ChildWindow en objetos Window en Silverlight 5</title>
		<link>http://blogs.ligasilverlight.com/2012/01/desplegando-un-childwindow-en-objetos-window-en-silverlight-5/</link>
		<comments>http://blogs.ligasilverlight.com/2012/01/desplegando-un-childwindow-en-objetos-window-en-silverlight-5/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 16:33:41 +0000</pubDate>
		<dc:creator>Rodrigo Díaz Concha</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[silverlight 5]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3620</guid>
		<description><![CDATA[Silverlight 5 cuenta con muchas características enfocadas principalmente a la construcción de aplicaciones de negocio, una de ellas es la creación de Ventanas de Sistema. Sin embargo, si necesitas mostrar un ChildWindow dentro de una ventana creada dinámicamente, el comportamiento que obtendrás tal vez no es el esperado, y es que el ChildWindow se mostrará en la raíz de la aplicación (comunmente MainPage) y no en la ventana nueva en donde estás ejecutando el código. Por ejemplo, en la siguiente figura la aplicación crea la ventana de la izquierda… …pero al crear el objeto ChildWindow dentro de la ventana en donde esperas que se despliegue: Este comportamiento no es el esperado ¿cierto? En este artículo explicaré cómo puedes obligar que el ChildWindow se dibuje adecuadamente en la ventana que le corresponda. Puedes leer el artículo completo aquí]]></description>
			<content:encoded><![CDATA[<p><a href="http://silverlight.net" target="_blank">Silverlight 5</a> cuenta con <a href="http://rdiazconcha.com/2011/12/silverlight-5-ya-disponible/" target="_blank">muchas características</a> enfocadas principalmente a la construcción de aplicaciones de negocio, una de ellas es la creación de Ventanas de Sistema.</p>
<p>Sin embargo, si necesitas mostrar un ChildWindow dentro de una ventana creada dinámicamente, el comportamiento que obtendrás tal vez no es el esperado, y es que el ChildWindow se mostrará en la raíz de la aplicación (comunmente MainPage) y no en la ventana nueva en donde estás ejecutando el código.</p>
<p>Por ejemplo, en la siguiente figura la aplicación crea la ventana de la izquierda…</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/01/SNAGHTML33a0cdc.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML33a0cdc" border="0" alt="SNAGHTML33a0cdc" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/01/SNAGHTML33a0cdc_thumb.png" width="500" height="284"/></a></p>
<p>…pero al crear el objeto ChildWindow dentro de la ventana en donde esperas que se despliegue:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/01/SNAGHTML3416af3.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML3416af3" border="0" alt="SNAGHTML3416af3" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/01/SNAGHTML3416af3_thumb.png" width="500" height="286"/></a></p>
<p>Este comportamiento no es el esperado ¿cierto?</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2012/01/image.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blogs.ligasilverlight.com/wp-content/uploads/2012/01/image_thumb.png" width="240" height="173"/></a></p>
<p>En este artículo explicaré cómo puedes obligar que el ChildWindow se dibuje adecuadamente en la ventana que le corresponda.</p>
<h2><a href="http://rdiazconcha.com/2012/01/desplegando-un-childwindow-en-objetos-window-en-silverlight-5/" target="_blank">Puedes leer el artículo completo aquí</a></h2>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2012/01/desplegando-un-childwindow-en-objetos-window-en-silverlight-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>D&#237;a 31: Promoviendo tu aplicaci&#243;n</title>
		<link>http://blogs.ligasilverlight.com/2011/12/da-31-promoviendo-tu-aplicacin/</link>
		<comments>http://blogs.ligasilverlight.com/2011/12/da-31-promoviendo-tu-aplicacin/#comments</comments>
		<pubDate>Sat, 31 Dec 2011 18:05:16 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3539</guid>
		<description><![CDATA[Esta es una traducción de Day 31: Promoting Your App, puedes encontrar el artículo aquí en su versión original en inglés. Hacer que los usuarios encuentren tu aplicación puede parecer como algo que está fuera de tus manos, pero estás equivocado. Hay muchas cosas que puedes hacer para manejar la atención hacia tu aplicación. Esta sección se enfoca en algunas de las mejores prácticas que deberías utilizar para cada aplicación que crees. La primera semana es vital A menos de que tu aplicación se convierta en una gran sensación, es altamente posible que la primer semana de tu aplicación en el marketplace será en donde veas el más alto número de descargas diarias. Obtener exposición en la categoría “Nuevo” es una oportunidad muy buena y necesitas asegurarte de que estás manejando esto en una forma que hará a tu aplicación brillar por mucho mas que solo unos días. Al final, tu meta es catapultarla desde la categoría Nuevo a la categoría Top Apps. Los cuatro o cinco días que tienes que esperar para que tu aplicación sea aprobada podrían ser aprovechados para ejecutar una estrategia para hacer pública la expectativa de tu aplicación. Enlazar a tu aplicación Cuando ingresas tu [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jeffblankenburg.com/2011/12/01/31-days-of-mango-day-31-promoting-your-app/">Esta es una traducción de Day 31: Promoting Your App, puedes encontrar el artículo aquí en su versión original en inglés.</a></p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia31.png"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border: 0px;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia31_thumb.png" alt="dia31" width="600" height="75" border="0" /></a></p>
<p>Hacer que los usuarios encuentren tu aplicación puede parecer como algo que está fuera de tus manos, pero estás equivocado. Hay muchas cosas que puedes hacer para manejar la atención hacia tu aplicación. Esta sección se enfoca en algunas de las mejores prácticas que deberías utilizar para cada aplicación que crees.</p>
<p><strong><span style="font-size: large;">La primera semana es vital</span></strong></p>
<p>A menos de que tu aplicación se convierta en una gran sensación, es altamente posible que la primer semana de tu aplicación en el marketplace será en donde veas el más alto número de descargas diarias. Obtener exposición en la categoría “Nuevo” es una oportunidad muy buena y necesitas asegurarte de que estás manejando esto en una forma que hará a tu aplicación brillar por mucho mas que solo unos días. Al final, tu meta es catapultarla desde la categoría Nuevo a la categoría Top Apps. Los cuatro o cinco días que tienes que esperar para que tu aplicación sea aprobada podrían ser aprovechados para ejecutar una estrategia para hacer pública la expectativa de tu aplicación.</p>
<p><strong><span style="font-size: large;">Enlazar a tu aplicación</span></strong></p>
<p>Cuando ingresas tu aplicación por primera vez en el Marketplace, incluso antes de que la aplicación sea aprobada, tienes ya asignado un “deep link” que puedes usar para dirigir a las personas hacia tu aplicación usando una dirección web ordinaria. Aquí está el ejemplo del enlace a una de mis aplicaciones, MathMaster:</p>
<p><a title="http://www.windowsphone.com/es-MX/apps/f08521cd-1cff-df11-9264-00237de2db9e" href="http://www.windowsphone.com/es-MX/apps/f08521cd-1cff-df11-9264-00237de2db9e">http://www.windowsphone.com/es-MX/apps/f08521cd-1cff-df11-9264-00237de2db9e</a></p>
<p>Este enlace te lleva a una página que intentará abrir Zune en la máquina del usuario, y después redireccionarlo a la página de tu aplicación en el Marketplace. Este enlace no funcionará a menos que tu aplicación haya sido aprobada. Recomendamos usar este link cada vez que puedas, especialmente en el sitio personalizado que creaste para tus aplicaciones. Estás planeando hacer eso ¿No es así?</p>
<p><strong><span style="font-size: large;">Crear un portal web para tus aplicaciones</span></strong></p>
<p>Una cosa importante que deberías haber aprendido al pasear por el Marketplace en el <a href="http://www.jeffblankenburg.com/2010/10/27/31-days-of-windows-phone-day-27-windows-phone-marketplace/">Día 27 de la serie original de Windows Phone</a> fue que tu habilidad para discutir acerca de tus aplicaciones en el Marketplace es muy limitada. Unos cuantos pantallazos y aproximadamente 2,000 caracteres es todo lo que tienes. Al crear un sitio web para tus aplicaciones, creas muchas nuevas oportunidades para ti mismo.</p>
<p>1. Puedes crear conexiones reales con tus usuarios. El Marketplace de Windows Phone no te da ninguna indicación de quienes son tus usuarios. Un sitio web te permite interactuar con tus fans.</p>
<p>2. Puedes dar un monto de información muy enriquecido acerca de tu aplicación, incluyendo videos y otro contenido promocional que pueda hacer a tu aplicación mas atractiva.</p>
<p>3. Puedes relacionar a tus aplicaciones. El Marketplace no siempre hace un gran trabajo al promocionar tus otras aplicaciones a clientes potenciales, así que has que tu sitio web permita que eso suceda.</p>
<p>4. Tu aplicación ahora es detectable por gente que ni siquiera esta buscando activamente en el Marketplace.</p>
<p>5. Este sitio web no tiene que ser exactamente un sitio web por completo. No hay nada malo con crear una página en Facebook o cualquier otra red social que puedas personalizar. La idea final de este proceso es proveer un destino para tus fans, así ellos pueden pasar la voz acerca de tu genial aplicación.</p>
<p>Si quieres ver una plantilla genial para crear una página personalizada para tu aplicación, <a href="http://wp7appsite.codeplex.com/">checa esta plantilla de Windows Phone en CodePlex</a>. Es una página personalizable que se ve genial, usa pantallazos de tu aplicación, permite a tus usuarios dar comentarios y les da muchas formas de aprender mucho mas de tu aplicación. Aquí hay un pantallazo de la plantilla.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/image28.png"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border: 0px;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/image28_thumb.png" alt="image28" width="468" height="400" border="0" /></a></p>
<p><strong><span style="font-size: large;">Crear un video de guía para tu aplicación</span></strong></p>
<p>Uno de los elementos importantes de tu sitio web debe ser incluir un video guía de tu aplicación. Las capturas de pantalla en el Marketplace son buenas, pero permitirle al usuario ver la experiencia total en una forma controlada nos dará siempre mucha mas información. Nuestra recomendación es utilizar un programa de captura de pantallas como TechSmith’s Camtasia. Camtasia hace muy fácil no solo capturar video desde el emulador, sino editar los resultados, agregar música de fondo y colocar información de introducción antes y después del video. Hay probablemente bastantes herramientas que harán esto por ti, pero en nuestra experiencia, Camtasia es la herramienta perfecta para el trabajo. Puedes ver un ejemplo de mi aplicación de MathMaster en YouTube aquí.</p>
<p><a href="http://youtu.be/uMlyUn3sgJU">Puedes ver el video aquí.</a></p>
<p>Diviértete haciéndolo. En tu video puedes agregar un mayor nivel de interés a tu aplicación que las capturas de pantalla nunca podrán. Ahora que nos hemos enfocado en sitios web y videos, vamos a discutir cosas que puedes hacer dentro de tu aplicación para ayudar a promoverla.</p>
<p><strong><span style="font-size: large;">Generar opiniones de tu aplicación</span></strong></p>
<p>Las opiniones pueden ser un factor decisivo entre si tu aplicación tiene o no las descargas que estás buscando. Desafortunadamente, no hay un mecanismo para recordarle a los usuarios que comenten tu aplicación. Necesitas hacer esto por ti mismo. Recomendamos hacerlo como una adición agradable en tu aplicación en lugar de hacerlo una molestia para tu usuario.</p>
<p>Una idea que recomendamos es hacer un logro dentro de tu aplicación. Un poco de diversión sorprenderá y enganchará al usuario. Dale puntos por leer los créditos de la aplicación. Dale mas por usarla mas de 10 veces. Agregar logros a cualquier aplicación, encontrarás que tus usuarios estarán regresando mas y mas a ella. Quizá también desbloquees una pieza específica de funcionalidad que de otra manera no estaría disponible cuando opinen en tu aplicación.</p>
<p>Una segunda idea es contar el número de veces que tu usuario ha lanzado tu aplicación y pídele en la segunda, quinta y décima ocasión que opine tu aplicación. Pídelo gentilmente. No querrás molestarlo, pero si quieres su opinión. Puedes incluso usar la <a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.marketplacereviewtask%28v=VS.92%29.aspx">MarketplaceReviewTask</a> para llevarlos directamente a la página de opiniones de tu aplicación.</p>
<p>Grandes opiniones generan mas tráfico. Comúnmente, una opinión de una estrella puede ser tan valiosa como una escrita. El promedio de evaluación (1-5) es desplegada donde quiera que este tu aplicación, así un alto rango comúnmente genera mas tráfico. Hacer que tus usuarios dejen una opinión tendrá un efecto positivo en los rangos de descarga de tu aplicación.</p>
<p><strong><span style="font-size: large;">Cruzar tus aplicaciones entre ellas</span></strong></p>
<p>Dentro de tu aplicación, puedes dar un lugar donde el usuario puede encontrar información acerca de tu compañía, contactos de soporte y otra información como el número de la versión. En este lugar, o ciertamente en una ubicación mas prominente, tienes una oportunidad para promover las otras aplicaciones que has creado. Usa tus íconos.  Usa los deep links o el lanzador MarketplaceDetailTask. Da una forma sencilla para tu usuario para encontrar y descargar las ofertas que tienes de tus otras aplicaciones.</p>
<p>Si realmente te quieres poner imaginativo, crea un archivo XML en tu servidor web que contenga toda la información acerca de tus aplicaciones y consúmelo en tus aplicaciones para crear la lista de todas tus aplicaciones. De esta forma, cuando agregues una nueva aplicación a tu catálogo, no tendrás que actualizar todas tus aplicaciones, solo hacer esta promoción “cruzada”.</p>
<p>En resumen</p>
<p>Hay muchísimas cosas que necesitas hacer para tener a tu aplicación lista, después de que has terminado tu aplicación. Asegúrate que has considerado tu estrategia de promoción antes de presionar el botón final de “Ingresar” en tu aplicación. Crear una comunidad alrededor de tu aplicación solo ayudará a hacer crecer a tu audiencia, porque los usuarios entusiastas son también evangelistas poderosos de tu esfuerzo.</p>
<p>Si te has tomado este tiempo para crear una nueva aplicación sorprendente para Windows Phone, necesitas estar seguro de que va a tener el impacto potencial que estas esperando. Enfocarte en monetizar, promocionar y opinar es tan importante como tu aplicación misma.</p>
<p>Este es el artículo final de esta serie. Espero que la hayas disfrutado tanto como nosotros lo hemos hecho al escribirla. Muchas gracias por leer todos los post.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2011/12/da-31-promoviendo-tu-aplicacin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>D&#237;a 30: Base de datos local</title>
		<link>http://blogs.ligasilverlight.com/2011/12/da-30-base-de-datos-local/</link>
		<comments>http://blogs.ligasilverlight.com/2011/12/da-30-base-de-datos-local/#comments</comments>
		<pubDate>Sat, 31 Dec 2011 16:39:13 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3533</guid>
		<description><![CDATA[Esta es una traducción de Day 30: Local Database, puedes encontrar el artículo aquí en su versión original en inglés. ¿Qué es una base de datos local? En la versión original de Windows Phone 7, podíamos salvar información pero tomaba cierto código especial o utilizar bases de datos de terceros como SterlingDB para tener un repositorio de información relaciona que algunas aplicaciones necesitan. Esto limitó algunos tipos de aplicaciones que algunos desarrolladores pudieron producir para los usuarios. En Windows Phone Mango, los desarrolladores aún cuentan con el almacenamiento aislado para mantener información e información almacenada para sus aplicaciones pero ahora tenemos SQL CE como un elemento de almacenamiento relacional para crear aplicaciones aún mejores para Windows Phone. Como otras soluciones de bases de datos para el Windows Phone original, la base de datos nativa de SQL CE creada en Mango tiene su información almacenada en el almacenamiento aislado del dispositivo. Puedes aprender mas acerca del almacenamiento aislado aquí. Microsof tampoco creó nuevas formas de trabajar con la información en el teléfono y en su lugar implementó LINQ a SQL para todas las operaciones de las bases de datos. LINQ a SQL es usado para hacer todas la funciones para la [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jeffblankenburg.com/2011/11/30/31-days-of-mango-day-30-local-database/">Esta es una traducción de Day 30: Local Database, puedes encontrar el artículo aquí en su versión original en inglés.</a></p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia30.png"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border-width: 0px;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia30_thumb.png" alt="dia30" width="600" height="75" border="0" /></a></p>
<p><strong><span style="font-size: large;">¿Qué es una base de datos local?</span></strong></p>
<p>En la versión original de Windows Phone 7, podíamos salvar información pero tomaba cierto código especial o utilizar bases de datos de terceros como SterlingDB para tener un repositorio de información relaciona que algunas aplicaciones necesitan. Esto limitó algunos tipos de aplicaciones que algunos desarrolladores pudieron producir para los usuarios.</p>
<p>En Windows Phone Mango, los desarrolladores aún cuentan con el almacenamiento aislado para mantener información e información almacenada para sus aplicaciones pero ahora tenemos SQL CE como un elemento de almacenamiento relacional para crear aplicaciones aún mejores para Windows Phone.</p>
<p>Como otras soluciones de bases de datos para el Windows Phone original, la base de datos nativa de SQL CE creada en Mango tiene su información almacenada en el almacenamiento aislado del dispositivo. Puedes aprender mas acerca del almacenamiento aislado <a href="http://msdn.microsoft.com/en-us/library/ff402541(v=VS.92).aspx">aquí</a>. Microsof tampoco creó nuevas formas de trabajar con la información en el teléfono y en su lugar implementó LINQ a SQL para todas las operaciones de las bases de datos. LINQ a SQL es usado para hacer todas la funciones para la aplicación cuando se trate de manejar la información incluyendo crear la información, llenar la base de datos, obtener información u finalmente guardar y borrarla.</p>
<p>Un buen tutorial de LINQ para SQL esta <a href="http://msdn.microsoft.com/en-us/library/bb425822.aspx">aquí</a> en MSDN.</p>
<p><strong><span style="font-size: large;">Ajustar una base de datos local para tu aplicación de mango</span></strong></p>
<p>Como todos los puntos de inicio para Windows Phone 7, empezaremos creando un proyecto de Windows Phone Databound Application dentro de Visual Studio 2010.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image002_thumb4.jpg"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border-width: 0px;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image002_thumb4_thumb.jpg" alt="clip_image002_thumb4" width="522" height="361" border="0" /></a></p>
<p>Pudimos haber comenzado con una aplicación sencilla de Windows Phone, pero me gustan los elementos adicionales que te dan para permitir que tu aplicación tenga mejores patrones de diseño como Model-View-ViewModel (MVVM).</p>
<p>A continuación actualizaremos el MainPage del proyecto para permitir que la información sea agregada a la sabes de datos. Nuestra información de ejemplo estará coleccionando ideas que todos tenemos y necesitamos  recordar. No iremos a gran detalle acerca del diseño del MainPage pero aquí está el XAML para obtener la apariencia para nuestro colector de ideas.</p>
<p>&lt;phone:PhoneApplicationPage<br />
x:Class=&#8221;Dia_30_BaseDatosLocal.MainPage&#8221;<br />
xmlns=&#8221;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#8221;<br />
xmlns:x=&#8221;http://schemas.microsoft.com/winfx/2006/xaml&#8221;<br />
xmlns:phone=&#8221;clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone&#8221;<br />
xmlns:shell=&#8221;clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone&#8221;<br />
xmlns:d=&#8221;http://schemas.microsoft.com/expression/blend/2008&#8243;<br />
xmlns:mc=&#8221;http://schemas.openxmlformats.org/markup-compatibility/2006&#8243;<br />
mc:Ignorable=&#8221;d&#8221; d:DesignWidth=&#8221;480&#8243; d:DesignHeight=&#8221;768&#8243;<br />
d:DataContext=&#8221;{d:DesignData SampleData/MainViewModelSampleData.xaml}&#8221;<br />
FontFamily=&#8221;{StaticResource PhoneFontFamilyNormal}&#8221;<br />
FontSize=&#8221;{StaticResource PhoneFontSizeNormal}&#8221;<br />
Foreground=&#8221;{StaticResource PhoneForegroundBrush}&#8221;<br />
SupportedOrientations=&#8221;Portrait&#8221;  Orientation=&#8221;Portrait&#8221;<br />
shell:SystemTray.IsVisible=&#8221;True&#8221;&gt;</p>
<p>&lt;Grid x:Name=&#8221;LayoutRoot&#8221; Background=&#8221;Transparent&#8221;&gt;<br />
&lt;Grid.RowDefinitions&gt;<br />
&lt;RowDefinition Height=&#8221;Auto&#8221;/&gt;<br />
&lt;RowDefinition Height=&#8221;*&#8221;/&gt;<br />
&lt;/Grid.RowDefinitions&gt;</p>
<p>&lt;StackPanel x:Name=&#8221;TitlePanel&#8221; Grid.Row=&#8221;0&#8243; Margin=&#8221;12,17,0,28&#8243;&gt;<br />
&lt;TextBlock x:Name=&#8221;ApplicationTitle&#8221; Text=&#8221;LA LIGA SILVERLIGHT&#8221; Style=&#8221;{StaticResource PhoneTextNormalStyle}&#8221;/&gt;<br />
&lt;TextBlock x:Name=&#8221;PageTitle&#8221; Text=&#8221;base datos&#8221; Margin=&#8221;9,-7,0,0&#8243; Style=&#8221;{StaticResource PhoneTextTitle1Style}&#8221;/&gt;<br />
&lt;/StackPanel&gt;</p>
<p>&lt;Grid x:Name=&#8221;ContentPanel&#8221; Grid.Row=&#8221;1&#8243; Margin=&#8221;12,0,12,0&#8243;&gt;<br />
&lt;Grid.RowDefinitions&gt;<br />
&lt;RowDefinition Height=&#8221;Auto&#8221; /&gt;<br />
&lt;RowDefinition Height=&#8221;Auto&#8221; /&gt;<br />
&lt;/Grid.RowDefinitions&gt;</p>
<p>&lt;ListBox x:Name=&#8221;lstIdeas&#8221; ItemsSource=&#8221;{Binding IdeaItems}&#8221;<br />
Grid.Row=&#8221;0&#8243; Margin=&#8221;12, 0, 12, 0&#8243; Width=&#8221;440&#8243;&gt;<br />
&lt;ListBox.ItemTemplate&gt;<br />
&lt;DataTemplate&gt;<br />
&lt;Grid HorizontalAlignment=&#8221;Stretch&#8221; Width=&#8221;440&#8243;&gt;<br />
&lt;Grid.ColumnDefinitions&gt;<br />
&lt;ColumnDefinition Width=&#8221;50&#8243; /&gt;<br />
&lt;ColumnDefinition Width=&#8221;*&#8221; /&gt;<br />
&lt;ColumnDefinition Width=&#8221;100&#8243; /&gt;<br />
&lt;/Grid.ColumnDefinitions&gt;<br />
&lt;CheckBox IsChecked=&#8221;{Binding IsComplete, Mode=TwoWay}&#8221; Grid.Column=&#8221;0&#8243; VerticalAlignment=&#8221;Center&#8221;/&gt;<br />
&lt;TextBlock Text=&#8221;{Binding ItemName}&#8221; FontSize=&#8221;{StaticResource PhoneFontSizeLarge}&#8221; Grid.Column=&#8221;1&#8243; VerticalAlignment=&#8221;Center&#8221;/&gt;<br />
&lt;Button Grid.Column=&#8221;2&#8243; x:Name=&#8221;btnBorrarIdea&#8221; BorderThickness=&#8221;0&#8243; Margin=&#8221;0&#8243; Click=&#8221;btnBorrar_Click&#8221;&gt;<br />
&lt;Image Source=&#8221;appbar.delete.rest.png&#8221;/&gt;<br />
&lt;/Button&gt;<br />
&lt;/Grid&gt;<br />
&lt;/DataTemplate&gt;<br />
&lt;/ListBox.ItemTemplate&gt;<br />
&lt;/ListBox&gt;</p>
<p>&lt;Grid Grid.Row=&#8221;1&#8243;&gt;<br />
&lt;Grid.ColumnDefinitions&gt;<br />
&lt;ColumnDefinition Width=&#8221;*&#8221; /&gt;<br />
&lt;ColumnDefinition Width=&#8221;Auto&#8221; /&gt;<br />
&lt;/Grid.ColumnDefinitions&gt;<br />
&lt;TextBox x:Name=&#8221;txtNuevaIdea&#8221; Grid.Column=&#8221;0&#8243; Text=&#8221;agregar nueva idea&#8221;<br />
FontFamily=&#8221;{StaticResource PhoneFontFamilyLight}&#8221; GotFocus=&#8221;txtNuevaIdea_GotFocus&#8221;/&gt;<br />
&lt;Button Content=&#8221;+&#8221; Grid.Column=&#8221;1&#8243; x:Name=&#8221;btnAgregar&#8221; Click=&#8221;btnAgregar_Click&#8221; FontSize=&#8221;29.333&#8243;/&gt;<br />
&lt;/Grid&gt;<br />
&lt;/Grid&gt;<br />
&lt;/Grid&gt;</p>
<p>&lt;/phone:PhoneApplicationPage&gt;</p>
<p>También para dejar que nuestra aplicación se compile y corra sin hacer nada el código de abajo será agregado en el archivo MainPage.xaml.cs dentro de la clase MainPage y después del constructor.</p>
<p>private void txtNuevaIdea_GotFocus(object sender, RoutedEventArgs e)<br />
{<br />
txtNuevaIdea.Text = String.Empty;<br />
}</p>
<p>private void btnAgregar_Click(object sender, RoutedEventArgs e)<br />
{</p>
<p>}</p>
<p>protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)<br />
{<br />
base.OnNavigatedFrom(e);<br />
}</p>
<p><strong><span style="font-size: large;">Trabajar con el Data Context</span></strong></p>
<p>El Data Context es el punto que nos permite trabajar con la base de datos y también con las clases proxy que representan las tablas de nuestra base de datos. El Data Context es también una clase y trabaja contra un número de  clases de tipo“Objeto CLR viejo y plano” (POCO) que fueron creadas para este proyecto. Los objetos de tipo tabla que representan las tablas de nuestra base de datos contendrán una colección de entidades para cada registro de la tabla almacenado en la base de datos, Otros detalles acerca de nuestra base de datos están también dados por medio del Data Context tales como llaves primarias y mapas de asociación entre tablas.</p>
<p>Solo un recordatorio de que esta base de datos no tiene conexión con el SQL Server 2008 R2 que esta corriendo localmente en tu PC o un servidor en tu proveedor de hosting o compañia y solo mantiene la información en tu dispositivo.</p>
<p>No hay mucho de la clase de tipo DataContext ademas de la cadena de conexión con la que estamos familiarizados en desarrollo y propiedades de cada tabla que existen en nuestra base de datos. Piensa en el DataContext como el “eje” para la información de tu aplicación. El código para el Data Context de nuestra aplicación de ejemplo es el siguiente:</p>
<p>public class IdeaDataContext : DataContext<br />
{<br />
public static string cadenaConexion = &#8220;Data Source=isostore:/Ideas.sdf&#8221;;<br />
public IdeaDataContext(string cadenaConex): base(cadenaConex)<br />
{ }</p>
<p>public Table&lt;IdeaItem&gt; ElementoIdea;<br />
}</p>
<p>Nota que el tipo ElementoIdea estará detallado en la siguiente sección que cubre la creación de la base de datos.</p>
<p><strong><span style="font-size: large;">Crear la base de datos</span></strong></p>
<p>A diferencia de las aplicaciones que corren desde tu PC o en IIS 7, las bases de datos de Windows Phone deben ser creadas e inicializadas en la primera instancia de tu aplicación. Primero veremos como crear las clases que representarán las tablas de nuestra base de datos y después mirar la inicialización de la base de datos,</p>
<p>Por cada tabla que necesitamos que sea creada y expuesta a través de nuestra base de datos en nuestro teléfono para la aplicación, necesitamos crear un nuevo POCO. Dado que etas clases representan las entidades que estarán almacenadas en la base de datos, vamos a llamarlas clases de entidad. Para iniciar la clase de entidad debemos adherir dos interfaces.</p>
<p>* INotifyPropertyChanged – La interfaz INotifyPropertyChanged es usada para notificar a los clientes, típicamente enlazando que una propiedad ha cambiado.</p>
<p>* InotifyPropertyChanged – La interfaz INotifyPropertyChanging es usada para notificar a los clientes, típicamente enlazando que una propiedad esta cambiando.</p>
<p>Estas dos interfaces permitirán a cada entidad notificar al Data Context que esta en proceso de cambiar o esta cambiando. Esto después será reflejado en las vistas XAML de nuestra aplicación por medio del enlazado que hemos hecho.</p>
<p>Esta clase de entidad debe ser anotada como una tabla para permitir al DataContext saber como trabajar con ella. Una clase de entidad debe tener también propiedades públicas y privadas para cada propiedad de la Entidad también como tener la propiedad privada anotada para dar metadatos valiosos acera de la propiedad de la entidad (a.k.a. la columna de la base de datos). Recuerda tener las propiedades de la llave primaria para cada una de tus clases de entidad.</p>
<p>Debajo esta la clase de entidad ElementoIdea que estará localizada en la tabla ElementoIdea referenciada en el DataContext que creamos antes.</p>
<p>[Table]<br />
public class IdeaItem : INotifyPropertyChanged, INotifyPropertyChanging<br />
{<br />
private int idElementoIdea;<br />
private string nombreElemento;<br />
private bool estaAcompletada;</p>
<p>public event PropertyChangedEventHandler PropertyChanged;<br />
public event PropertyChangingEventHandler PropertyChanging;</p>
<p>[Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]<br />
public int IdElementoIdea<br />
{<br />
get<br />
{<br />
return idElementoIdea;<br />
}<br />
set<br />
{<br />
if (idElementoIdea != value)<br />
{<br />
NotifyPropertyChanging(&#8220;IdElementoIdea&#8221;);<br />
idElementoIdea = value;<br />
NotifyPropertyChanged(&#8220;IdElementoIdea&#8221;);<br />
}<br />
}<br />
}</p>
<p>[Column]<br />
public string NombreElemento<br />
{<br />
get<br />
{<br />
return nombreElemento;<br />
}<br />
set<br />
{<br />
if (nombreElemento != value)<br />
{<br />
NotifyPropertyChanging(&#8220;NombreElemento&#8221;);<br />
nombreElemento = value;<br />
NotifyPropertyChanged(&#8220;NombreElemento&#8221;);<br />
}<br />
}<br />
}</p>
<p>[Column]<br />
public bool EstaAcompletada<br />
{<br />
get<br />
{<br />
return estaAcompletada;<br />
}<br />
set<br />
{<br />
if (estaAcompletada != value)<br />
{<br />
NotifyPropertyChanging(&#8220;EstaAcompletada&#8221;);<br />
estaAcompletada = value;<br />
NotifyPropertyChanged(&#8220;EstaAcompletada&#8221;);<br />
}<br />
}<br />
}</p>
<p>[Column(IsVersion = true)]<br />
private Binary version;</p>
<p>private void NotifyPropertyChanged(string nombrePropiedad)<br />
{<br />
if (PropertyChanged != null)<br />
{<br />
PropertyChanged(this, new PropertyChangedEventArgs(nombrePropiedad));<br />
}<br />
}</p>
<p>private void NotifyPropertyChanging(string nombrePropiedad)<br />
{<br />
if (PropertyChanging != null)<br />
{<br />
PropertyChanging(this, new PropertyChangingEventArgs(nombrePropiedad));<br />
}<br />
}<br />
}</p>
<p>Finalmente debemos crear la base de datos si esta no existe. Esto lo haremos en el constructor de la aplicación. Encontrarás esto en el archivo App.xaml.cs. El código que será agregado al final del método constructor es como el que sigue.</p>
<p>using (IdeaDataContext baseDatos = new IdeaDataContext(IdeaDataContext.cadenaConexion))<br />
{<br />
if (baseDatos.DatabaseExists() == false)<br />
{<br />
baseDatos.CreateDatabase();<br />
}<br />
}</p>
<p>Ahora tenemos una base de datos que ha sido creada e inicializada en el almacenamiento aislado. Una cosa mas para recordar es que las bases de datos locales en Windows Phone 7 no pueden ser directamente compartidas entre aplicaciones en el teléfono dada la seguridad otorgada por el “sandbox” en el sistema operativo Windows Phone.</p>
<p><strong><span style="font-size: large;">Soporte de LINQ to SQL para Windows Phone Mango</span></strong></p>
<p>El SDK de Windows Phone 7.1 permite algunos, no todos los elementos de LINQ to SQL dentro de Windows Phone. Los siguientes son solo algunos elementos para recordar al trabajar con información y LINQ to SQL en Windows Phone Mango.</p>
<p>* Execute Command no es soportado.</p>
<p>* Los objetos ADO.NET (tales como DataReader) no están soportados.</p>
<p>* Solo son soportados los tipos de datos de Microsoft SQL Server Compact Edition (SQL CE)</p>
<p>Para obtener mas limitantes y elementos de usar LINQ to SQL en Mango, por favor lee la página de MSDN <a href="http://msdn.microsoft.com/en-us/library/hh202872(v=VS.92).aspx">aquí</a>.</p>
<p><strong><span style="font-size: large;">Obtener Información desde una base de datos local</span></strong></p>
<p>Para obtener información o cualquier trabajo relacionado con la base de datos local, primero debemos crear el DataContext y conectarlo a la base de datos. Esto sucederá en el MainPage por medio de una variable privada para el DataContext, una propiedad de tipo Observable Collection para las ideas en la base de datos y en el constructor del MainPage como se muestra aquí.</p>
<p>private IdeaDataContext ideaDB;</p>
<p>private ObservableCollection&lt;IdeaItem&gt; listaIdeas;<br />
public ObservableCollection&lt;IdeaItem&gt; ListaIdeas<br />
{<br />
get<br />
{<br />
return listaIdeas;<br />
}<br />
set<br />
{<br />
if (listaIdeas != value)<br />
{<br />
listaIdeas = value;<br />
NotifyPropertyChanged(&#8220;IdeaItems&#8221;);<br />
}<br />
}<br />
}</p>
<p>public MainPage()<br />
{<br />
InitializeComponent();<br />
ideaDB = new IdeaDataContext(IdeaDataContext.cadenaConexion);</p>
<p>this.DataContext = this;<br />
}</p>
<p>Para obtener nuestras ideas localizadas en la base de datos local usaremos LINQ to SQL para consultar y obtener la colección de la base de datos vía el DataContext.</p>
<p>protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)<br />
{<br />
var ideaEnBaseDatos = from IdeaItem idea in ideaDB.ElementoIdea<br />
select idea;</p>
<p>ListaIdeas = new ObservableCollection&lt;IdeaItem&gt;(ideaEnBaseDatos);<br />
base.OnNavigatedTo(e);<br />
}</p>
<p>Las ideas ahora están enlazadas y reflejadas en el MainPage.xaml .</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0033.png"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border: 0px none;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0033_thumb.png" alt="clip_image0033" width="241" height="401" border="0" /></a></p>
<p><strong><span style="font-size: large;">Almacenar información a la base de datos local</span></strong></p>
<p>Finalmente crearemos la forma de guardar nuestra información de ideas a la base de datos local. No enviaremos las ideas a la base de datos a menos de que necesitemos incrementar el rendimiento. Mantendremos todas las ideas en la colección local que creamos como una propiedad del MainPage (ListaIdeas). La adición de nuevas ideas a la base de datos local se efectuará cuando el botón de agregar idea cuando esta sea agregadas a la colección ListaIdeas.</p>
<p>private void btnAgregar_Click(object sender, RoutedEventArgs e)<br />
{<br />
IdeaItem nuevaIdea = new IdeaItem { NombreElemento = txtNuevaIdea.Text };<br />
ListaIdeas.Add(nuevaIdea);<br />
ideaDB.ElementoIdea.InsertOnSubmit(nuevaIdea);<br />
}</p>
<p>Como lo mencioné antes, las ideas coleccionadas desde el usuario no estarán almacenadas en la base de datos hasta que la aplicación se haya salido del MainPage ya sea que salga de la aplicación o que la aplicación se mueva a una nueva página. El código para el evento es el siguiente.</p>
<p>protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)<br />
{<br />
base.OnNavigatedFrom(e);<br />
ideaDB.SubmitChanges();<br />
}</p>
<p><strong><span style="font-size: large;">En resumen</span></strong></p>
<p>¡Eso es todo! Ahora tienes una forma simple de crear, almacenar y obtener información relacional en tus aplicaciones Windows Phone. ¿Cómo la piensas usar?</p>
<p>Para descargar este ejemplo entero de la aplicación de Windows Phone usando los conceptos aquí mostrados, puedes hacerlo en el enlace siguiente.</p>
<p><a href="http://aminespinoza.com/materialBlog/31dias/Dia_30_BaseDatosLocal.zip">Puedes descargar el código aquí.</a></p>
<p>Mañana el último artículo de la serie. cubriremos las mejores prácticas para promocionar tus aplicaciones de Windows Phone. Nos vemos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2011/12/da-30-base-de-datos-local/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>D&#237;a 29: Globalizaci&#243;n</title>
		<link>http://blogs.ligasilverlight.com/2011/12/da-29-globalizacin/</link>
		<comments>http://blogs.ligasilverlight.com/2011/12/da-29-globalizacin/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 19:52:11 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3513</guid>
		<description><![CDATA[Esta es una traducción de Day 29: Globalization, puedes encontrar el artículo aquí en su versión original en inglés. Globalización contra Localización Las personas comúnmente se confunden cuando se discute acerca de globalización y localización. Ambas tratan de lidiar con presentar contenido de una manera amigable por todo el mundo, pero la distinción es que la globalización trabaja con el formato de los elementos, tales como el tiempo, fechas, tipos de moneda y números en la forma en la que el usuario este familiarizado considerando, mientras que la localización involucra desplegar el idioma nativo del usuario en la interfaz. Este artículo cubrirá el uso de ambas técnicas para crear aplicaciones que puedan alcanzar una gran audiencia con la interfaz de usuario mas amigable posible. Estaremos creando una aplicación simple durante el curso de este artículo que soporte a ambas, globalización y localización. Esta aplicación rápidamente genera un mensaje de correo electrónico que permite saber al contacto que estas retrasado para una reunión. Configurar soporte para la localización Después de crear un nuevo Windows Phone con C#, necesitaremos hacer algunas cosas para configurar la aplicación para que soporte la localización. Definir un lenguaje neutral para el ensamblado Dado que estamos localizando [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jeffblankenburg.com/2011/11/29/31-days-of-mango-day-29-globalization/">Esta es una traducción de Day 29: Globalization, puedes encontrar el artículo aquí en su versión original en inglés.</a></p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia29.png"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border-width: 0px;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia29_thumb.png" alt="dia29" width="600" height="75" border="0" /></a></p>
<p><strong><span style="font-size: large;">Globalización contra Localización</span></strong></p>
<p>Las personas comúnmente se confunden cuando se discute acerca de globalización y localización. Ambas tratan de lidiar con presentar contenido de una manera amigable por todo el mundo, pero la distinción es que la globalización trabaja con el formato de los elementos, tales como el tiempo, fechas, tipos de moneda y números en la forma en la que el usuario este familiarizado considerando, mientras que la localización involucra desplegar el idioma nativo del usuario en la interfaz. Este artículo cubrirá el uso de ambas técnicas para crear aplicaciones que puedan alcanzar una gran audiencia con la interfaz de usuario mas amigable posible.</p>
<p>Estaremos creando una aplicación simple durante el curso de este artículo que soporte a ambas, globalización y localización. Esta aplicación rápidamente genera un mensaje de correo electrónico que permite saber al contacto que estas retrasado para una reunión.</p>
<p><strong><span style="font-size: large;">Configurar soporte para la localización</span></strong></p>
<p>Después de crear un nuevo Windows Phone con C#, necesitaremos hacer algunas cosas para configurar la aplicación para que soporte la localización.</p>
<p><strong>Definir un lenguaje neutral para el ensamblado</strong></p>
<p>Dado que estamos localizando nuestra aplicación, necesitamos decirle al proyecto cual es la localización preestablecida. Para hacer esto, vamos a  ir cuadro de diálogo de las propiedades del proyecto y clic en “Assembly Information” y después especificar el idioma neutral para nuestra aplicación – eso es, el lenguaje que será utilizado si no hay recursos locales definidos que coincidan con los del usuario. Para este ejemplo, ajustaremos el lenguaje neutral en “English (United States)”.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0024.jpg"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border-width: 0px;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0024_thumb.jpg" alt="clip_image0024" width="262" height="250" border="0" /></a></p>
<p>Indicando la cultura soportada</p>
<p>A continuación necesitamos decirle al proyecto que lenguajes están soportados. Visual Studio no expone esta parte de información del proyecto, pero podemos editarla fácilmente. Asegúrate de guardar todos los cambios de modo que todos los cambios al .csproj estén guardados antes de editar el archivo. Después ve a la carpeta del proyecto en el disco  dando clic derecho en el proyecto y selecciona “Open Folder in Windows Explorer”. Selecciona el .csproj para tu aplicación (se cuidadoso de no seleccionar el archivo .csproj.user) y ábrelo con el bloc de notas o tu editor de textos favorito (N. del T. una amplia recomendación es <a href="http://notepad-plus-plus.org/">Notepad++</a>).</p>
<p>Busca el elemento &lt;SupportedCultures&gt;&lt;/SupportedCultures&gt; y agrega el código de las culturas que deseas soportar separando cada cultura por un punto y coma. Esta lista no deberá incluit el lenguaje neutral del ensamblado. Visita <a href="http://msdn.microsoft.com/en-us/library/hh202918%28v=VS.92%29.aspx">http://msdn.microsoft.com/en-us/library/hh202918(v=VS.92).aspx</a> para una lista de culturas soportadas por varias versiones de Windows Phone. Para los propósitos de este ejemplo, estaremos soportando Español, Chino simplificado y Francés, además del el preestablecido que fue el Inglés, así que nuestro nodo de SupportedCultures se verá así.</p>
<p>&lt;SupportedCultures&gt;es-ES;zh-CN;fr-FR&lt;/SupportedCultures&gt;</p>
<p>Después de hacer tus cambios, guarda el archivo .csproj y ve de regreso a Visual Studio. Presiona “recargar” cuando Visual Studio te diga que el proyecto ha cambiado para que estos cambios puedan tener efecto.</p>
<p><strong><span style="font-size: large;">Crear un archivo de recursos base</span></strong></p>
<p>Ahora que tenemos una cultura preestablecida y una lista de otras mas soportadas, podemos empezar a definir los recursos específicos para cada cultura. Empezaremos agregando un archivo para los recursos preestablecidos y movernos para agregar recursos para culturas específicas. Como una buena práctica de localización, cualquier cadena que el usuario vea deberá ser incluida en estos archivos en lugar de hacerlas de modo estático en XAML o en un archivo de código.</p>
<p>Necesitamos agregar un archivo de recursos al proyecto que defina las cadenas de lenguaje para la aplicación. Para hacer esto, daremos clic derecho en nuestro proyecto en el explorador de soluciones y elegimos “Add –&gt; New Item”. Desde aquí, agregaremos un archivo de recursos. Puedes llamarlo como gustes, para este ejemplo lo llamaremos Cadenas.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image004_thumb5.jpg"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border-width: 0px;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image004_thumb5_thumb.jpg" alt="clip_image004_thumb5" width="518" height="359" border="0" /></a></p>
<p>Agregar el archivo nos lleva al editor de recursos para este reecurso. El editor contiene una tabla con tres columnas, Name, Value y Comment. Nombre es el nombre auto generado por code-behind para el recurso y sirve como clave única para identificar un recurso. Value es el valor específico de la cultura para este recurso y es lo que usaremos para almacenar el texto que el usuario vea. Comment no es usado por la aplicación, pero es útil para señalar para que usamos tal recurso y donde lo usamos, además puede ayudar demasiado durante la traducción a otros lenguajes. También verás un modificador de acceso en la cima del editor de recursos. Este es interno de forma preestablecida pero necesitamos cambiarlo a público de modo que podamos enlazar estos valores mas adelante.</p>
<p>Aquí esta nuestro ejemplo después de agregar las cadenas apropiadas y cambiar el modificador de acceso a público:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image006_thumb3.jpg"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border-width: 0px;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image006_thumb3_thumb.jpg" alt="clip_image006_thumb3" width="518" height="324" border="0" /></a></p>
<p>Crear archivos de recursos específicos para cada cultura</p>
<p>Ahora que tenemos nuestros recursos preestablecidos definidos, podemos iniciar a crear recursos personalizados para el proyecto. Empezaremos definiendo los recursos en español para esta aplicación. Presiona y arrastra el archivo cadenas.resx en el explorador de soluciones para crear una copia del archivo y después renómbralo como “CopiaDeCadenas.resx” a “Cadenas.es-ES.resx” (es-ES es el código de cultura para el español). Es importante que este nuevo archivo inicie con el mismo nombre como este nuevo archivo inicie con el mismo nombre que el previo  pero teniendo la localización adecuada al final de este o el archivo no podrá ser utilizado de manera adecuada para mapear la localización adecuada. Una vez que has renombrado tal archivo, abre el archivo Cadenas.es-ES.resx y modifica la columna Value para cada recurso. Una buena fuente para traducciones es Bing Translator, además de que debes verificar las traducciones con alguien que entienda el lenguaje antes de desplegar. Es importante que la columna Name coincida entre los archivos de recursos para que los recursos puedan ser mapeados apropiadamente.</p>
<p>Una vez  que has terminado con esto, sigue el mismo procedimiento para cualquier localidad adicional que desees soportar siendo cuidadoso de que todos los recursos tienen un modificador de acceso público, mantén el mismo nombre y contén el código de cultura apropiado. Es también importante notar que el editor de recursos puede no desplegar ciertos conjuntos de caracteres extranjeros correctamente cuando copies y pegues desde el traductor de Bing al editor de recursos, pero estos caracteres se verán bien en el dispositivo o emulador.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image008_thumb3.jpg"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border-width: 0px;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image008_thumb3_thumb.jpg" alt="clip_image008_thumb3" width="518" height="313" border="0" /></a></p>
<p><strong><span style="font-size: large;">Crear una interfaz de usuario no localizada</span></strong></p>
<p>Ahora que tenemos un conjunto de cadenas localizadas, mejor comenzamos a crear la interfaz en donde podamos usarlas. Nuestra aplicación de ejemplo tendrá algunos campos, una barra de aplicación y un encabezado estándar. Dado que queremos incluir datos en este ejemplo para demostrar la globalización, haremos referencia al Toolkit de Silverlight para Windows Phone y usar el control de TimePicker contenido en ese ensamblado. Este artículo no irá hasta el detalle de descargar, instalar y hacer referencia al Toolkit, pero este está disponible y nos será útil.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0102.jpg"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border: 0px;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0102_thumb.jpg" alt="clip_image0102" width="214" height="389" border="0" /></a></p>
<p>Nuestro MainPage no localizado se verá así.</p>
<pre class="brush: xml">
&lt;phone:phoneapplicationpage x:Class=&quot;Dia_29_Globalizacion.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:phone=&quot;clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone&quot;
xmlns:shell=&quot;clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone&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; d:DesignWidth=&quot;480&quot; d:DesignHeight=&quot;696&quot;
FontFamily=&quot;{StaticResource PhoneFontFamilyNormal}&quot;
FontSize=&quot;{StaticResource PhoneFontSizeNormal}&quot;
xmlns:Controls=&quot;clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit&quot;
Foreground=&quot;{StaticResource PhoneForegroundBrush}&quot;
SupportedOrientations=&quot;Portrait&quot; Orientation=&quot;Portrait&quot;
shell:SystemTray.IsVisible=&quot;True&quot;&gt;

&lt;grid x:Name=&quot;LayoutRoot&quot; Background=&quot;Transparent&quot;&gt;
&lt;/grid&gt;&lt;grid .RowDefinitions&gt;
&lt;rowdefinition Height=&quot;Auto&quot;/&gt;
&lt;rowdefinition Height=&quot;*&quot;/&gt;
&lt;/grid&gt;

&lt;stackpanel x:Name=&quot;TitlePanel&quot; Grid.Row=&quot;0&quot; Margin=&quot;12,17,0,28&quot;&gt;
&lt;textblock x:Name=&quot;ApplicationTitle&quot; Text=&quot;{Binding Source={StaticResource Cadenas}, Path=Resources}&quot;
Style=&quot;{StaticResource PhoneTextNormalStyle}&quot; /&gt;
&lt;textblock x:Name=&quot;PageTitle&quot; Text=&quot;{Binding Resources.PageTitleSendMessage, Source={StaticResource Cadenas}}&quot;
Margin=&quot;9,-7,0,0&quot; Style=&quot;{StaticResource PhoneTextTitle1Style}&quot; TextWrapping=&quot;Wrap&quot; /&gt;
&lt;/stackpanel&gt;

&lt;scrollviewer Margin=&quot;12,0,12,0&quot; Grid.Row=&quot;1&quot;&gt;
&lt;stackpanel x:Name=&quot;ContentPanel&quot;&gt;
&lt;textblock TextWrapping=&quot;Wrap&quot; Text=&quot;{Binding Resources.FieldTo, Source={StaticResource Cadenas}}&quot; Style=&quot;{StaticResource PhoneTextSubtleStyle}&quot; /&gt;
&lt;textbox x:Name=&quot;txtPara&quot; TextWrapping=&quot;Wrap&quot; InputScope=&quot;EmailUserName&quot; /&gt;
&lt;hyperlinkbutton x:Name=&quot;btnElegirContacto&quot; Content=&quot;{Binding Resources.LinkChooseContact, Source={StaticResource Cadenas}}&quot;
HorizontalContentAlignment=&quot;Left&quot; Foreground=&quot;{StaticResource PhoneAccentBrush}&quot;
Click=&quot;btnElegirContacto_Click&quot; Margin=&quot;{StaticResource PhoneVerticalMargin}&quot; /&gt;
&lt;textblock TextWrapping=&quot;Wrap&quot; Text=&quot;{Binding Resources.FieldSubject, Source={StaticResource Cadenas}}&quot;
Style=&quot;{StaticResource PhoneTextSubtleStyle}&quot; /&gt;
&lt;textbox x:Name=&quot;txtTitulo&quot; TextWrapping=&quot;Wrap&quot; Text=&quot;{Binding Resources.AppTitle, Source={StaticResource Cadenas}}&quot;
InputScope=&quot;Text&quot; /&gt;
&lt;checkbox x:Name=&quot;chkInluirJustificacion&quot; Content=&quot;{Binding Resources.CheckIncludeAReason, Source={StaticResource Cadenas}}&quot; /&gt;
&lt;textbox x:Name=&quot;txtRazon&quot; TextWrapping=&quot;Wrap&quot; Text=&quot;{Binding Resources.DefaultReason, Source={StaticResource Cadenas}}&quot;
InputScope=&quot;Text&quot; IsEnabled=&quot;{Binding IsChecked, ElementName=chkInluirJustificacion}&quot; /&gt;
&lt;checkbox x:Name=&quot;chkIncluirETA&quot; Content=&quot;{Binding Resources.CheckShouldArriveBy, Source={StaticResource Cadenas}}&quot; /&gt;
&lt;controls:timepicker x:Name=&quot;timeLlegada&quot;
ValueStringFormat=&quot;{}{0:t}&quot;
IsEnabled=&quot;{Binding IsChecked, ElementName=chkIncluirETA}&quot;
Margin=&quot;0,-12,0,0&quot; /&gt;
&lt;checkbox x:Name=&quot;chkIncluirDiagnostico&quot;
Content=&quot;{Binding Resources.CheckIncludeDiagnostics, Source={StaticResource Cadenas}}&quot; /&gt;
&lt;/stackpanel&gt;
&lt;/scrollviewer&gt;

&lt;/phone:phoneapplicationpage&gt;&lt;phone:phoneapplicationpage .ApplicationBar&gt;
&lt;shell:applicationbar IsMenuEnabled=&quot;False&quot;&gt;
&lt;shell:applicationbariconbutton x:Name=&quot;btnEmail&quot; IconUri=&quot;/Imagenes/email.png&quot; IsEnabled=&quot;True&quot; Text=&quot;send&quot; Click=&quot;btnEmail_Click&quot; /&gt;
&lt;/shell:applicationbar&gt;
&lt;/phone:phoneapplicationpage&gt;
</pre>
<p>Obviamente este XAML contiene un número de cadenas estáticas las cuales no queremos para una aplicación localizable. Necesitamos que la interfaz de usuario tome ventaja de las cadenas de recursos.</p>
<p><strong><span style="font-size: large;">Obtener Cadenas de recursos en XAML</span></strong></p>
<p>Afortunadamente el diseñador de recursos con el que hemos estado trabajando tiene clases automáticamente generadas para acceder a estos recursos. Desafortunadamente, no podemos enlazar fácilmente estos en XAML por la clase de cadenas auto generadas que tiene un constructor interno y propiedades estáticas así que necesitaremos crear un “envoltorio” de recursos que exponga estos en una forma que podamos enlazar.</p>
<p>Agrega una nueva clase al proyecto llamada ProveedorCadenas.cs e incluye el siguiente código.</p>
<p>[crayon]</p>
<p>namespace Dia_29_Globalizacion<br />
{<br />
public class ProveedorCadenas<br />
{<br />
private readonly Cadenas recursos = new Cadenas();</p>
<p>public Cadenas Resources<br />
{<br />
get { return recursos; }<br />
}<br />
}<br />
}</p>
<p>[/crayon]</p>
<p>Ahora ve hacia el archivo de App.xaml y agrega un nuevo recurso a la aplicación con el calificador adecuado de espacio de nombres. Este recurso estará disponible a través de la aplicación entera y te dará un fácil acceso a la localización de cadenas. Cuando termines, tu App.xaml se deberá ver así.</p>
<p>&lt;Application<br />
x:Class=&#8221;Dia_29_Globalizacion.App&#8221;<br />
xmlns=&#8221;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#8221;<br />
xmlns:x=&#8221;http://schemas.microsoft.com/winfx/2006/xaml&#8221; xmlns:local=&#8221;clr-namespace:Dia_29_Globalizacion&#8221;<br />
xmlns:phone=&#8221;clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone&#8221;<br />
xmlns:shell=&#8221;clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone&#8221;&gt;</p>
<p>&lt;Application.Resources&gt;<br />
&lt;local:ProveedorCadenas x:Key=&#8221;Cadenas&#8221; /&gt;<br />
&lt;/Application.Resources&gt;</p>
<p>&lt;Application.ApplicationLifetimeObjects&gt;<br />
&lt;shell:PhoneApplicationService<br />
Launching=&#8221;Application_Launching&#8221; Closing=&#8221;Application_Closing&#8221;<br />
Activated=&#8221;Application_Activated&#8221; Deactivated=&#8221;Application_Deactivated&#8221;/&gt;<br />
&lt;/Application.ApplicationLifetimeObjects&gt;</p>
<p>&lt;/Application&gt;</p>
<p>Ahora que hemos definido nuestro StringProvider como un recurso, podemos enlazarlo al MainPage. En este caso estamos enlazando a la sub propiedad de la propiedad de Reosurces representando el nombre del recurso como lo definimos antes en la colección de recursos y usando el objeto de  tipo ProveedorCadenas  como una fuente de enlazado. Por ejemplo, el título de nuestra aplicación se vuelve:</p>
<p>&lt;TextBlock x:Name=&#8221;ApplicationTitle&#8221; Text=&#8221;{Binding Source={StaticResource Cadenas}, Path=Resources}&#8221; Style=&#8221;{StaticResource PhoneTextNormalStyle}&#8221; /&gt;</p>
<p>Ambos, tanto Blend como Visual Studio deberán reconocar este enlazado y desplegar la cadena de lenguaje neutral (el valor en Cadenas.resx) en el diseñador si el proyecto ha sido compilado desde que los recursos fueron agregados.</p>
<p>Cuando creas aplicaciones globalizadas, ten cuidado de que muchas cadenas de lenguajes serán mayores de lo que es en el idioma preestablecido. Dado esto, es importante que ajustes la propiedad TextWrapping=&#8221;Wrap&#8221;  donde sea aplicable y usa un diseño flexible de estructuras de diseño como ScrollViewers y StackPanels que puedan adaptarse a contenido multi líneas cuando sea necesario. Dado el potencialmente largo recurso de las cadenas, es recomendable ajustar la propiedad SupportedOrientations=&#8221;PortraitOrLandscape&#8221; en la página cuando sea apropiado.</p>
<p>Es también importante estar al pendiente de que no todas las localidades soportan diferentes fuentes. Tu mejor apuesta en el caso de localización de aplicaciones es evitar las fuentes manualmente especificada o personalización de fuentes y en su lugar confiar en las fuentes ya creadas. Visita <a href="http://msdn.microsoft.com/en-us/library/hh202920%28v=VS.92%29.aspx">http://msdn.microsoft.com/en-us/library/hh202920(v=VS.92).aspx</a> para mas información.</p>
<p><strong><span style="font-size: large;">Referirse a cadenas localizadas en C#</span></strong></p>
<p>Este enfoque funcionará para la mayoría de las cadenas, pero las guías de diseño Metro requieren que el título de la aplicación en la cima de la página esté en mayúsculas y nuestra cadena en el archivo de recursos usa mayúsculas capitales. Podríamos definir un nuevo recurso solo para la etiqueta de título o escribir un convertidor de valores de tipo Uppercase para el enlazado, pero en su lugar solo vamos a ajustar el título en el code behind para poder demostrar el acceso a recursos localizados desde el código al agregar la siguiente línea en el constructor de tu MainPage:</p>
<p>[crayon]</p>
<p>txtTituloApp.Text = Cadenas.AppTitle.ToUpper(CultureInfo.CurrentCulture);</p>
<p>[/crayon]</p>
<p><strong>Localizar la barra de aplicacón</strong></p>
<p>Los elementos de la barra de aplicación actualmente no soportan el enlazado de datos dado que ellos no son realmente controles de Silverlight personalizables. En su lugar, tendremos que ajustar manualmente el texto de nuestro ApplicationBarIconButton en el code behind al referirnos a la propiedad auto generada para nuestro nombre de recurso en el recurso de Cadenas como se muestra.</p>
<p>[crayon]</p>
<p>public MainPage()<br />
{<br />
InitializeComponent();</p>
<p>txtTituloApp.Text = Cadenas.AppTitle.ToUpper(CultureInfo.CurrentCulture);</p>
<p>var button = (ApplicationBarIconButton)ApplicationBar.Buttons[0];<br />
button.Text = Cadenas.ButtonSend;</p>
<p>timeLlegada.Value = DateTime.Now.AddMinutes(15);<br />
}</p>
<p>[/crayon]</p>
<p>Ahora tenemos una aplicación localizada. Probar la aplicación en el emulador usando los ajustes para el lenguaje en francés resultará en lo siguiente.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0122.jpg"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border: 0px;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0122_thumb.jpg" alt="clip_image0122" width="244" height="443" border="0" /></a></p>
<p><strong><span style="font-size: large;">Soportar globalización</span></strong></p>
<p>Ahora que tenemos una aplicación localizable, vámonos a la globalización. Dado que la globalización se encarga de los ajustes culturales del usuario respectivo, es importante dar el correcto IFormatProvider a varios métodos de formato de cadenas cuando sea apropiado. Afortunadamente .NET nos da CultureInfo.CurrentCulture el cual representa los ajustes culturales del usuario actual y pueden ser usados para formatear las cadenas para la interfaz del usuario. Cuando se hagan comparaciones estándar o al lidiar con la serialización u otras operaciones que el usuario no ve, es importante usar CultureInfo.InvariantCulture para asegurar que tu aplicación funcione adecuadamente en todos los ajustes de cultura.</p>
<p>A diferencia de la localización, no tienes que hacer nada para soportar una cultura particular e el framework .NET se preocupará de la mayoría de operaciones de formato de cultura por tí. Es también una buena práctica dar el formato apropiado de cadenas y especificar  el CultureInfo,CurrentCulture como un IFormarProvider cuando sea apropiado.</p>
<p>Por ejemplo, el código de nuestra aplicación esta hecho para generar un correo electrónico que haga explícito uso de CurrentCulture y formato de cadenas.</p>
<p>[crayon]</p>
<p>private void btnEmail_Click(object sender, System.EventArgs e)<br />
{<br />
var cuerpo = new StringBuilder();<br />
cuerpo.AppendLine(Cadenas.EmailHeader);</p>
<p>var cultura = CultureInfo.CurrentCulture;<br />
if (chkInluirJustificacion.IsChecked == true)<br />
{<br />
cuerpo.AppendLine();<br />
cuerpo.AppendLine(string.Format(cultura, &#8220;{0}: {1}&#8221;, Cadenas.EmailReason, txtRazon.Text));<br />
}</p>
<p>if (chkIncluirETA.IsChecked == true)<br />
{<br />
cuerpo.AppendLine();<br />
cuerpo.AppendLine(string.Format(cultura, &#8220;{0}: {1}&#8221;, Cadenas.CheckShouldArriveBy, timeLlegada.ValueString));<br />
}</p>
<p>if (chkIncluirDiagnostico.IsChecked == true)<br />
{<br />
cuerpo.AppendLine();<br />
cuerpo.AppendLine(cultura.Name);<br />
cuerpo.AppendLine(string.Format(cultura, &#8220;pi: {0}&#8221;, Math.PI));<br />
cuerpo.AppendLine(string.Format(cultura, &#8220;number: {0}&#8221;, -1));<br />
cuerpo.AppendLine(string.Format(cultura, &#8220;currency: {0:c}&#8221;, 4200.00));<br />
cuerpo.AppendLine(string.Format(cultura, &#8220;date: {0:D}&#8221;, DateTime.Today));<br />
cuerpo.AppendLine(string.Format(cultura, &#8220;time: {0:t}&#8221;, DateTime.Now));<br />
}</p>
<p>if (Microsoft.Devices.Environment.DeviceType == DeviceType.Emulator)<br />
{<br />
MessageBox.Show(cuerpo.ToString());<br />
}<br />
else<br />
{<br />
var tarea = new EmailComposeTask { Subject = txtTitulo.Text, To = txtPara.Text, Body = cuerpo.ToString() };<br />
tarea.Show();<br />
}<br />
}</p>
<p>[/crayon]</p>
<p>Dado que la globalización esta separada de la localización, corre a aplicación en un lenguaje sin cadenas localizadas resultará en valores apropiadamente globalizados así como estos valores alemanes en la imagen de abajo:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0142.jpg"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border: 0px;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0142_thumb.jpg" alt="clip_image0142" width="235" height="427" border="0" /></a></p>
<p>Especificar el formato de cadenas en XAML</p>
<p>Ocasionalmente querrás ser capaz de especificar un formato de cadena en XAML  ya sea como un parámetro para un value converter o como una propiedad en un control previamente creado. En nuestro ejemplo ajustaremos explícitamente el formato de la cadena de nuestro TimePicker para acortar el formato de tiempo para la cultura actual (“t”). Para hacer esto, prefijamos el formato de la cadena con un par de llaves como se muestra aquí.</p>
<p>&lt;Controls:TimePicker x:Name=&#8221;timeLlegada&#8221;<br />
ValueStringFormat=&#8221;{}{0:t}&#8221;<br />
IsEnabled=&#8221;{Binding IsChecked, ElementName=chkIncluirETA}&#8221;<br />
Margin=&#8221;0,-12,0,0&#8243; /&gt;</p>
<p>Es también posible ajustar esto en C# de la siguiente manera.</p>
<p>[crayon]</p>
<p>var info = CultureInfo.CurrentCulture.DateTimeFormat;<br />
timeArrival.ValueStringFormat = &#8220;{0:&#8221; + info.ShortTimePattern + &#8220;}&#8221;;</p>
<p>[/crayon]</p>
<p>O mucho mas preciso.</p>
<p>[crayon]</p>
<p>timeArrival.ValueStringFormat = &#8220;{0:t}&#8221;;</p>
<p>[/crayon]</p>
<p><strong><span style="font-size: large;">Probando diferentes culturas</span></strong></p>
<p>Hasta ahora, hemos creado una aplicación enteramente funcional que soporte la globalización y localización. Quizá te preguntes ahora como probarla en diferentes culturas. Los dispositivos Windows Phone quizá no te permitan cambiar el idioma de despliegue de tu pantalla, pero afortunadamente, Microsoft le dio esta capacidad al emulador.</p>
<p>Para acceder a estos ajustes, ve al menú de aplicaciones del emulador en la pantalla de inicio y escoge la aplicación de ajustes. Desde ahí da clic en el elemento del pivot que dice Region+Lenguaje</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0161.jpg"><img style="padding-left: 0px; padding-right: 0px; padding-top: 0px; border: 0px;" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0161_thumb.jpg" alt="clip_image0161" width="212" height="385" border="0" /></a></p>
<p>Esta pantalla te permite personalizar el lenguaje que se mostrará en el teléfono al ajustar en la lista de selección el lenguaje que quieres mostrar y después dando clic en el enlace de “Da tap aquí para aceptar los cambios”. Al hacerlo, se reiniciará la imagen del SO Windows Phone de tu emulador y aplicará los ajustes de lenguaje y globalización que has elegido. Puede ser confuso usar páginas de ajustes en un lenguaje que no conoces para cambiar los ajustes regionales, así que es una gran idea estudiar el diseño de la pantalla antes de aplicar nuestros cambios. Una vez que el emulador se haya reiniciado al lanzar nuestra aplicación en el emulador podrás verificar que la aplicación respeta el lenguaje del usuario y sus ajustes culturales.</p>
<p><strong><span style="font-size: large;">Consideraciones de publicación</span></strong></p>
<p>Cuando quieras desplegar una aplicación que soporte diferentes lenguajes y culturas, asegúrate de elegir la distribución que coincida con los lenguajes soportados ya sea seleccionando una distribución global al publicar tu aplicación y ajustando los precios o seleccionando lugares individuales que desees soportar.</p>
<p><strong><span style="font-size: large;">En Resumen</span></strong></p>
<p>Ahora sabes como crear una aplicación desde el inicio hasta el final que ofrecerá la mejor experiencia al dar una aplicación propiamente globalizada y localizada para la audiencia global que usa Windows Phone.</p>
<p>Para descargar este ejemplo entero de la aplicación de Windows Phone usando los conceptos aquí mostrados, puedes hacerlo en el enlace siguiente.</p>
<p><a href="http://aminespinoza.com/materialBlog/31dias/Dia_29_Globalizacion.zip">Puedes descargar el código aquí.</a></p>
<p>Mañana, vamos a regresar a la información, y vamos a cubrir como usar una base de datos local en tu aplicación. Nos vemos</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2011/12/da-29-globalizacin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>D&#237;a 28: Biblioteca multimedia</title>
		<link>http://blogs.ligasilverlight.com/2011/12/da-28-biblioteca-multimedia/</link>
		<comments>http://blogs.ligasilverlight.com/2011/12/da-28-biblioteca-multimedia/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 17:25:34 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3481</guid>
		<description><![CDATA[Esta es una traducción de Day 28: Media Library, puedes encontrar el artículo aquí en su versión original en inglés. Hoy vamos a echar un vistazo a la clase MediaLibrary que es parte del espacio de nombres Microsoft.Xna.Framework.Media. Como el nombre sugiere, esta clase nos da acceso a la biblioteca de medios del usuario. Una biblioteca de medios en Windows Phone almacena imágenes y música. Al usar las biblioteca de medios, puedes integrar este contenido en tus propias aplicaciones. Hay muchas razones por las que un desarrollador querría hacer esto. Aquí hay algunas ideas: * Para mostrar al usuario una lista de canciones y dejarlos seleccionar la música de fondo mientras usa tu aplicación. *Permitir al usuario descargar sus imágenes desde un servicio. (por ejemplo Flickr) y agregarlas a la biblioteca. * Usar música de un artista o género desde la biblioteca de medios para hacer sugerencias de otros contenidos similares en los que el usuario podría interesarse. Para mostrar como usar la biblioteca de medios, he creado una aplicación de ejemplo. Esta aplicación enlistará todas las canciones que se encuentren en la biblioteca multimedia del usuario, reproducir una canción cuando el usuario la seleccione y permitirle seleccionar una imagen [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jeffblankenburg.com/2011/11/28/31-days-of-mango-day-28-media-library/">Esta es una traducción de Day 28: Media Library, puedes encontrar el artículo aquí en su versión original en inglés.</a></p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia28.png"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="dia28" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia28_thumb.png" width="600" height="75" /></a></p>
<p>Hoy vamos a echar un vistazo a la clase MediaLibrary que es parte del espacio de nombres Microsoft.Xna.Framework.Media. Como el nombre sugiere, esta clase nos da acceso a la biblioteca de medios del usuario. Una biblioteca de medios en Windows Phone almacena imágenes y música. Al usar las biblioteca de medios, puedes integrar este contenido en tus propias aplicaciones. Hay muchas razones por las que un desarrollador querría hacer esto. Aquí hay algunas ideas:</p>
<p>* Para mostrar al usuario una lista de canciones y dejarlos seleccionar la música de fondo mientras usa tu aplicación.</p>
<p>*Permitir al usuario descargar sus imágenes desde un servicio. (por ejemplo Flickr) y agregarlas a la biblioteca.</p>
<p>* Usar música de un artista o género desde la biblioteca de medios para hacer sugerencias de otros contenidos similares en los que el usuario podría interesarse.</p>
<p>Para mostrar como usar la biblioteca de medios, he creado una aplicación de ejemplo. Esta aplicación enlistará todas las canciones que se encuentren en la biblioteca multimedia del usuario, reproducir una canción cuando el usuario la seleccione y permitirle seleccionar una imagen de la biblioteca para usarla como fondo de pantalla. La aplicación usa la biblioteca multimedia para obtener una lista de las canciones y también guarda una imagen a la biblioteca para el usuario.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0027.jpg"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="clip_image0027" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0027_thumb.jpg" width="227" height="422" /></a></p>
<p><strong><font size="5">Guardar la imagen a la biblioteca multimedia</font></strong></p>
<p>En la aplicación de ejemplo he agregado una imagen como recurso. Es una imagen genial y estoy seguro de que todos los usuarios van a quererla así que vamos a guardarla en la biblioteca de medios. La aplicación de ejemplo guarda esta imagen en el método Application_Launching en el archivo App.xaml.cs, aquí está el código para ello.</p>
<p>public static void GuardarImagenBiblioteca(string nombreImagen)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var biblioteca = new MediaLibrary();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var imagen = biblioteca.Pictures.Where(p =&gt; p.Name == nombreImagen).SingleOrDefault();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (imagen == null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var recurso = Application.GetResourceStream(new Uri(string.Format(&#8220;/31DaysMediaLibrary;component/Images/{0}&#8221;,nombreImagen), UriKind.Relative));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var bitmap = new BitmapImage();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bitmap.SetSource(recurso.Stream);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; biblioteca.SavePicture(nombreImagen, bitmap.ToStream());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>La mayoría de este código esta simplemente trabajando al cargar una imagen. Hay algunas líneas importantes aquí que están usando la Biblioteca de medios. Vamos a ver mas de cerca esas líneas.</p>
<p>var biblioteca = new MediaLibrary();<br /> 
<p>Esta línea crea una nueva clase de tipo MediaLibrary. Esto es lo que te dará acceso a las propiedades y métodos de la biblioteca de medios.</p>
<p>var imagen = biblioteca.Pictures.Where(p =&gt; p.Name == nombreImagen).SingleOrDefault();</p>
<p>Esta línea busca en la biblioteca por cualquier imagen que este ya salvada con el nombre de la imagen. Si esta existe, el código no la guardará de nuevo.</p>
<p>biblioteca.SavePicture(nombreImagen, bitmap.ToStream());</p>
<p>Esta línea guarda el BitmapImage a la biblioteca. Quizá notes que un BitmapImage no tiene normalmente el método ToStream. Pienso que lo tendría utilizando un método extendido para agregarselo. La clase de extensión no tiene nada que hacer con la biblioteca multimedia, pero aquí verás como es que funciona.</p>
<p>public static class ExtensionBitmap<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Stream ToStream(this BitmapImage bitmap)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var writeableBitmap = new WriteableBitmap(bitmap);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var stream = new MemoryStream();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writeableBitmap.SaveJpeg(stream, bitmap.PixelWidth, bitmap.PixelHeight, 0, 100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stream.Position = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return stream;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</p>
<p>Después de que el código ha sido ejecutado, la imagen estará disponible en la biblioteca de medios. Para mostrar esto en nuestra aplicación de ejemplo, puedes dar clic en el ícono del engrane en la bandeja de la aplicación y la nueva imagen estará disponible para ser seleccionada usando un PhotoChooserTask.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0046.jpg"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="clip_image0046" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0046_thumb.jpg" width="193" height="362" /></a></p>
<p><strong><font size="5">Obtener una lista de canciones</font></strong></p>
<p>En la aplicación de ejemplo la pantalla muestra una lista de las canciones que el usuario tiene en la biblioteca de medios. La lista es un ListBox. Un Data Template es definido y es el que enlaza la propiedad Text de los dos TextBlock. Uno despliega el título de la canción y el otro despliega al artista. Aquí esta lo como queda el XAML para el ListBox.</p>
<p>&lt;ListBox <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x:Name=&#8221;lstCanciones&#8221; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SelectionChanged=&#8221;lstCanciones_SelectionChanged&#8221;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ListBox.ItemTemplate&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DataTemplate&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel Margin=&#8221;0,0,0,17&#8243; Width=&#8221;432&#8243; Height=&#8221;78&#8243;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text=&#8221;{Binding Name}&#8221; TextWrapping=&#8221;Wrap&#8221; Style=&#8221;{StaticResource PhoneTextExtraLargeStyle}&#8221;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text=&#8221;{Binding Artist.Name}&#8221; TextWrapping=&#8221;Wrap&#8221; Margin=&#8221;12,-6,12,0&#8243; Style=&#8221;{StaticResource PhoneTextSubtleStyle}&#8221;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/StackPanel&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DataTemplate&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ListBox.ItemTemplate&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ListBox&gt;</p>
<p>Ajusta el ItemSource a la lista de canciones es bastante simple:</p>
<p>var biblioteca = new MediaLibrary();<br />lstCanciones.ItemsSource = biblioteca.Songs;</p>
<p><strong><font size="5">¿Qué mas hay ahí?</font></strong></p>
<p>Hay algunas otras propiedades de la clase MediaLibrary para considerar:</p>
<p><strong>Álbumes</strong> – Es similar a la colección de canciones, pero enlista en su lugar los álbumes</p>
<p><strong>Artistas</strong> – Así como la colección de álbumes, esta colección enlista a los artistas de las canciones.</p>
<p><strong>Genres</strong> – Esta colección enlista los géneros de las canciones.</p>
<p><strong>Playlists</strong> – Esta colección enlista las listas de reproducción que el usuario ha agregado a su biblioteca.</p>
<p><strong><font size="5">En resumen</font></strong></p>
<p>Como puedes ver, usar la Biblioteca de medios es bastante sencillo. La mayoría del código en la aplicación de ejemplo esta escrito para usar el contenido, no para acceder a el desde la biblioteca. Hablé acerca de acceder a la colección de canciones y como guardar una imagen en la biblioteca. Discutí unas pocas maneras de usar la biblioteca en tus propias aplicaciones. Estoy seguro que hay&nbsp; muchas mas formas&nbsp; de usar este contenido. Diviértete y no puedo esperar a ver tus aplicaciones.</p>
<p>Para descargar este ejemplo entero de la aplicación de Windows Phone usando los conceptos aquí mostrados, puedes hacerlo en el enlace siguiente.</p>
<p><a href="http://aminespinoza.com/materialBlog/31dias/Dia_28_MediaLibrary.zip">Puedes descargar el código aquí.</a></p>
<p>Mañana, cubriremos la globalización/localización en el artículo y te mostraremos que tan sencillo es incluir esto en tu proyecto Windows Phone. Nos vemos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2011/12/da-28-biblioteca-multimedia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>D&#237;a 27: API del micr&#243;fono</title>
		<link>http://blogs.ligasilverlight.com/2011/12/da-27-api-del-micrfono/</link>
		<comments>http://blogs.ligasilverlight.com/2011/12/da-27-api-del-micrfono/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 06:19:10 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3473</guid>
		<description><![CDATA[Esta es una traducción de Day 27:Microphone API, puedes encontrarlo aquí en su versión original en inglés. Introducción El reconocimiento de voz o tomar notas es una práctica muy común dependiendo de tu profesión o uso, por ejemplo, es entendido que los dispositivos móviles de hoy ofrecen alguna clase de reconocimiento de palabras y control de la aplicación, ya sean direcciones o marcar un número o el otro uso común, al reproducir música. La tarea de notas es otro elemento que es útil para ser capaz de capturar audio en el campo para futuras referencias. El primer paso de todas estas aplicaciones es ser capaz de capturar audio vía el micrófono y procesarlo como sea necesario. Así que hoy miraremos al API del microfono proveída por Mango y haremos un ejemplo muy sencillo para que inicies. ¿Qué es lo que esta involucrado? Haremos lo mínimo, necesitaremos grabar audio y salvarlo para su reproducción. Los siguientes puntos clave deberán ser notados: 1. Clase Microphone: Esta es la clase proveída por el espacio de nombres Microsoft.Xna.Framework.Audio que nos permite el acceso a la API del micrófono. 2. Evento publico EventHandler&#60;EventArgs&#62; BufferReady: Este es un evento que se manifiesta cuando el micrófono esta [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jeffblankenburg.com/2011/11/27/31-days-of-mango-day-27-microphone-api/" target="_blank">Esta es una traducción de Day 27:Microphone API, puedes encontrarlo aquí en su versión original en inglés.</a></p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia27.png"><img style="padding-left: 0px;padding-right: 0px;padding-top: 0px;border-width: 0px" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia27_thumb.png" alt="dia27" width="600" height="75" border="0" /></a></p>
<p>Introducción</p>
<p>El reconocimiento de voz o tomar notas es una práctica muy común dependiendo de tu profesión o uso, por ejemplo, es entendido que los dispositivos móviles de hoy ofrecen alguna clase de reconocimiento de palabras y control de la aplicación, ya sean direcciones o marcar un número o el otro uso común, al reproducir música.</p>
<p>La tarea de notas es otro elemento que es útil para ser capaz de capturar audio en el campo para futuras referencias.</p>
<p>El primer paso de todas estas aplicaciones es ser capaz de capturar audio vía el micrófono y procesarlo como sea necesario.</p>
<p>Así que hoy miraremos al API del microfono proveída por Mango y haremos un ejemplo muy sencillo para que inicies.</p>
<p>¿Qué es lo que esta involucrado?</p>
<p>Haremos lo mínimo, necesitaremos grabar audio y salvarlo para su reproducción.</p>
<p>Los siguientes puntos clave deberán ser notados:</p>
<p>1. Clase Microphone: Esta es la clase proveída por el espacio de nombres Microsoft.Xna.Framework.Audio que nos permite el acceso a la API del micrófono.</p>
<p>2. Evento publico EventHandler&lt;EventArgs&gt; BufferReady: Este es un evento que se manifiesta cuando el micrófono esta listo para librerar el audio almacenado. Necesitamos manejar esta evento y almacenar el audio para una reproducción posterior.</p>
<p>3. Microphone.Start: Como el nombre indica, lo llamamos para iniciar la grabación.</p>
<p>4. Microphone.Stop: Lo llamamos para detener la grabación. Un punto importante para considerar es que al llamar a Microphone.Stop inmediatamente limpiara el buffer.</p>
<p>Como verás en la aplicación, no llamamos al método Stop inmediatamente cuando el usuario abra el micrófono o de clic en el botón de reproducir. En lugar de eso, dejamos al micrófono levantar el evento de BufferReady con la duración del buffer seleccionada para capturar hasta el último bit de información de audio antes de detener la grabación.</p>
<p>using Microsoft.Xna.Framework –&gt; Como debiste haber adivinado desde el espacio de nombres, requerimos una referencia al framework de Xna. El API del micrófono es parte del framework de XNA y requiere la simulación de juego de Xna. Si no estás familiarizado con XNA, XNA es un framework muy enriquecido proveido por Microsoft para aplicaciones destinadas para juegos y gráficas.</p>
<p><strong><span style="font-size: large">Entendiendo el ejemplo</span></strong></p>
<p><strong>Prerequisitos</strong>: Instala las herramientas de Mango <a href="http://create.msdn.com">http://create.msdn.com</a> , esto te dará el Windows Phone SDK y Visual Studio Express 2010 que necesitas para desarrollar aplicaciones para Windows Phone.</p>
<p>1. Lanza Visual Studio, navega a la solución y ábrela. La aplicación esta creada usando Silverlight for Windows Phone. Corre el proyecto y despliega la aplicación en el emulador. Verás la siguiente pantalla cuando la aplicación termine de cargar.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0023.jpg"><img style="padding-left: 0px;padding-right: 0px;padding-top: 0px;border: 0px" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0023_thumb.jpg" alt="clip_image0023" width="259" height="430" border="0" /></a></p>
<p>2. El elemento de la pantalla:</p>
<p>a. El botón de micrófono es una palanca la cual comienza y detiene al micrófono.</p>
<p>b. El botón de reproducir es usado para escuchar el sonido guardado.</p>
<p>c. Hay tres sliders para ajustar el volumen, extracción y tono del sonido al ser reproducido.</p>
<p>3. Como funciona:</p>
<p>a. Toca el micrófono para iniciar la grabación. Puedes detener la grabación al tocar el micrófono de nuevo o alternativamente al tocar el botón de reproducir.</p>
<p>b. Ajusta el volumen, prueba el sonido al cambiar los valores de los sliders al reproducir el sonido.</p>
<p><strong><span style="font-size: large">Entendiendo el código</span></strong></p>
<p><strong>Aquí están las declaraciones iniciales:</strong></p>
<p>private Microphone microfono = Microphone.Default;<br />
private MemoryStream stream = new MemoryStream();<br />
private SoundEffectInstance sonidoGrabado;<br />
private byte[] buffer;<br />
bool estaReproduciendoSonido = false;<br />
string rutaImagenMicrofonoDetenido = &#8220;Imagenes/stopped.png&#8221;;<br />
string rutaImagenMicrofonoIniciado = &#8220;Imagenes/114px-Yeti-USB-Microphone.png&#8221;;<br />
string rutaImagenBotonPlayPausadoLight = &#8220;Imagenes/light.appbar.transport.pause.rest.png&#8221;;<br />
string rutaImagenBotonPlayPausadoDark = &#8220;Imagenes/dark.appbar.transport.pause.rest.png&#8221;;<br />
string rutaImagenBotonPlayLight = &#8220;Imagenes/light.appbar.transport.play.rest.png&#8221;;<br />
string rutaImagenBotonPlayDark = &#8220;Imagenes/dark.appbar.transport.play.rest.png&#8221;;<br />
bool grabacionDetenida = false;<br />
bool reproducirSonido = false;<br />
bool streamDesechado = false;<br />
bool esTemaOscuro = ((Visibility)Application.Current.Resources["PhoneDarkThemeVisibility"] == Visibility.Visible);</p>
<p>Estaremos usando un objeto de la clase SoundEffectInstance para reproducir el sonido grabado. Podríamos también haber usado un SoundEffect, sin embargo al usar la clase SoundEffectInstance nos permitirá rastrear el estado (reproduciendo o detenido).</p>
<p>La otra declaración aquí es para un objeto MemoryStream. El buffer del micrófono es constantemente escrito en un memorystream a menos que la reproducción sea deseada. En este momento, ingresamos el contenido del memorystream al objeto SoundEffectInstance para reproducir.</p>
<p><strong>Inicialización:</strong></p>
<p>public MainPage()<br />
{<br />
InitializeComponent();<br />
DispatcherTimer temporizador = new DispatcherTimer();<br />
temporizador.Interval = TimeSpan.FromMilliseconds(33);<br />
temporizador.Tick += new EventHandler(temporizador_Tick);<br />
temporizador.Start();<br />
AjustarMicrofono();<br />
SoundEffect.MasterVolume = 1.0f;<br />
AjustarImagenBotonReproducirBasadoEnTema();<br />
}</p>
<p>El punto principal para ver aquí es el ciclo que hemos creado usando un DispatcherTimer. Este ciclo es esencial para capturar el audio desde el micrófono.</p>
<p>Ajustamos la imagen para el botón de reproducir basado en el tipo de tema que esté seleccionado.</p>
<p>Hasta ahora también ajustamos los valores del micrófono para nuestra aplicación, como sigue:</p>
<p>private void AjustarMicrofono()<br />
{<br />
if (Microphone.Default == null)<br />
{<br />
return;<br />
}</p>
<p>microfono.BufferDuration = TimeSpan.FromMilliseconds(500);<br />
buffer = new byte[microfono.GetSampleSizeInBytes(microfono.BufferDuration)];<br />
stream.SetLength(0);</p>
<p>microfono.BufferReady += microfono_BufferReady;</p>
<p>ImageBrush pincel = new ImageBrush();<br />
pincel.ImageSource = new BitmapImage(new Uri(rutaImagenMicrofonoDetenido, UriKind.Relative));<br />
pincel.Stretch = Stretch.Uniform;<br />
btnGrabar.Background = pincel;<br />
}</p>
<p>La duración del buffer es de medio segundo y después usamos un método llamado GetSampleSizeInBytes y pasamos la duración del buffer para obtener el tamaño real de este. Esto es importante para asegurar una captura de audio fluida-</p>
<p>Enlazamos el evento de Buffer Ready y ajustamos la imagen preestablecida del micrófono detenido.</p>
<p>¡Estamos listos para comenzar a grabar!</p>
<p><strong>Grabar audio:</strong></p>
<p>Cuando el usuario de clic sobre el botón del micrófono, el siguiente código es llamado:</p>
<p>private void btnGrabar_Click(object sender, System.Windows.RoutedEventArgs e)<br />
{<br />
if (estaReproduciendoSonido)<br />
{<br />
return;<br />
}<br />
streamDesechado = false;</p>
<p>if (microfono.State == MicrophoneState.Stopped)<br />
{<br />
ImageBrush pincel = new ImageBrush();<br />
pincel.ImageSource = new BitmapImage(new Uri(rutaImagenMicrofonoIniciado, UriKind.Relative));<br />
pincel.Stretch = Stretch.Uniform;<br />
btnGrabar.Background = pincel;<br />
if (sonidoGrabado != null) sonidoGrabado.Stop();<br />
stream.SetLength(0);<br />
grabacionDetenida = false;<br />
microfono.Start();</p>
<p>}<br />
else if (microfono.State == MicrophoneState.Started)<br />
{<br />
grabacionDetenida = true;<br />
ImageBrush pincel = new ImageBrush();<br />
pincel.ImageSource = new BitmapImage(new Uri(rutaImagenMicrofonoDetenido, UriKind.Relative));<br />
pincel.Stretch = Stretch.Uniform;<br />
btnGrabar.Background = pincel;<br />
btnReproducir.IsEnabled = true;<br />
}</p>
<p>reproducirSonido = false;<br />
AjustarImagenBotonReproducirBasadoEnTema();<br />
estaReproduciendoSonido = false;<br />
}</p>
<p>Aquí suceden unas cosas:</p>
<p>1- El micrófono es detenido: Si el micrófono es detenido necesitamos comenzar a hacerlo grabar. Ajustamos el fondo del botón del micrófono. Después reiniciamos el MemoryStream para limpiar nuestro audio grabado previamente. Checamos  y detenemos el audio a reproducir.</p>
<p>Pasos muy sencillos de seguir. Ahora necesitamos llamar al método Microfono.Start(). El resto de los pasos están basados en la UI y diseño de la aplicación.</p>
<p>2. El micrófono esta grabando: Primero necesitamos detener la grabación. Si reactivas la nota de arriba, no podemos llamar al método Microfono.Stop() inmediatamente mientras que toda la información grabada no haya sido desechada del MemoryStream. Así que usamos variables booleanas para mantener un registro y diferir la acción de detener en el evento DispatchTimer.</p>
<p>Dos cosas necesitan pasar aquí. Primero, necesitamos dejar el buffer del micrófono listo para lanzar al inicio de modo que podamos leer el último bit del audio y después necesitamos lanzar la reproducción. Manejamos esto como se muestra.</p>
<p>void microfono_BufferReady(object sender, EventArgs e)<br />
{<br />
microfono.GetData(buffer);<br />
stream.Write(buffer, 0, buffer.Length);</p>
<p>if (grabacionDetenida)<br />
{<br />
stream.Flush();<br />
streamDesechado = true;<br />
microfono.Stop();<br />
}<br />
}</p>
<p>En el evento anterior, verificamos si la grabación ha sido detenida usando nuestras variables booleanas y después llamamos al método Stream.Flush(). Esto desecha la información restante del MemoryStream. Después detenemos el micrófono.</p>
<p>Sin embargo, no podemos lanzar la reproducción de audio en este evento, Esto es manejado por el “tick” del temporizador como se muestra en seguida:</p>
<p>void temporizador_Tick(object sender, EventArgs e)<br />
{<br />
try { FrameworkDispatcher.Update(); }<br />
catch (Exception ex)<br />
{<br />
throw ex;<br />
}</p>
<p>if (true == estaReproduciendoSonido)<br />
{<br />
if (sonidoGrabado.State != SoundState.Playing)<br />
{<br />
ResetearAjustesReproduccion();<br />
}<br />
}<br />
else<br />
{<br />
if (reproducirSonido &amp;&amp; streamDesechado)<br />
{<br />
reproducirSonido = false;<br />
if (stream.Length &gt; 0)<br />
{<br />
AjustarImagenBotonPausaBasadoEnTema();<br />
Thread hiloSonido = new Thread(new ThreadStart(iniciarReproduccion));<br />
hiloSonido.Start();<br />
}<br />
}<br />
}<br />
}</p>
<p>El evento es llamado cada 33 milisegundos. Así que estará bastante ajustado para que el usuario reproduzca el sonido sin ningún problema. La ventaja, por supuesto es que podemos reproducir el audio entero antes de dejar que sea cortado.</p>
<p>Checamos si es momento de grabar y ver si el stream ha sido desechado. Si es así, iniciamos un nuevo hilo para la reproducción de audio. Este es un punto importante para notar.</p>
<p>Estamos lanzando la reproducción de la cinta en un hilo diferente para permitir a la UI actualizarse. Esto significa que cualquier código dentro de nuestra rutina de reproducción que escoja actualizar los elementos de la interfaz tiene que hacerlo al llamar al DispatchBeginInvoke como se muestra abajo.</p>
<p><strong>Reproducir el audio</strong></p>
<p>private void iniciarReproduccion()<br />
{<br />
SoundEffect sonido = new SoundEffect(stream.ToArray(), microfono.SampleRate, AudioChannels.Mono);<br />
sonidoGrabado = sonido.CreateInstance();</p>
<p>estaReproduciendoSonido = true;<br />
Dispatcher.BeginInvoke(() =&gt;<br />
{<br />
sonidoGrabado.Pitch = (float)sldPitch.Value;<br />
sonidoGrabado.Pan = (float)sldPan.Value;<br />
sonidoGrabado.Volume = (float)sldVolumen.Value;<br />
}<br />
);<br />
sonidoGrabado.Play();<br />
}</p>
<p>Creamos un objeto de la clase SoundEffectInstance  alimentándolo del stream de audio capturado, el rango de ejemplo del micrófono y el canal de audio.</p>
<p>Dado que deseamos usar los sliders para ajustar el volumen, pitch y pan, tenemos que usar de nuevo un Dispatcher.BeginInvoke dado que ellos están en un hilo diferente.</p>
<p>Finalmente llamamos al botón reproducir.</p>
<p><strong><span style="font-size: large">En resumen</span></strong></p>
<p>Es bastante simple crear una aplicación que registre audio. Podemos extender esta aplicación para guardar el audio grabado en el almacenamiento aislado y darle un título elegido por el usuario. Podemos agregar una vista de lista de las grabaciones del almacenamiento aislado y hacer una pequeña aplicación de notas de voz.</p>
<p>Los pasos básicos de la grabación de audio son:</p>
<p>a)Enlaza un evento al micrófono preestablecido para capturar el audio.</p>
<p>b)Escribe el audio en un stream</p>
<p>c)Cuando el usuario detenga la grabación, desecha el stream y almacénalo o reprodúcelo.</p>
<p>Podemos también extender esta aplicación tomando el audio grabado y mandándolo a un servicio de traducción y capturar comandos.</p>
<p>Para descargar este ejemplo entero de la aplicación de Windows Phone usando los conceptos aquí mostrados, puedes hacerlo en el enlace siguiente.</p>
<p><a href="http://aminespinoza.com/materialBlog/31dias/Dia_27_Microfono.zip">Puedes descargar el código aquí.</a></p>
<p>Mañana Jeff Fansler estará cubriendo la clase MediaLibrary y como podemos usarla para aprender mas acerca de la librería de música del usuario en su teléfono. Nos vemos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2011/12/da-27-api-del-micrfono/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>D&#237;a 26: Transferencia de archivos en segundo plano</title>
		<link>http://blogs.ligasilverlight.com/2011/12/da-26-transferencia-de-archivos-en-segundo-plano/</link>
		<comments>http://blogs.ligasilverlight.com/2011/12/da-26-transferencia-de-archivos-en-segundo-plano/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 05:29:30 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3467</guid>
		<description><![CDATA[Esta es una traducción de Day 26: Background File Transfer, puedes encontrarlo aquí en su versión original en inglés. Ayer creamos un proyecto usando un Background Agent, uno de los nuevos elementos multitarea nuevos en Windows Phone 7.5. Hoy usaremos el Background File Transfer para realizar la descarga de un archivo que continua incluso cuando nuestra aplicación no esté corriendo. Descargaremos un video desde Channel 9 y lo reproduciremos cuando esté completado. Comenzando Lanza Visual Studio y crea un nuevo proyecto. Debajo de Silverlight for Windows Phone, selecciona Windows Phone Application. Nombra la aplicación como gustes. Has creado la aplicación principal. Será responsable para: 1) Iniciar nuestra descarga del video 2) Desplegar el estado de la descarga 3) Reproducir el video una vez que se haya completado Crear la aplicación Ahora es tiempo de juntarlo todo. Abre MainPage.xaml y agrega dos botones para descargar y reproducir el video. Después, agrega dos TextBlocks para desplegar el progreso y estado. &#60;Grid x:Name=&#8221;ContentPanel&#8221; Grid.Row=&#8221;1&#8243; Margin=&#8221;12,0,12,0&#8243;&#62;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;Button x:Name=&#8221;btnIniciar&#8221; Click=&#8221;btnIniciar_Click&#8221; Content=&#8221;Iniciar descarga&#8221; Margin=&#8221;0,101,0,0&#8243; VerticalAlignment=&#8221;Top&#8221;/&#62;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;Button x:Name=&#8221;btnReproducir&#8221; Click=&#8221;btnReproducir_Click&#8221; IsEnabled=&#8221;False&#8221; Content=&#8221;Reproducir video&#8221; Margin=&#8221;0,225,0,0&#8243; VerticalAlignment=&#8221;Top&#8221;/&#62;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;TextBlock x:Name=&#8221;txtProgreso&#8221; Margin=&#8221;8,0,8,258&#8243; VerticalAlignment=&#8221;Bottom&#8221;/&#62;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;TextBlock x:Name=&#8221;txtEstado&#8221; Margin=&#8221;8,0,8,159&#8243; VerticalAlignment=&#8221;Bottom&#8221; Height=&#8221;0&#8243;/&#62;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;/Grid&#62; No incluiré el MainPage.xaml entero aquí, pero está disponible en la solución al [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jeffblankenburg.com/2011/11/26/31-days-of-mango-day-26-background-file-transfer/">Esta es una traducción de Day 26: Background File Transfer, puedes encontrarlo aquí en su versión original en inglés.</a></p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia26.png"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="dia26" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia26_thumb.png" width="600" height="75" /></a></p>
<p>Ayer creamos un proyecto usando un Background Agent, uno de los nuevos elementos multitarea nuevos en Windows Phone 7.5. Hoy usaremos el <strong>Background File Transfer</strong> para realizar la descarga de un archivo que continua incluso cuando nuestra aplicación no esté corriendo. Descargaremos un video desde <a href="http://channel9.msdn.com/">Channel 9</a> y lo reproduciremos cuando esté completado.</p>
<p>Comenzando</p>
<p>Lanza Visual Studio y crea un nuevo proyecto. Debajo de Silverlight for Windows Phone, selecciona Windows Phone Application. Nombra la aplicación como gustes.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image002_thumb3.jpg"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="clip_image002_thumb3" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image002_thumb3_thumb.jpg" width="508" height="309" /></a></p>
<p>Has creado la aplicación principal. Será responsable para:</p>
<p>1) Iniciar nuestra descarga del video</p>
<p>2) Desplegar el estado de la descarga</p>
<p>3) Reproducir el video una vez que se haya completado</p>
<p>Crear la aplicación</p>
<p>Ahora es tiempo de juntarlo todo. Abre MainPage.xaml y agrega dos botones para descargar y reproducir el video. Después, agrega dos TextBlocks para desplegar el progreso y estado.</p>
<p>&lt;Grid x:Name=&#8221;ContentPanel&#8221; Grid.Row=&#8221;1&#8243; Margin=&#8221;12,0,12,0&#8243;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Button x:Name=&#8221;btnIniciar&#8221; Click=&#8221;btnIniciar_Click&#8221; Content=&#8221;Iniciar descarga&#8221; Margin=&#8221;0,101,0,0&#8243; VerticalAlignment=&#8221;Top&#8221;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Button x:Name=&#8221;btnReproducir&#8221; Click=&#8221;btnReproducir_Click&#8221; IsEnabled=&#8221;False&#8221; Content=&#8221;Reproducir video&#8221; Margin=&#8221;0,225,0,0&#8243; VerticalAlignment=&#8221;Top&#8221;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock x:Name=&#8221;txtProgreso&#8221; Margin=&#8221;8,0,8,258&#8243; VerticalAlignment=&#8221;Bottom&#8221;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock x:Name=&#8221;txtEstado&#8221; Margin=&#8221;8,0,8,159&#8243; VerticalAlignment=&#8221;Bottom&#8221; Height=&#8221;0&#8243;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Grid&gt;</p>
<p>No incluiré el MainPage.xaml entero aquí, pero está disponible en la solución al final. Primero, definimos algunas variables para mantener la ubicación de nuestro video a descargar, la ubicación donde guardaremos el video y la taza de transferencia actual.</p>
<p>private const String ubicacionArchivo = &#8220;shared/transfers/MiVideoDescargado.mp4&#8243;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Uri direccionVideoDescarga = new Uri(&#8220;http://video.ch9.ms/ch9/02df/0a2774a9-a010-4b9b-b654-9f88014102df/xboxCompanion_med_ch9.mp4&#8243;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Uri direccionGuardarArchivo = new Uri(ubicacionArchivo, UriKind.RelativeOrAbsolute);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private BackgroundTransferRequest solicitudActual = null;</p>
<p>Nota que cuando se descarga directamente al Almacenamiento Aislado, todas las descargas deben ir hacía shared/transfers/. Estaremos descargando un video desde Channel9 y guardarlo como “MiVideoDescargado.mp4”.</p>
<p>Cuando un usuario da clic en “Iniciar descarga”, crearemos un nuevo BackgroundTransferRequest y le diremos lo que queremos descargar y donde queremos guardar lo descargado. De forma preestablecida, una descarga puedes solo ser realizada cuando el dispositivo esta conectado y tiene una conexión Wi-Fi. Ajustamos esto con <b>BackgroundTransferRequest.TransferPreferences</b> a <strong>AllowCellularAndBattery. </strong>Finalmente, agregamos nuestra solicitud al <strong>BackgroundTransferService</strong>.</p>
<p>solicitudActual = new BackgroundTransferRequest(direccionVideoDescarga, direccionGuardarArchivo);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; solicitudActual.TransferPreferences = TransferPreferences.AllowCellularAndBattery;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BackgroundTransferService.Add(solicitudActual);</p>
<p>También necesitamos ser notificados del estado de la solicitud y el progreso para mostrarlo en nuestra UI. Podemos suscribirnos a los cambios manejando los eventos <strong>TransferProgressChanged</strong> y <strong>TransferStatusChanged.</strong></p>
<p>if (solicitudActual != null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; solicitudActual.TransferProgressChanged += solicitudActual_TransferProgressChanged;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; solicitudActual.TransferStatusChanged += solicitudActual_TransferStatusChanged;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>Cuando somos notificados por ese eventos, podemos checar muchas propiedades en nuestro BackgroundTransferRequest para ver el estado actual de la descarga:</p>
<p>* <strong>BytesReceived / TotalBytesToReceive</strong> para el progreso de la descarga</p>
<p>* <strong>BytesSent / TotalBytesToSend</strong> para el progreso de una carga</p>
<p>* <strong>TransferStatus </strong>para el estado actual de la descarga (transferencia, completado, etc.)</p>
<p>* <strong>TransferError</strong> para información acerca de un archivo transferido</p>
<p>Nota que no importa si la transferencia fue exitosa, <strong>TransferStatus</strong> lo reportara a <strong>Completed</strong> cuando termine. Debido a esto, una vez que <strong>TransferStatus</strong> reporte su estado a <strong>Completed</strong>, deberías checar <strong>TransferError</strong> para ver si un error ocurrió.</p>
<p>Cuando la transferencia este completada, deberías removerlo del BackgroundTransferService:</p>
<p>BackgroundTransferService.Remove(solicitudActual);</p>
<p>Finalmente, uno de los aspectos mas truculentos de implementar un background file transfer, es lidiar con el cierre de tu aplicación. Cuando reingreses a la aplicación, necesitamos que nuestro estado siga cargando, incluso cuando solicitudActual vaya a ser nula y nuestros eventos no estén mas entrelazados. Para lidiar con esto, reseteamos nuestra solicitudActual y enlazamos los eventos en <strong>OnNavigatedTo</strong>:</p>
<p>protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.OnNavigatedTo(e);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (BackgroundTransferRequest solicitud in BackgroundTransferService.Requests)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; solicitudActual = solicitud;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IniciarSolicitudParaTransferencia();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IniciarManejadoresParaTransferencia();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RefrescarDireccionTransferencia();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>Ya funcional, este ejemplo es bastante simple. Es recomendado que también cheques <a href="http://msdn.microsoft.com/en-us/library/hh202955(v=VS.92).aspx">la vista general del Background File Transfer</a> en MSDN para una mas completa referencia. </p>
<p><strong><font size="5">Correr la aplicación</font></strong></p>
<p>Nota que nuestra aplicación esta lista para correr, despliégala en el emulado o en un dispositivo y ejecútala. Da clic en “Iniciar descarga” y deberás ver el progreso de la descarga reportado:</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0032.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="clip_image0032" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0032_thumb.png" width="335" height="190" /></a></p>
<p>Presiona el botón de “Iniciar” y deja a la aplicación. Espera un poco y después reingresa a la aplicación. Deberás ver que el progreso de la descarga ha continuado incluso cuando la aplicación no estaba corriendo. Una vez que el estado este completado, puedes dar clic en “Ver video” para ver el video que fue descargado.</p>
<p><strong><font size="5">En resumen</font></strong></p>
<p>Hoy creamos un BackgroundTransferRequest que descarga un video. Cuando se hace la solicitud de transferencia por tu cuenta, ten en cuenta que cubrimos.</p>
<p>* Iniciar un BackgroundTransferRequest y agregalo al BackgroundTransferService para iniciar una carga o descarga.</p>
<p>* Guarda las descargas en share/transfers al guardar en el Almacenamiento Aislado.</p>
<p>* Maneja la BackgroundTransferRequest. TransferProgressChanged y BackgroundTransferRequest. Los eventos TransferStatusChanged son notificados de cambios en el estado de transferencia.</p>
<p>* Cuando BackgroundTransferRequest y TransferStatus este completo, recuerda checar BackgroundTransferRequest y TransferError para ver si la transferencia fue exitosa.</p>
<p>* Manejar escenarios donde el usuario deje y regrese a la aplicación.</p>
<p>Para descargar este ejemplo entero de la aplicación de Windows Phone usando los conceptos aquí mostrados, puedes hacerlo en el enlace siguiente.</p>
<p><a href="http://aminespinoza.com/materialBlog/31dias/Dia_26_TransferenciaArchivos.zip">Puedes descargar el código aquí.</a></p>
<p>Mañana. Parag Joshi esta de vuelta para discutir la API del micrófono y como podemos usarla para capturar audio desde un dispositivo Windows Phone. Nos vemos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2011/12/da-26-transferencia-de-archivos-en-segundo-plano/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://video.ch9.ms/ch9/02df/0a2774a9-a010-4b9b-b654-9f88014102df/xboxCompanion_med_ch9.mp4" length="38056162" type="video/mp4" />
		</item>
		<item>
		<title>D&#237;a 25: Background agents</title>
		<link>http://blogs.ligasilverlight.com/2011/12/da-25-background-agents/</link>
		<comments>http://blogs.ligasilverlight.com/2011/12/da-25-background-agents/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 03:42:57 +0000</pubDate>
		<dc:creator>Amin Espinoza</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">http://blogs.ligasilverlight.com/?p=3459</guid>
		<description><![CDATA[Esta es una traducción de Day 25: Background Agents, puedes encontrarlo aquí en su versión original en inglés. Hoy, vamos a darle un vistazo a una de las capacidades multitarea nuevas en Windows Phone Mango. El entorno completo de multitarea abarca muchos nuevos elementos: * Background Agents * Background File Transfer * Background Audio Playback * Scheduled Notifications * Fast Application Switching Aquí nos enfocaremos en los Background Agents. Mientras que la transferencia de archivos y tarea de reproducción de audio cubren escenarios específicos, no permiten un código personalizado para ser ejecutados. Aquí es donde entran los agentes en segundo plano. Hay dos tipos de agentes de segundo plano: Periodic y Resource Intensive. Los agentes de recursos intensivos están hechos para tareas que consumirán un monto grande de recursos del sistema pero con muchas limitaciones para cuando ellos quieran correr. Los agentes periódicos corren mas frecuentemente y con menos restricciones, pero están hechos para tareas que sean ligeras en consumo de recursos. Para entender completamente las diferentes limitantes y beneficios de cada uno,visita la página de MSDN. Una tarea periódica puede hacer algo corto y simple, así como refrescar un RSS o actualizar tu live tile. Una tarea exigente de [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jeffblankenburg.com/2011/11/25/31-days-of-mango-day-25-background-agents/">Esta es una traducción de Day 25: Background Agents, puedes encontrarlo aquí en su versión original en inglés.</a></p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia25.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="dia25" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/dia25_thumb.png" width="600" height="75" /></a></p>
<p>Hoy, vamos a darle un vistazo a una de las capacidades multitarea nuevas en Windows Phone Mango. El entorno completo de multitarea abarca muchos nuevos elementos:</p>
<p>* Background Agents</p>
<p>* Background File Transfer</p>
<p>* Background Audio Playback</p>
<p>* Scheduled Notifications</p>
<p>* Fast Application Switching</p>
<p>Aquí nos enfocaremos en los Background Agents. Mientras que la transferencia de archivos y tarea de reproducción de audio cubren escenarios específicos, no permiten un código personalizado para ser ejecutados. Aquí es donde entran los agentes en segundo plano.</p>
<p>Hay dos tipos de agentes de segundo plano: <strong>Periodic</strong> y <strong>Resource Intensive</strong>. Los agentes de recursos intensivos están hechos para tareas que consumirán un monto grande de recursos del sistema pero con muchas limitaciones para cuando ellos quieran correr. Los agentes periódicos corren mas frecuentemente y con menos restricciones, pero están hechos para tareas que sean ligeras en consumo de recursos. Para entender completamente las diferentes limitantes y beneficios de cada uno,<a href="http://msdn.microsoft.com/en-us/library/hh202942(v=VS.92).aspx">visita la página de MSDN.</a></p>
<p>Una tarea periódica puede hacer algo corto y simple, así como refrescar un RSS o actualizar tu live tile. Una tarea exigente de recursos puede hacer algo que requiera mas tiempo y ancho de banda, como sincronizar o atrapar grandes montos de datos desde un servicio en la nube.</p>
<p>Vamos a hacer un agente periódico que actualizará el live tile de tu aplicación con el último momento en el que nuestra tarea personalizada se ejecutó.</p>
<p><strong><font size="5">Comenzando</font></strong></p>
<p>Lanza Visual Studio 2010 y crea un nuevo proyecto. Debajo de Silverlight for Windows Phone, selecciona Windows Phone Application.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0021.jpg"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="clip_image0021" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0021_thumb.jpg" width="452" height="245" /></a></p>
<p>Ya has creado la aplicación principal. Esta será responsable de dos cosas:</p>
<p>1) Tener un live tile que el agente de segundo plano puede actualizar con información</p>
<p>2) Iniciar y detener el agente de segundo plano</p>
<p>El agente de segundo plano por sí mismo, debe vivir en su proyectos propio especial. Agrega un nuevo proyecto a tu solución, seleccionando Windows Phone Scheduled Task Agent. Nómbralo MiAgente. Este proyecto contendrá el código personalizado que correrá en segundo plano y actualizará el live tile.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0042.jpg"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="clip_image0042" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image0042_thumb.jpg" width="452" height="245" /></a></p>
<p>Finalmente, y esto es importante, ve a tu proyecto principal y agrega una referencia a MiAgente. Esto automáticamente te permitirá registrar tu agente desde dentro de la aplicación. También nota esta entrada automáticamente creada en el WMAppManifest.xml:</p>
<p>&lt;Tasks&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DefaultTask Name=&#8221;_default&#8221; NavigationPage=&#8221;MainPage.xaml&#8221; /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ExtendedTask Name=&#8221;BackgroundTask&#8221;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;BackgroundServiceAgent Specifier=&#8221;ScheduledTaskAgent&#8221; Name=&#8221;MiAgente&#8221; Source=&#8221;MiAgente&#8221; Type=&#8221;MiAgente.ScheduledAgent&#8221; /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ExtendedTask&gt;<br />&lt;/Tasks&gt;</p>
<p><strong><font size="5">Crear la aplicación</font></strong></p>
<p>Ahora es tiempo de juntarlo todo. Abre el MainPage.xaml y agrega dos botones, uno para iniciar el agente y el otro para detenerlo.</p>
<p>&lt;Grid x:Name=&#8221;ContentPanel&#8221; Grid.Row=&#8221;1&#8243; Margin=&#8221;12,0,12,0&#8243;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Button x:Name=&#8221;btnIniciar&#8221; Content=&#8221;Iniciar agente&#8221; Height=&#8221;90&#8243; Margin=&#8221;8,53,8,0&#8243; VerticalAlignment=&#8221;Top&#8221; Click=&#8221;btnIniciar_Click&#8221;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Button x:Name=&#8221;btnDetener&#8221; Content=&#8221;Detener agente&#8221; Height=&#8221;90&#8243; Margin=&#8221;8,147,8,0&#8243; VerticalAlignment=&#8221;Top&#8221; Click=&#8221;btnDetener_Click&#8221;/&gt;<br />&lt;/Grid&gt;</p>
<p>En el archivo MainPage.xaml.cs enlaza los botones para iniciar y detener al agente</p>
<p>using Microsoft.Phone.Controls;<br />using Microsoft.Phone.Scheduler;<br />using System;</p>
<p>namespace Dia_25_Agentes<br />{<br />&nbsp;&nbsp;&nbsp; public partial class MainPage : PhoneApplicationPage<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private const string nombreTarea = &#8220;MiAgente&#8221;;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public MainPage()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void btnIniciar_Click(object sender, System.Windows.RoutedEventArgs e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IniciarAgente();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void btnDetener_Click(object sender, System.Windows.RoutedEventArgs e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DetenerAgenteSiIniciado();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void IniciarAgente()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DetenerAgenteSiIniciado();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PeriodicTask tarea = new PeriodicTask(nombreTarea);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tarea.Description = &#8220;Este es un agente personalizado para el ejemplo&#8221;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScheduledActionService.Add(tarea);<br />#if DEBUG<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Si estamos depurando, intentar iniciar la tarea inmediatamente<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScheduledActionService.LaunchForTest(nombreTarea, new TimeSpan(0, 0, 1));<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void DetenerAgenteSiIniciado()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ScheduledActionService.Find(nombreTarea) != null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScheduledActionService.Remove(nombreTarea);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}</p>
<p>Nota que al crear nuestro agente personalizado, estamos creando una nueva <strong>PeriodicTask</strong>. Usamos entonces el nombre como identificador al encontrar y detener al agente. Nota también que especificamos <strong>PeriodicTask.Description</strong> (es un campo requerido y aparecerá en <strong>Settings | Background Tasks</strong> debajo del nombre de nuestra aplicación).</p>
<p>Crear el agente de segundo plano</p>
<p>En el proyecto MiAgente, abre ScheduledAgent.cs y agrega el siguiente código:</p>
<p>protected override void OnInvoke(ScheduledTask task)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActualizarTileAplicacion(ObtenerUltimoMensajeDeActualizacion());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string ObtenerUltimoMensajeDeActualizacion()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format(&#8220;Ultima: {0}&#8221;, DateTime.Now);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void ActualizarTileAplicacion(string message)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShellTile appTile = ShellTile.ActiveTiles.First();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (appTile != null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StandardTileData tileData = new StandardTileData<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BackContent = message<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; appTile.Update(tileData);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />La clase ScheduledAgent tiene un método sobrecargado importante <strong>OnInvoke</strong>. Aquí es donde tu agente ejecutará su tarea en segundo plano. Si tu tarea esta completada y no necesitas mas a tu agente para ejecutarse, puedes llamar al método <strong>NotifyComplete()</strong> para verificar que la tarea ha sido satisfactoriamente completada o <strong>Abort()</strong> para verificar que estás cancelando la tarea. Para mantener la tarea corriendo a un intervalo, simplemente no llames a ninguno, que es lo que estamos haciendo aquí.</p>
<p><strong><font size="5">Correr la aplicación</font></strong></p>
<p>Ahora que nuestra aplicación esta lista para ejecutarse, despliégala en el emulador o en un dispositivo. Da un clic para iniciar el agente de segundo plano. Deja a la aplicación y regresa a la lista de aplicaciones. Presiona y mantente sobre la aplicación, escoge “anclar a inicio”. Cuando veas el tile en tu página de inicio deberías eventualmente ver a la aplicación girar, revelando la última vez que fue actualizada.</p>
<p><a href="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image005.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="clip_image005" src="http://blogs.ligasilverlight.com/wp-content/uploads/2011/12/clip_image005_thumb.png" width="337" height="173" /></a></p>
<p><strong><font size="5">En resumen</font></strong></p>
<p>Así que hoy creamos nuestro propio Background Agent personalizado que actualiza un live tile. Cuando hagas los tuyos por tu cuenta mantén en cuenta que cubrimos:</p>
<p>* Los agentes de segundo plano te permiten ejecutar código personalizado mientras tu aplicación no está corriendo.</p>
<p>* Hay dos tipos de agentes de segundo plano – periódico y de recursos intensivos.</p>
<p>* Las tareas periódicas son para tareas que tienen bajo consumo de recursos, y como resultado tienen menos restricciones que las tareas de recursos intensivos.</p>
<p>* Los agentes de segundo plano necesitan su propio proyecto, el cual debería ser agregado como una referencia de proyecto a la aplicación que iniciará el agente.</p>
<p>* En tu agente necesitas el método sobrecargado OnInvoke()</p>
<p>* Cuando tu tarea esté completa necesitas llamar a NotifyComplete() o Abort()</p>
<p>Para descargar este ejemplo entero de la aplicación de Windows Phone usando los conceptos aquí mostrados, puedes hacerlo en el enlace siguiente.</p>
<p><a href="http://aminespinoza.com/materialBlog/31dias/Dia_25_Agentes.zip">Puedes descargar el código aquí.</a></p>
<p>Mañana vamos a mirar a otro elemento multitarea llamado <strong>Background File Transfer</strong> que nos permitirá descargar o subir archivos mientras que nuestra aplicación no esté corriendo. Nos vemos</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.ligasilverlight.com/2011/12/da-25-background-agents/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

