Mostrando las entradas con la etiqueta Curso Windows Phone 7. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Curso Windows Phone 7. Mostrar todas las entradas

martes, abril 01, 2014

[WP8] Como crear un Traductor para Windows Phone 8

Hola a tod@s!

Hoy quiero mostrales como crear un programa que utilice un servicio de traduccion, que es gratis hasta cierto numero de caracteres traducidos en el mes y lo mas importante que esta en la nube.

Para este tutorial vamos a utilizar el servicio de Bing Translator que es una aplicacion en Windows Azure marketplace.

Lo primero que debemos hacer es crear una cuenta de desarrollador en el Windows Azure MarketPlace, a contnuacion los pasois necesarios para acceder al servicio y crea nuestra cuenta de acceso al servicio.

 

Registro en el Windows Azure MarketPlace

Debemos ingresar a la siguiente url: Tienda de Windows Azure

image

Damos clic en el menu superior, en la opcion de la parte derecha que dice “Iniciar Sesion”.

Para el ingreso al marketplace se necesita una cuenta Live ID, si no cuenta con una debe crear una para poder ingresar al portal.

Al escoger la opcion aparece la pantalla para el ingreso utilizando Live ID:

image

Al ingresar los parametros correctos en esta pantalla, nos regresa a la pantalla anterior, pero ya indicando que estamos autenticados en el portal del marketplace de windows azure.

image

En la imagen se puede observar en la barra de menu, en la primera opcion de la izquierda el nombre del usuario autenticado en el sitio web.

Ahora buscamos el servicio “Microsoft Translator API” en Windows Azure Marketplace, para ello vamos a digitar en la caja de búsqueda “translator”

image

Al digitar y dar clic sobre la imagen de la lupa, para lanzar la busqueda, esto nos arroja un resultado que podemos apreciar en la siguiente imagen:

image

El la lista aparece en primer lugar la aplicacion que nos interesa, el servicio de Microsoft Translator, hacemos clic sobre esta opcion en la lista para subscribirnos al servicio.

Lo anterior nos muestra una nueva pantalla en la cual observamos lo siguiente:

image

Como podemos observar, el servicio de traduccion ofrece diferentes valores para diferentes cantidades de caracteres traducidos.

Seleccionamos la primera opcion para nuestro ejemplo.

image

Seleccionamos el check de aceptar las condiciones y se activa el botón de registrarse

image

Luego de registrarnos en el sitio, como se puede apreciar en la imagen anterior, ya podemos regresar a la pagina o pantalla principal del sitio, para ello damos clic sobre el logo rectangular en la parte superior izquierda de “Windows Azure Marketplace”. Nos desplazamos hacia la parte inferior de la pagina, en ella vamos a encontrar varias secciones, ubicamos la seccion de “Desarrollar”, es la columna

image

 

En este menú ubicamos la opcion de Registrar su Aplicación 

 image

Esto nos lleva a la pantalla de registro:

image

El Id de cliente lo rellenamos con un código que identifique nuestra aplicación, el nombre, el nombre de la aplicación o el nuestro, el secreto del cliente es la clave secreta que debemos utilizar en nuestra aplicación, no se debe cambiar, la URI de re direccionamiento debe ser una dirección https que se exige pero no es utilizada por el servicio o por nuestra aplicación, en este caso utilizamos la de Microsoft.

image

Damos clic al botón Crear para crear nuestra aplicación, si en el futuro desea crear nuevas aplicaciones puede ingresar directamente al url https://datamarket.azure.com/developer/applications/register

image

Aparece nuestra aplicación registrada, si tuviéramos varias parecería en esta lista.

 

Consumir el servicio desde Windows Phone 8

Vamos a crear un proyecto de Windows Phone, para ello abrimos Visual Studio 2013, seleccionamos “New Project”, o nuevo proyecto en la pantalla de inicio, o en el menu File (Archivo).

image

Seleccionamos el lenguaje de programacion o desarrollo, ubicamos el tipo de proyecto, en nuestro caso es un proyecto Windows Phone, y seleccionamos la plantilla inicial, la primera de lista.

image

Ahora que ya tenemos nuestra App, iniciemos a cambiar la apariencia de la pantalla, entonces cambiamos el titulo de nuestra aplicacion por “TRADUCTOR ELECTRONICO” en vez de “MY APPLICATION” y “traductor” por “page name”.

En la parte del cuerpo de la página vamos a crear nuestra interface de usuario para la traducción

 

   1:  <StackPanel x:Name="TitlePanel1" Grid.Row="0" Margin="12,17,0,28"/>
   2:   
   3:          <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
   4:              <TextBox x:Name="txtToTrans" HorizontalAlignment="Left" Height="72" 
   5:                   TextWrapping="Wrap" VerticalAlignment="Top" Width="446" 
   6:                   AcceptsReturn="True"/>
   7:              <Button Content="Tranducir" HorizontalAlignment="Left" Margin="10,131,0,0" 
   8:                  VerticalAlignment="Top" Width="436" Click="Button_Click_1"/>
   9:              <RadioButton x:Name="optFrench" Content="Frances" HorizontalAlignment="Left" 
  10:                  Margin="10,59,0,0" VerticalAlignment="Top" IsChecked="True" 
  11:                  Checked="optFrench_Checked"/>
  12:              <RadioButton x:Name="optSpanish" Content="Espanol" HorizontalAlignment="Left" 
  13:                       Margin="150,59,0,0" VerticalAlignment="Top" 
  14:                       Checked="optSpanish_Checked"/>
  15:              <RadioButton x:Name="optGerman" Content="Aleman" HorizontalAlignment="Left" 
  16:                       Margin="296,59,0,0" VerticalAlignment="Top" 
  17:                       Checked="optGerman_Checked"/>
  18:              <TextBlock HorizontalAlignment="Left" Height="31" Margin="28,208,0,0" 
  19:                     TextWrapping="Wrap" Text="Translation:" VerticalAlignment="Top" 
  20:                     Width="117"/>
  21:              <TextBlock x:Name="lblTranslatedText" HorizontalAlignment="Left" Height="208" 
  22:                     Margin="28,257,0,0" TextWrapping="Wrap" VerticalAlignment="Top" 
  23:                     Width="402"/>
  24:              <Button x:Name="btnSpeak" Content="Hablar" HorizontalAlignment="Left" 
  25:                  Margin="28,487,0,0" VerticalAlignment="Top" Width="402" 
  26:                  Click="btnSpeak_Click"/>
  27:          </Grid>



 

Con este código creamos la interface para poder crear nuestra app y se empieza ver de la siguiente forma:

image


Ahora creamos las variables de clase que vamos a necesitar siguiente:

 

   1:          string strLngTo = "fr";
   2:          private static string strTextToTranslate = "";



Y creamos los metodos de respuesta a los radiobuttons y a los botones

 

   1:  private void optFrench_Checked(object sender, RoutedEventArgs e)
   2:          {
   3:              strLngTo = "fr";
   4:          }
   5:   
   6:          private void optSpanish_Checked(object sender, RoutedEventArgs e)
   7:          {
   8:              strLngTo = "es";
   9:          }
  10:   
  11:          private void optGerman_Checked(object sender, RoutedEventArgs e)
  12:          {
  13:              strLngTo = "de";
  14:          }
  15:   
  16:          private void Button_Click_1(object sender, RoutedEventArgs e)
  17:          {
  18:              // Inicializo la variable strTextToTranslate con el contenido de la caja de texto
  19:              strTextToTranslate = txtToTrans.Text;
  20:              // PASO 1: Crear el request para el servicio OAuth
  21:              // get us our access tokens.
  22:              String strTranslatorAccessURI =
  23:                    "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13";
  24:              System.Net.WebRequest req = System.Net.WebRequest.Create(strTranslatorAccessURI);
  25:              req.Method = "POST";
  26:              req.ContentType = "application/x-www-form-urlencoded";
  27:              // Important to note -- the call back here isn't that the request was processed by the server
  28:              // but just that the request is ready for you to do stuff to it (like writing the details)
  29:              // and then post it to the server.
  30:              IAsyncResult writeRequestStreamCallback =
  31:                (IAsyncResult)req.BeginGetRequestStream(new AsyncCallback(RequestStreamReady), req);
  32:   
  33:   
  34:          }
  35:   
  36:          private void RequestStreamReady(IAsyncResult ar)
  37:          {
  38:              // PASO 2: The request stream is ready. Write the request into the POST stream
  39:              string clientID = "RAlvaradoT";                                         //"<<Your Client ID>>";
  40:              string clientSecret = "p4U2PpSU8Ix32uwLWog8J9YQety0tseBujQww nNY8g1";    // "<<Your Client Secret>>";
  41:              String strRequestDetails = string.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com", HttpUtility.UrlEncode(clientID), HttpUtility.UrlEncode(clientSecret));
  42:   
  43:              // note, this isn't a new request -- the original was passed to beginrequeststream, so we're pulling a reference to it back out. It's the same request
  44:   
  45:              System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)ar.AsyncState;
  46:              // now that we have the working request, write the request details into it
  47:              byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strRequestDetails);
  48:              System.IO.Stream postStream = request.EndGetRequestStream(ar);
  49:              postStream.Write(bytes, 0, bytes.Length);
  50:              postStream.Close();
  51:              // now that the request is good to go, let's post it to the server
  52:              // and get the response. When done, the async callback will call the
  53:              // GetResponseCallback function
  54:              request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
  55:          }



Ahora debemos crear el codigo del metodo quye se llama en el callBack

   1:         private void GetResponseCallback(IAsyncResult ar)
   2:          {
   3:              // PASO 3: Process the response callback to get the token
   4:              // we'll then use that token to call the translator service
   5:              // Pull the request out of the IAsynch result
   6:              HttpWebRequest request = (HttpWebRequest)ar.AsyncState;
   7:   
   8:              // The request now has the response details in it (because we've called back having gotten the response
   9:              HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar);
  10:   
  11:              // Using JSON we'll pull the response details out, and load it into an AdmAccess token class (defined earlier in this module)
  12:              // IMPORTANT (and vague) -- despite the name, in Windows Phone, this is in the System.ServiceModel.Web library,
  13:              // and not the System.Runtime.Serialization one -- so you will need to have a reference to System.ServiceModel.Web
  14:              try
  15:              {
  16:                  System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new
  17:                  System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(AdmAccessToken));
  18:                  AdmAccessToken token =
  19:                    (AdmAccessToken)serializer.ReadObject(response.GetResponseStream());
  20:   
  21:                  string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + System.Net.HttpUtility.UrlEncode(strTextToTranslate) + "&from=en&to=" + strLngTo;
  22:                  System.Net.WebRequest translationWebRequest = System.Net.HttpWebRequest.Create(uri);
  23:                  // The authorization header needs to be "Bearer" + " " + the access token
  24:                  string headerValue = "Bearer " + token.access_token;
  25:                  translationWebRequest.Headers["Authorization"] = headerValue;
  26:                  // And now we call the service. When the translation is complete, we'll get the callback
  27:                  IAsyncResult writeRequestStreamCallback = (IAsyncResult)translationWebRequest.BeginGetResponse(new AsyncCallback(translationReady), translationWebRequest);
  28:              }
  29:              catch (Exception ex)
  30:              {
  31:                  // Do nothing
  32:              }
  33:          }



Debemos crear una clase que encapsule los datos del Token retornado por Azure, esta clase la vamos a llamar AdmAccesToken

 

   1:  public class AdmAccessToken
   2:      {
   3:          public string access_token { get; set; }
   4:          public string token_type { get; set; }
   5:          public string expires_in { get; set; }
   6:          public string scope { get; set; }
   7:      }







Estos mismos nombres de las propiedades es como las vamos a utilizer en el JSon devuelto por el servicio

Cuando el API termina la traducción, llamamos el método translationReady, este método es el asociado al evento terminar del API y hace el PARSE o convierte y traduce lso resultados en la salida correcta de nuestra aplicación.

Debemos crear el siguiente código para esto:

   1:          private void translationReady(IAsyncResult ar)
   2:          {
   3:              // PASO 4: Process the translation
   4:              // Get the request details
   5:              HttpWebRequest request = (HttpWebRequest)ar.AsyncState;
   6:   
   7:              // Get the response details
   8:              HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar);
   9:   
  10:              // Read the contents of the response into a string
  11:              System.IO.Stream streamResponse = response.GetResponseStream();
  12:              System.IO.StreamReader streamRead = new System.IO.StreamReader(streamResponse);
  13:              string responseString = streamRead.ReadToEnd();
  14:   
  15:              // Translator returns XML, so load it into an XDocument
  16:              // Note -- you need to add a reference to the System.Linq.XML namespace
  17:              System.Xml.Linq.XDocument xTranslation =
  18:                System.Xml.Linq.XDocument.Parse(responseString);
  19:              string strTest = xTranslation.Root.FirstNode.ToString();
  20:   
  21:              // We're not on the UI thread, so use the dispatcher to update the UI
  22:              Deployment.Current.Dispatcher.BeginInvoke(() => lblTranslatedText.Text = strTest);
  23:   
  24:          }

De esta manera tendremos un traductor personal en nuestro Smart Phone.


Disfrutenlo e inicien a desarrollar su app para Windows Phone 8 que el valor de la subcripcion de la tienda esta muy muy barato.


 


Feliz desarrollo y que Dios guie sus pensamientos para el exito de sus proyectos!


Hasta la proxima!



 



viernes, noviembre 30, 2012

[Evento Virtual] MVP de Colombia

Hola a tod@s!

Hoy quiero invitarlos a estas charlas que realizarán algunos de los MVP de Colombia, en la cual participare con una charla sobre desarrollo para Windows Phone.

Aquí les dejo el flayer:

agenda 2

Las charlas serán 2 por noche y tendrán una duración de 1 hora cada una, hay charlas tanto de infraestructura como de desarrollo.

Aquí los enlaces de cada una de las charlas:

Queries de información de diagnóstico en SQL Server 2012 (Guillermo Taylor)

https://www.livemeeting.com/cc/mvp/join?id=9TMHDJ+role=attend

Novedades Entity Framework 5.0 con Visual Studio 2012 y .NET Framework 4.5 + Entity Framework 6.0 (Jhonnys Lopez)

https://www.livemeeting.com/cc/mvp/join?id=9TMHDJ+role=attend9TMHDJ

Desarrollando Apps para Windows 8, mas facil imposible! (Nicolas Herrera)

https://www.livemeeting.com/cc/mvp/join?id=NQKG2R+role=attendNQKG2R

Mineria de datos con Excel 2013 y SQL 2012 (Alberto Rivera)

https://www.livemeeting.com/cc/mvp/join?id=T3G792+role=attendT3G792

Desarrollo para Windows Phone 8 (Roberto Alvarado)

https://www.livemeeting.com/cc/mvp/join?id=JBK5M5+role=attendJBK5M5

Estilos de trabajo flexible en Windows 8 (Daniel Vargas)

https://www.livemeeting.com/cc/mvp/join?id=4PWQTM+role=attend4PWQTM

Windows Server 2012 y la seguridad (Andres Galvan) Invitado Internacional

https://www.livemeeting.com/cc/mvp/join?id=5PTSBD+role=attend5PTSBD

ASP.NET MVC 4 y Mobile Web Sites (Julio Avellaneda)

https://www.livemeeting.com/cc/mvp/join?id=BMKT3G+role=attendBMKT3G

No se lo pierdan!!!

Hasta la próxima!

lunes, julio 02, 2012

[Programathon WP7] Material de la Programathon

Hola a todo@s,

A continuación les dejo los links para que puedan descargar los pdf de la presentación y el ejemplo que utilizamos para el demo y la explicación de los conceptos vistos en el evento.

 

Aquí las diapositivas de la presentación:

Presentancion Fundamentos Windows Phone

 

Acá la ruta de Skydrive para escargar el codigo ejemplo utilizado:

Descarga del código fuente del demo

 

Cualquier duda adicional con mucho gusto se las tratare de resolver.

 

Hasta una próxima oportunidad:

miércoles, junio 20, 2012

[EVENTO] Windows Phone Professional Programathon

WPProfesionalProgramathon

Hola a tod@s,

Esta vez es para invitarlos este 30 de Junio a una Programathon de Windows Phone, en este momento es solo presencial en Bogotá, Pueden inscribirse en: http://www.meetup.com/BDotNet/events/69979492/

 

Estamos haciendo arreglos para que podamos trasmitirla en video o por Live Meeting, les estaré avisando, o en la misma pagina de meetup les avisare si esto lo logramos.

 

Los espero!!!

Saludos!!!

jueves, mayo 03, 2012

[EVENTO] APPSLAB {Microsoft–NOKIA} VII

Hola, el día de hoy estuvimos en la Universidad Catolica, continuando con la maratón de Windows Phone 7

Las Fotos:

El registro:

DSC05905DSC05904

 

Iniciando….

DSC05911DSC05908

En plena maratón:

DSC05912DSC05909DSC05907

Y el ganador del Nokia Lumia 800:

DSC05915DSC05914DSC05913

martes, mayo 01, 2012

[WP7] Bases de datos Locales en Windows Phone 7.5 (II)

Hola,

 

Hoy vamos a explicar como utilizar nuestra clase DataContext, creada en el post anterior, y vamos ya a crear directamente nuestra aplicación Windows Phone que utilice este DataContext y que podamos tener nuestra base de datos local en nuestro dispositivo.

 

Crear el proyecto de Windows Phone

Lo primero que debemos hacer es crear el proyecto desde Visual Studio para Silverlight para Windows Phone.

El proyecto lo vamos a desarrollar con el lenguaje C#, pero es muy similar hacerlo con VB.NET.

 

Abrimos VS2010 y seleccionamos un proyecto de C# y Silverlight para Windows Phone.

image

Seleccionamos la opción de Nuevo proyecto y nos aparece la pantalla de creación del proyecto:

image

Escribimos el nombre del proyecto y de la solución que vamos a crear para acceder a los datos locales de una base de datos.

Vamos a colocar el nombre a nuestro aplicativo en Windows Phone, para nuestro caso vamos a darle el nombre de AccesoDBWinPhone a nuestro proyecto. Como se aprecia en la siguiente imagen:

image

Al dar clic sobre el botón de OK de la pantalla, nos muestra una pantalla en la que seleccionamos la versión del SDK sobre la cual deseamos trabajar, para poder trabajar con bases de datos locales debemos seleccionar la versión 7.1 del SDK como se muestra en la imagen.

image

Presionamos el botón OK y Visual Studio nos muestra la ventana inicial y una pagina principal que es la página principal de nuestra aplicación.

image

Como se puede apreciar en la imagen, en la parte izquierda aparece la imagen de la pagina como se dibujará en la pantalla de nuestro teléfono, en la parte derecha, encontramos el código XAML que representa todo el diseño de nuestra página de la aplicación.

 

Lo primero que vamos a hacer es cambiar un poco el aspecto de nuestra primera pagina, que también es la principal, para esto vamos a seleccionar el control TextBlock que muestra el texto “MY APPLICATION” vamos a cambiar este titulo de la aplicación por “CODIGO MOBILE”, para esto vamos a cambiar el texto directamente en la ventana de código XAML.

 

Simplemente seleccionamos en la ventana de diseño el control, de inmediato en la ventana de XAML se selecciona el control correspondiente indicando en el código XAML cual es la línea correspondiente.

Vamos a cambiar el titulo de la página a “BD Locales” también haciendo uso de la pantalla de código de XAML.

Luego de hacer estos cambios nuestra pantalla se verá de la siguiente manera:

image

Esta página principal vamos a crear unos botones que nos servirán para realizar las operaciones necesarias en nuestra base de datos.

Vamos a crear un control StackPanel dentro del Grid llamado “ContentPanel” y dentro del StackPanel vamos a crear los botones que necesitaremos para nuestro ejemplo.

Pero antes vamos a utilizar una de las características de Silverlight para Windows Phone muy importantes y fáciles de utilizar que nos ahorran mucho código y que hacen que nuestra interfaz sea consistente, esto lo vamos a lograr creando un estilo, para crear este estilo vamos a abrir el archivo App.Xaml haciendo doble clic sobre el.

Apreciamos el código xaml de este archivo:

<Application 
x:Class="AccesoDBWinPhone.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone">

<!--Application Resources-->
<Application.Resources>
</
Application.Resources>

<
Application.ApplicationLifetimeObjects>
<!--Required object that handles lifetime events for the application-->
<shell:PhoneApplicationService
Launching="Application_Launching" Closing="Application_Closing"
Activated="Application_Activated" Deactivated="Application_Deactivated"/>
</
Application.ApplicationLifetimeObjects>

</
Application>


 



Para crear el estilo lo debemos colocar en la sección <Application.Resources>   con esto logramos que nuestro estilo sea un recurso de la aplicación.



 



Nuestro estilo para tener nuestros botones con fondo Azul quedara de la siguiente manera:



    <!--Application Resources-->
<Application.Resources>
<
Style x:Key="FondoBotones" TargetType="Button">
<
Setter Property="Background" Value="Blue" ></Setter>
</
Style>
</
Application.Resources>



Ya con esto podemos empezar a crear nuestros botones de la pagina principal. Creamos un StackPanel y dentro el primer botón de nuestra aplicación, nuestra pantalla se verá de la siguiente manera:



image



El código XAML a crear es el siguiente:



        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<
StackPanel>
<
Button Width="300" Height="75" Content="Crear Base de Datos"
Style="{StaticResource FondoBotones}"></Button>
</
StackPanel>
</
Grid>



Podemos apreciar en las propiedades del control Button, la propiedad Style como se asocia un estilo creado a un control, en este caso a los Botones de la aplicación. Para estar mas claros en la forma de asignar un estilo a nuestros controles, lo hacemos con este codigo: Style="{StaticResource FondoBotones}">



 



Bien es hora de asociar nuestra clase DataContext creada en el post anterior a nuestro proyecto.



Para hacerlo, simplemente abro el explorador de windows y busco el archivo, lo copio:



image



Luego en el proyecto de VS2010 lo pego:



image



Nuestro proyecto se verá de la siguiente manera:



image



Aquí ya incluimos nuestra clase que representa el DataContext, observen que nuestro archivo DBWinPhone.cs ya aparece dentro de los archivos del proyecto que creamos.



Ahora vamos a escribir el código para el evento click del botón que creamos, para esto hacemos doble clic sobre el botón y la ventana de código se abre. Antes vamos a darle un nombre a nuestro botón para que nuestro código sea mas claro.



Para esto seleccionamos el control de botón y vamos a la ventana de propiedades y le colocamos el nombre del control



image



En nuestro caso le colocamos a nuestro botón btnCrearBD para identificarlo de manera inequívoca, presionamos la tecla ENTER para que quede registrado el nombre.



Ahora en la ventana de diseño, damos doble clic en el botón para abrir la ventana de código, al hacer esto nos muestra la plantilla del método que responde al evento clic del botón.



private void btnCrearBD_Click(object sender, RoutedEventArgs e)
{

}

Como se puede apreciar en el código anterior el nombre del método toma el nombre del control button

y del evento que vamos a programar.



Lo que vamos a colocar aquí es el código para la creación de la base de datos local en nuestro dispositivo.



Pero antes debemos regresar a nuestra clase de Contexto de la base de datos y cambiar el NameSpace que tenga por el correcto:



namespace LocalDBDemo
{
using System.Data.Linq;
using System.Data.Linq.Mapping;



 



Debemos utilizar el NameSpace de nuestro proyecto:



 



namespace AccesoDBWinPhone
{
using System.Data.Linq;
using System.Data.Linq.Mapping;


Ya con este cambio, nuestro contexto de datos que vamos a utilizar para el manejo de la base de datos local en Windows Phone lo podremos acceder desde el codigo de MainPage.xaml.cs



 



Además necesitamos adicionar la referencia al proyecto de System.Data.Linq, sin esto no tendremos el manejo de nuestra clase DataContext agregada antes.



Para esto damos clic derecho sobre la carpeta de References de nuestro proyecto en el Explorador de Soluciones (Solution Explorer).



Roberto Alvarado Taborda - 2012



Esto nos muestra la ventana de los diferentes assemblies y proyectos de la solución para asociar una referencia al proyecto actual.



Aquí buscamos y seleccionamos System.Data.Linq para asignar la referencia al proyecto:



image



Nuestro Explorador de soluciones abrirá la carpeta de referencias si no la tenia abierta y debe lucir como la siguiente imagen:



image



Ahora debemos especificar la cadena de conexión a la base de datos local, esto lo haremos en una constante de tipo string en nuestro código:



        // Cadena de Conexion a la base de datos local
private const string ConnectionString = @"isostore:/DBWinPhone.sdf";




Luego de haber creado la cadena de conexión para nuestra base de datos, ya podemos adicionar el código para la creacion de nuestra base de datos local.



El método quedará de la siguiente manera:



 



private void btnCrearBD_Click(object sender, RoutedEventArgs e)
{
try
{
using (DBWinPhoneDataContext context = new DBWinPhoneDataContext(ConnectionString))
{
if (!context.DatabaseExists())
{
// create database if it does not exist
context.CreateDatabase();
}
}
}
catch (Exception ex)
{
MessageBox.Show("Ha ocurrido un error:" + ex.Message, "Creando Base de Datos",


                MessageBoxButton.OK );
}
}



Como podemos observar en el código utilizamos un bloque using para asegurarnos que los recursos a utilizar se cierren al finalizar el bloque using.



Lo que hacemos en el bloque using es:




  1. Crear una variable que llamamos “context” del tipo de la clase del DataContext adicionado al proyecto.


  2. En la instanciación de la variable, o sea en el new, le pasamos como parámetro la cadena de conexión de la base de datos a utilizar.


  3. Dentro del bloque using, verificamos si la base de datos existe, con la pregunta:


  4. if (!context.DatabaseExists())


  5. Si no existe, se crea la base de datos llamando al método “CreateDatabase()” del contexto.



Algo de lo cual debemos tener presente en este punto es que el Isolated Storage es como una unidad de disco para nuestra aplicación, entonces podremos en la cadena de conexión indicar la ruta en la cual quedará el archivo .sdf de la base de datos.



 



Ahora regresemos a nuestra página xaml y creemos un nuevo botón de Listar Países. Vamos a ir a la ventana de xaml de nuestra pagina ubicamos el código que representa al botón de Crear base de datos y lo copiamos y pegamos para luego modificar y colocar nuestro nuevo botón.



El código del botón quedará de la siguiente manera:



<Button Width="300" Height="75" Content="Listar Países" 
Style="{StaticResource FondoBotones}" Name="btnListarPaises" Click="btnListarPaises_Click">
</Button>



Nuestro panel de diseño de la pagina se verá de la siguiente manera:



image



Ahora vamos a asegurarnos que este asociado el método para el evento click del botón, para esto seleccionamos el botón en la ventana de diseño:



image



Y en nuestra ventana de propiedades, seleccionamos Events en la parte superior del panel, ubicamos el evento Click, si no aparece el nombre del método damos doble click, con eso se crea el método y nos lleva a la ventana del code behind para escribir nuestro código C#.



image





 



Para mostrar la lista de los países vamos a crear un nuevo formulario en el cual mostraremos el listado de los países, para ello hacemos clic derecho sobre el nombre del proyecto y le damos a la opción del menú Add, y luego New Item..



image 



Con esto logramos que aparezca la ventana de nuevos items para nuestro proyecto:



image



En esta ventana vamos a seleccionar la opción de “Windows Phone Portrait Page”, para crear una nueva pagina xaml, el nombre que le vamos a colocar es ListarPaises.xaml.



Cambiamos el texto del textblock ApplicationTitle por “CODIGO MOBILE” y el texto del textblock PageTitle por “listar países”.



Luego vamos al panel de ToolBox y buscamos el control ListBox y lo arrastramos y soltamos sobre el área debajo de los títulos, y lo acomodamos a nuestra página de tal forma que se vea así:



image



Si nos damos cuenta el ListBox esta seleccionado y lo hemos acomodado en la parte inferior del control Grid que muestra nuestra página.



Vamos al panel de propiedades del control ListBox, y le vamos a dar un nombre al control:



image



Ahora vamos a crear los Items del Listbox, para ello lo vamos a hacer desde el código XAML de la página pues vamos a tener mucho más control de lo que queremos realizar.



Vamos a utilizar ListBox.ItemTemplate y dentro de este un DataTemplate, para especificar como queremos se muestren los datos.



Para mostrar los datos vamos a utilizar dos TextBlock uno para el Id del País y otro para el nombre del país, entonces vamos a utilizar un control StackPanel para apilar los controles de manera Horizontal y dentro colocamos los dos textBlock para mostrar los datos, estos dos TextBlock se enlazaran (binding) con los datos a mostrar.



Nuestro Código XAML se verá de la siguiente forma:



<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ListBox Height="481" HorizontalAlignment="Left" Margin="0,120,0,0" Name="lstPaises"
VerticalAlignment="Top" Width="460">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock FontSize="40">
<Run Text="{Binding Id}"/>
<Run Text="{Binding Pais}"/>
</TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>



Ahora debemos crear una clase que nos sirva de Helper o que implemente el patrón facade (Fachada) que interactúe con el contexto y nos devuelva los datos que necesitamos mostrar .



Para ello nuevamente damos clic derecho en el nombre del proyecto en el panel de Explorador de Solución, buscamos la opción Add, en el submenú, buscamos Class…



image



Abre la ventana, y en el nombre de la clase colocamos PaisHelper.cs, con esto nos abre la ventana de código de la clase que acabamos de crear.



Debemos adicionar el using System.Collections.Generic a nuestra clase para poder utilizar las listas genéricas y trasladar nuestros datos en estas colecciones.



Además debemos definir aquí una variable constante que indique la cadena de conexión de nuestra base de datos.



Y por último el método que vamos a llamar GetPaises() el cual usaremos para obtener el listado de países de la tabla.



El código de nuestra clase:



using System.Collections.Generic;

namespace AccesoDBWinPhone
{
public class PaisHelper
{
// Cadena de Conexion a la base de datos local
private const string ConnectionString = @"isostore:/DBWinPhone.sdf";

public static List<Pai> GetPaises()
{
List<Pai> paises = new List<Pai>();
using (var context = new DBWinPhoneDataContext(ConnectionString))
{
if (context.DatabaseExists())
{
Pai pais = new Pai();
foreach (var item in context.Pais)
{
pais = new Pai();
pais.Id = item.Id;
pais.Pais = item.Pais;

paises.Add(pais);
}
}
}
return paises;
}
}
}



Nuestro método devuelve una lista genérica de los países en la tabla de país de la base de datos local de nuestro dispositivo.



Ahora retornamos a nuestra página ListarPaises.xaml para colocar el código.



Para ello mostramos la ventana de código dando clic derecho sobre la página y en el menú contextual que aparece seleccionamos la opción “View code” (ver código).



En el constructor de la página vamos a activar el evento Loaded para que al cargar la página se llene con los datos el ListBox.



image



Escribimos el código de la figura, al llegar el = nos muestra este mensaje, le damos al botón TAB dos (2) veces y se crea la plantilla del evento:



namespace AccesoDBWinPhone
{
public partial class ListarPaises : PhoneApplicationPage
{
public ListarPaises()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(ListarPaises_Loaded);
}

void ListarPaises_Loaded(object sender, RoutedEventArgs e)
{
throw new NotImplementedException();
}
}
}



Ahora vamos a colocar el código correcto en el método ListarPaises_Loaded, vamos a asignar a los items del ListBox la lista genérica que nos devuelve el Helper.




void ListarPaises_Loaded(object sender, RoutedEventArgs e)
{
lstPaises.ItemsSource = PaisHelper.GetPaises();
}



Ahora solo nos falta que desde el botón de la página principal llame a esta página para que nuestro ejemplo funcione.



Regresamos a la página MainPage.xaml y damos doble clic sobre el botón de Listar Paises, esto nos abre la ventana de código.




private void btnListarPaises_Click(object sender, RoutedEventArgs e)
{
// Aqui llamamos a una nueva página para mostrar la lista de los paises
NavigationService.Navigate(new Uri("/ListarPaises.xaml",UriKind.RelativeOrAbsolute));
}





Con esto llamamos a la página que muestra los datos de los países que hay en nuestra tabla de países de la base de datos.



 



Por hoy hasta aquí voy a llegar con este post, en próximos días estaré publicando los post para la creación, modificación y eliminación de registros.



 



Hasta pronto!!!