SlideShare una empresa de Scribd logo
Desarrollando mi primera App para
Windows 8 con C#
“Medir el progreso del desarrollo de software por líneas de código es como medir el progreso de
la construcción de un avión por su peso"
-- Bill Gates
El siguiente material se creó con la finalidad de enseñar a desarrollar una aplicación desde 0 para
el nuevo sistema operativo de Microsoft: Windows 8.
Antes de empezar se debe dejar bien claro que NO se pueden crear Apps para Windows 8 si no se
cuenta con este SO instalado en la máquina, además se debe de contar previamente con:

Visual Studio 2012

Una vez teniendo todo instalado, procedemos a generar un nuevo Proyecto, tal y como se muestra
en la siguiente imagen:

Vicente G. Guzmán Lucio
Desarrollador .NET
Nos desplegara la siguiente imagen, en donde nos mostrara un listado de
tipos de plantillas que tenemos para seleccionar, para este Demo elegiremos la que se llama
“Aplicación de cuadricula (XAML)”, le proporcionaremos un nombre y proporcionaremos la ruta
en donde se guardara.

Aplicación de Cuadricula (XAML)
Proyecto de tres páginas de la Tienda Windows que navega entre elementos agrupaos organizados
en una cuadricula. Las páginas dedicadas muestran detalles del grupo y de los elementos.
Si quieres conocer los distintos tipos de plantillas entra al siguiente enlace:
Plantillas de proyecto C#, VB y C++ para aplicaciones de la Tienda Windows

Vicente G. Guzmán Lucio
Desarrollador .NET
Una vez que le demos al botón de Aceptar tendremos una pantalla similar a
esta:

Antes de comenzar a aventar código, identifiquemos las partes más importantes de nuestro
ambiente de trabajo para familiarizarnos.

Vicente G. Guzmán Lucio
Desarrollador .NET
Compilación
Para poder ejecutar nuestro proyecto tenemos primero que compilarlo, esto se puede de realizar
de distintas formas.
En nuestra barra de controles accedemos a “Compilar” y enseguida aparecerá la opción de
“Compilar Solución”, de igual forma nos muestra la forma de hacerlo presionando al mismo
tiempo la combinación de teclas: Ctrl + Mayus + B, aunque en algunas máquinas no puede
funcionar esta combinación, les sugiero intenten Ctrl + Shift + B.
Cabe destacar que conforme vayamos creando o editando algunas partes, estas no se “empatan”
con la solución, para esto también contamos con la opción de “Limpiar Solución”.
En mi experiencia siempre limpio y compilo antes de ejecutar la aplicación.

Después de haber realizado lo anterior, en la parte superior un botón de “play” el cual nos marca
por default “Equipo Local”, esto significa que la aplicación se ejecutara en nuestra máquina.
Nota// Se necesita tener Windows 8, en caso contrario, teniendo esta opción activa no funcionara.

Además de poder ejecutar la App de manera local, el SDK de Visual Studio
nos brinda la opción de compilar en un Simulador o en un Equipo remoto.
Estas dos últimas opciones las conoceremos en el siguiente tutorial.

Vicente G. Guzmán Lucio
Desarrollador .NET
También debemos de conocer la diferencia entre las modalidades de
compilación, las cuales son solo dos: Debug & Release
Debug: esta versión del programa se compila sin optimizar y con toda la información de
depuración simbólica. La optimización complica la depuración, ya que la relación entre el código
fuente y las instrucciones generadas es más compleja.
Release: esta versión del programa no contiene información de depuración simbólica y está
totalmente optimizada. La información de depuración se puede generar en Archivos PDB (C++),
según las opciones del compilador utilizadas. Crear archivos PDB puede ser muy útil si luego
necesita depurar la versión de lanzamiento.
En otras palabras la versión de depuración se genera para la depuración y la versión de
lanzamiento para la distribución final de lanzamiento.

Explorador de Soluciones
En el explorador de soluciones es donde se
encuentra todo lo relacionado a nuestro proyecto,
desde las Referencias, Imágenes y clases.
Aquí podemos ver desde la vista diseño y el código
de cada página o elemento.
GroupedItemsPage.xaml (Design)
GroupedItemsPage.xaml.cs (Code)

Vicente G. Guzmán Lucio
Desarrollador .NET
Abramos la página de GroupedItemsPage, la cual es la principal de nuestro proyecto.
Ahora compilemos nuestro proyecto para poder ver como se encuentra actualmente y comprobar
que no existe ningún error.

En este tutorial veremos cómo crear una App que consume un Feed, y para este demo
utilizaremos el de este portal:
http://geeks.ms/blogs/MainFeed.aspx

Nota//
Para que tu App sea una que se mantenga sola debes de ver que el sitio que quieras utilizar
muestre la siguiente información:
Está viendo una fuente cuyo contenido se actualiza con frecuencia. Las fuentes se agregan a la lista
de fuentes comunes cada vez que se suscribe a ellas. La información actualizada en la fuente se
descarga automáticamente en el equipo y se podrá consultar en Internet Explorer y en otros
programas.

Vicente G. Guzmán Lucio
Desarrollador .NET
Lo primero que editaremos será el archivo de la página
“GroupedItemsPage.xaml.cs”, en el método LoadState.
Antes:

Lo que haremos será decirle al método de carga que añada y muestre todos los elementos que se
puedan extraer del elemento que se encuentra en el “SampleDataSource”, en este caso será
AllGroups.
Despues:
protected override async void LoadState
(Object navigationParameter, Dictionary<String, Object> pageState)
{
this.DefaultViewModel["Groups"] = SampleDataSource.AllGroups;
await SampleDataSource.AddGroupForFeedAsync("http://geeks.ms/blogs/MainFeed.aspx");
}

SampleDataSource: Crea una colección de grupos y elementos con contenido codificado de forma
rígida. SampleDataSource se inicializa con datos marcadores de posición en lugar de con datos de
producción activos, por lo que se proporcionan datos de muestra tanto en el momento del diseño
como en el de la ejecución.
Ahora abriremos el elemento “SampleDataSource.cs” que se encuentra en la carpeta DataModel.

Vicente G. Guzmán Lucio
Desarrollador .NET
Referencias faltantes.
Las referencias son muy importantes a la hora de la creación de algunos métodos y eventos, es por
eso que se deben de agregar si se conocen, en caso contrario se pueden añadir después.
Las que ya se encuentran importadas en nuestro archivo son las siguientes:
using
using
using
using
using
using
using
using
using
using
using
using
using

System;
System.Linq;
System.Collections.Generic;
System.Collections.ObjectModel;
System.ComponentModel;
System.Runtime.CompilerServices;
Windows.ApplicationModel.Resources.Core;
Windows.Foundation;
Windows.Foundation.Collections;
Windows.UI.Xaml.Data;
Windows.UI.Xaml.Media;
Windows.UI.Xaml.Media.Imaging;
System.Collections.Specialized;

Y las que añadiremos serán las siguientes:
using System.IO;
using System.Text.RegularExpressions;

Cuando nos haga falta alguna referencia, al momento de compilar el mismo Visual Studio nos
indica cual es la que no se encuentra.
Por ejemplo:

Solo es cuestión de dar doble click al error y este nos llevara a la línea exacta en el código.
Para poder solucionarlo, solo es de posicionar el cursor en la palabra “Task” y cuando nos
aparezca un cuadrito seleccionamos la primera opción:
using.System.Threading.Tasks;

Vicente G. Guzmán Lucio
Desarrollador .NET
Para resolver el segundo error, repetimos el mismo procedimiento, solo que aquí la referencia que
nos hace falta es la de: using Windows.Web.Syndication;

Y así luce nuestro archivo con todas las referencias:

Vicente G. Guzmán Lucio
Desarrollador .NET
Busquemos la clase sellada SampleDataSource, veremos que contiene una
instancia de la misma.
public sealed class SampleDataSource
{
private static SampleDataSource _sampleDataSource = new SampleDataSource();

Lo que haremos ahora será agregar una colección de objetos SampleDataGroup arriba de la
instancia a la que llamaremos AllGroups, la cual ocuparemos más adelante.
public static readonly ObservableCollection<SampleDataGroup> AllGroups =
new ObservableCollection<SampleDataGroup>();

Las lineas siguientes:
private ObservableCollection<SampleDataGroup> _allGroups = new
ObservableCollection<SampleDataGroup>();
public ObservableCollection<SampleDataGroup> AllGroups
{
get { return this._allGroups; }
}
public static IEnumerable<SampleDataGroup> GetGroups(string uniqueId)
{
if (!uniqueId.Equals("AllGroups")) throw new ArgumentException("Only 'AllGroups' is
supported as a collection of groups");
return _sampleDataSource.AllGroups;
}

Las eliminamos, ya que no las utilizaremos.
Y en las métodos de GetGroup y GetItem lo único que haremos será idenficar
“_sampleDataSource” y lo borramos, para dejar la validación de AllGroups.

Vicente G. Guzmán Lucio
Desarrollador .NET
Así nos debe de quedar hasta el momento:

Ahora si observamos la clase publica de SampleDataSource contiene 6 grupos de ítems ya
definidos por la aplicación, lo que haremos ahora sería cargar los ítems propios de la página que
vamos a leer, en este caso el del Feed, para ello vamos a limpiar el método “SampleDataSource”,
en otras palabras eliminar todo su contenido.
Antes:

Vicente G. Guzmán Lucio
Desarrollador .NET
Después:
public SampleDataSource()
{
}

Para llenar el SampleDataSource vamos a crear un método asíncrono que permita obtener los
ítems de la URL, el cual se llamara “AddGroupForFeedAsync”, cuyo parámetro de entrada será la
cadena de la URL a leer.
Para los que no sepan que es un método asíncrono, este funciona de modo que se obtienen los
datos en una consulta y se refrescan hasta que se genera una nueva.
public static async Task<bool> AddGroupForFeedAsync(string feedUrl)
{
}

Dentro de este método evaluaremos si es posible obtener el grupo de ítems de nuestra URL, en
caso correcto se crearan 2 variables: feed y feedGroup.
if (SampleDataSource.GetGroup(feedUrl) != null) return false;
var feed =
var feedGroup =

La variable feed inicializara un objeto del tipo SyndicationClient para obtener los ítems de la URL. Y
la variable feedGroup inicializara un SampleDataGroup que valida los campos de título, subtitulo e
imagen.
var feed = await new SyndicationClient().RetrieveFeedAsync(new Uri(feedUrl));
var feedGroup = new SampleDataGroup(uniqueId: feedUrl,
title: feed.Title != null ? feed.Title.Text : null,
subtitle: feed.Subtitle != null ? feed.Subtitle.Text : null,
imagePath: feed.ImageUri != null ? feed.ImageUri.ToString(): "/Assets/Logito.jpg",
description: null);

En el campo de imagePath realizamos una simple validación en donde si la nota creada no tiene
imagen o no puede ser mostrada (esto puede ser afectado por su formato o resolución)
mostraremos una local.
Hecho esto recorreremos los ítems de nuestra variable feed para cargar los elementos.
foreach (var i in feed.Items)
{
}

Para esto manipularemos la cadena denominada imagePath, la cual es igual al método
GetImageFromPostContents que crearemos más adelante.
string imagePath = GetImageFromPostContents(i);

Vicente G. Guzmán Lucio
Desarrollador .NET
A continuación validaremos el valor de la cadena, en donde si es igual a nulo
y el elemento de imagen del grupo también, mostremos una imagen definida por nosotros, esto
para que no quede vacío a la hora de ejecución.
if (imagePath == null && feedGroup.Image != null)
imagePath = "/Assets/Logito.jpg";

Después los asignaremos a nuestro feedGroup.
feedGroup.Items.Add(new SampleDataItem(
uniqueId: i.Id, title: i.Title.Text, subtitle: null, imagePath: imagePath,
description: null, content:
Windows.Data.Html.HtmlUtilities.ConvertToText(i.Summary.Text), @group: feedGroup));

Ahora se procede a cargar el feedGroup creado en la vista de la aplicación, el cual es AllGroups.
AllGroups.Add(feedGroup);
return true;

Ya para culminar crearemos un método en el cual obtendremos el formato de las imagenes que
contiene el Feed, y también limpiaremos el contenido (caracteres Unicode) que nos arroje el texto
del mismo.
private static string GetImageFromPostContents(SyndicationItem item)
{
return Regex.Matches(item.Summary.Text,
"hrefs*=s*(?:"(?<1>[^"]*)"|(?<1>S+))", RegexOptions.None)
.Cast<Match>()
.Where(m =>
{
Uri url;
if (Uri.TryCreate(m.Groups[1].Value, UriKind.Absolute, out url))
{
string ext = Path.GetExtension(url.AbsolutePath).ToLower();
if (ext == ".png" || ext == ".jpg") return true;
}
return false;
})
.Select(m => m.Groups[1].Value)
.FirstOrDefault();
}
}

}

Vicente G. Guzmán Lucio
Desarrollador .NET
Añadiendo la imagen faltante.
La ruta que indicamos anteriormente proviene de la carpeta Assets, dentro de esta se
encontrara la imagen que definimos previamente.
Para agregar susodicha imagen (Logito.jpg) solo hagamos click derecho sobre la
carpeta Assets y seleccionemos la opción: Agregar: Elemento existente.

Seleccionamos la imagen y damos en Aceptar.

Nota//La imagen debe de contar con las siguientes medidas: Logito.jpg = 150x150 px.

Vicente G. Guzmán Lucio
Desarrollador .NET
Limpiemos y compilemos para comprobar que no tengamos ningún otro error.
Si no aparece ninguno, solo apretemos F5 y veamos el resultado.

Ya para que luzca un poco mejor cambiemos el nombre que aparece de “App1” por el de
“Noticias Geeks”, vayamos al archivo App.xaml y localicemos la etiqueta que lo contiene.

Vicente G. Guzmán Lucio
Desarrollador .NET
Ctrl + Shift + B y después F5 para poder ver reflejado el cambio.

Si se selecciona cualquier noticia, así es como se muestra la descripción de la misma.

Vicente G. Guzmán Lucio
Desarrollador .NET
Ya con esto hemos terminado el desarrollo de nuestra primera aplicación
para Windows 8, ahora lo que solo nos queda por realizar es darle un buen diseño, agregarle la
barra de Charms en donde se exprese quien la desarrollo e información de contacto, la cual va
dentro del “Acerca de” y estará listo para publicarse en la Store.
Para poder realizar esto último y si son estudiantes favor de mandar un correo a:
mstechsmart@hotmail.com
Comentando que asistieron al taller realizado en Campus Party y que les gustaría poder publicar su
aplicación, el equipo les asignara un código.
Cabe destacar que la continuidad de este material se publicara en el blog:
www.luciomsp.wordpress.com
Así que si gustan poder estar al tanto, solo suscríbanse y automáticamente les llegara a su correo
la publicación del mismo.

Vicente G. Guzmán Lucio
Desarrollador .NET
Bloque de Código Completo
(/DataModel/SampleDataSource.cs)
/// <summary>
/// Crea una colección de grupos y elementos con contenido codificado de forma
rígida.
///
/// SampleDataSource se inicializa con datos de marcadores de posición en lugar de
con datos de producción
/// activos, por lo que se proporcionan datos de muestra tanto en el momento del
diseño como en el de la ejecución.
/// </summary>
public sealed class SampleDataSource
{
public static readonly ObservableCollection<SampleDataGroup> AllGroups =
new ObservableCollection<SampleDataGroup>();
private static SampleDataSource _sampleDataSource = new SampleDataSource();
public static SampleDataGroup GetGroup(string uniqueId)
{
// La búsqueda lineal sencilla es aceptable para conjuntos de datos reducidos
var matches = AllGroups.Where((group) => group.UniqueId.Equals(uniqueId));
if (matches.Count() == 1) return matches.First();
return null;
}
public static SampleDataItem GetItem(string uniqueId)
{
// La búsqueda lineal sencilla es aceptable para conjuntos de datos reducidos
var matches = AllGroups.SelectMany(group => group.Items).Where((item) =>
item.UniqueId.Equals(uniqueId));
if (matches.Count() == 1) return matches.First();
return null;
}
public SampleDataSource()
{
}
public static async Task<bool> AddGroupForFeedAsync(string feedUrl)
{
if (SampleDataSource.GetGroup(feedUrl) != null) return false;
var feed = await new SyndicationClient().RetrieveFeedAsync(new Uri(feedUrl));
var feedGroup = new SampleDataGroup(
uniqueId: feedUrl,
title: feed.Title != null ? feed.Title.Text : null,
subtitle: feed.Subtitle != null ? feed.Subtitle.Text : null,
imagePath: feed.ImageUri != null ? feed.ImageUri.ToString() : "/Assets/Logito.jpg",
description: null);

Vicente G. Guzmán Lucio
Desarrollador .NET
foreach (var i in feed.Items)
{
string imagePath = GetImageFromPostContents(i);
if (imagePath == null && feedGroup.Image != null)
imagePath = "/Assets/Logito.jpg";
feedGroup.Items.Add(new SampleDataItem(
uniqueId: i.Id, title: i.Title.Text, subtitle: null, imagePath: imagePath,
description: null, content:
Windows.Data.Html.HtmlUtilities.ConvertToText(i.Summary.Text), @group: feedGroup));
}
AllGroups.Add(feedGroup);
return true;
}
private static string GetImageFromPostContents(SyndicationItem item)
{
return Regex.Matches(item.Summary.Text,
"hrefs*=s*(?:"(?<1>[^"]*)"|(?<1>S+))",
RegexOptions.None)
.Cast<Match>()
.Where(m =>
{
Uri url;
if (Uri.TryCreate(m.Groups[1].Value, UriKind.Absolute, out url))
{
string ext = Path.GetExtension(url.AbsolutePath).ToLower();
if (ext == ".png" || ext == ".jpg") return true;
}
return false;
})
.Select(m => m.Groups[1].Value)
.FirstOrDefault();
}
}
}

Vicente G. Guzmán Lucio
Desarrollador .NET
¿Preguntas?
@LucioMSP
vguzman@stellasoft.com.mx

Vicente G. Guzmán Lucio
Desarrollador .NET

Más contenido relacionado

La actualidad más candente

Laboratorio desarrollo de aplicaciones WEB con GeneXus Tilo
Laboratorio desarrollo de aplicaciones WEB con GeneXus TiloLaboratorio desarrollo de aplicaciones WEB con GeneXus Tilo
Laboratorio desarrollo de aplicaciones WEB con GeneXus Tilo
GeneXus
 
Manual de aplicaciones moviles
Manual de aplicaciones moviles Manual de aplicaciones moviles
Manual de aplicaciones moviles
Jael Vazquez
 
Responsive smooth user experience y más conozca K2B tools para Evo3
Responsive smooth user experience y más conozca K2B tools para Evo3Responsive smooth user experience y más conozca K2B tools para Evo3
Responsive smooth user experience y más conozca K2B tools para Evo3
GeneXus
 
Tutorial eclipse
Tutorial eclipseTutorial eclipse
Tutorial eclipse
Grisel Hernández
 
Laboratorio GXserver
Laboratorio GXserverLaboratorio GXserver
Laboratorio GXserver
GeneXus
 
Investigacion para agregar una imagen a eclipse
Investigacion para agregar una imagen a eclipseInvestigacion para agregar una imagen a eclipse
Investigacion para agregar una imagen a eclipse
Lucero De La Cruz
 
Taller WP8 en TEC de Monterrey
Taller WP8 en TEC de MonterreyTaller WP8 en TEC de Monterrey
Taller WP8 en TEC de Monterrey
Vicente Gerardo Guzman Lucio
 
Manual de eclipse nuevo
Manual de eclipse nuevoManual de eclipse nuevo
Manual de eclipse nuevo
jesus alanis
 
Folleto de visual basic
Folleto de visual basicFolleto de visual basic
Folleto de visual basic
Renán Javier Gálvez Astudillo
 
File
FileFile

La actualidad más candente (10)

Laboratorio desarrollo de aplicaciones WEB con GeneXus Tilo
Laboratorio desarrollo de aplicaciones WEB con GeneXus TiloLaboratorio desarrollo de aplicaciones WEB con GeneXus Tilo
Laboratorio desarrollo de aplicaciones WEB con GeneXus Tilo
 
Manual de aplicaciones moviles
Manual de aplicaciones moviles Manual de aplicaciones moviles
Manual de aplicaciones moviles
 
Responsive smooth user experience y más conozca K2B tools para Evo3
Responsive smooth user experience y más conozca K2B tools para Evo3Responsive smooth user experience y más conozca K2B tools para Evo3
Responsive smooth user experience y más conozca K2B tools para Evo3
 
Tutorial eclipse
Tutorial eclipseTutorial eclipse
Tutorial eclipse
 
Laboratorio GXserver
Laboratorio GXserverLaboratorio GXserver
Laboratorio GXserver
 
Investigacion para agregar una imagen a eclipse
Investigacion para agregar una imagen a eclipseInvestigacion para agregar una imagen a eclipse
Investigacion para agregar una imagen a eclipse
 
Taller WP8 en TEC de Monterrey
Taller WP8 en TEC de MonterreyTaller WP8 en TEC de Monterrey
Taller WP8 en TEC de Monterrey
 
Manual de eclipse nuevo
Manual de eclipse nuevoManual de eclipse nuevo
Manual de eclipse nuevo
 
Folleto de visual basic
Folleto de visual basicFolleto de visual basic
Folleto de visual basic
 
File
FileFile
File
 

Destacado

Spencer BVI
Spencer BVISpencer BVI
Spencer BVI
chglat
 
2004JE002272_JGR-E_Vol._109_E12004,
2004JE002272_JGR-E_Vol._109_E12004,2004JE002272_JGR-E_Vol._109_E12004,
2004JE002272_JGR-E_Vol._109_E12004,
Jørn A. Jernsletten, Dr.Philos.
 
Construction Estimate, Finding natives
Construction Estimate, Finding nativesConstruction Estimate, Finding natives
Construction Estimate, Finding natives
beverly0bennett8
 
Potts Appraisal ICC Proof of Completion.PDF
Potts Appraisal ICC Proof of Completion.PDFPotts Appraisal ICC Proof of Completion.PDF
Potts Appraisal ICC Proof of Completion.PDFJim Potts MBA
 
Portada.pdf martis
Portada.pdf martisPortada.pdf martis
Portada.pdf martis
marthapaguay
 
Ιουδαϊσμός- Δήμητρα
Ιουδαϊσμός- ΔήμητραΙουδαϊσμός- Δήμητρα
Ιουδαϊσμός- Δήμητρα
teacher88
 
informe
informeinforme
informe
Marco Mora
 
Google's Universal Search: What is it?
Google's Universal Search: What is it?Google's Universal Search: What is it?
Google's Universal Search: What is it?
Robert Silkey
 
ayurved college contai
ayurved college contaiayurved college contai
ayurved college contai
sumansamantaseo
 
Cleri montilla
Cleri montillaCleri montilla
Cleri montilla
Andres Linares
 

Destacado (10)

Spencer BVI
Spencer BVISpencer BVI
Spencer BVI
 
2004JE002272_JGR-E_Vol._109_E12004,
2004JE002272_JGR-E_Vol._109_E12004,2004JE002272_JGR-E_Vol._109_E12004,
2004JE002272_JGR-E_Vol._109_E12004,
 
Construction Estimate, Finding natives
Construction Estimate, Finding nativesConstruction Estimate, Finding natives
Construction Estimate, Finding natives
 
Potts Appraisal ICC Proof of Completion.PDF
Potts Appraisal ICC Proof of Completion.PDFPotts Appraisal ICC Proof of Completion.PDF
Potts Appraisal ICC Proof of Completion.PDF
 
Portada.pdf martis
Portada.pdf martisPortada.pdf martis
Portada.pdf martis
 
Ιουδαϊσμός- Δήμητρα
Ιουδαϊσμός- ΔήμητραΙουδαϊσμός- Δήμητρα
Ιουδαϊσμός- Δήμητρα
 
informe
informeinforme
informe
 
Google's Universal Search: What is it?
Google's Universal Search: What is it?Google's Universal Search: What is it?
Google's Universal Search: What is it?
 
ayurved college contai
ayurved college contaiayurved college contai
ayurved college contai
 
Cleri montilla
Cleri montillaCleri montilla
Cleri montilla
 

Similar a Desarrollando mi primera App para Windows 8 con C#

Manual acceso a datos vb.net
Manual acceso a datos vb.netManual acceso a datos vb.net
Manual acceso a datos vb.net
cedido
 
Herramientas para el desarrollo de aplicaciones SharePoint
Herramientas para el desarrollo de aplicaciones SharePointHerramientas para el desarrollo de aplicaciones SharePoint
Herramientas para el desarrollo de aplicaciones SharePoint
goreorti
 
Code bloks tutorial_terminado
Code bloks tutorial_terminadoCode bloks tutorial_terminado
Code bloks tutorial_terminado
MichelleEspinosa02
 
Code bloks tutorial_terminado
Code bloks tutorial_terminadoCode bloks tutorial_terminado
Code bloks tutorial_terminado
LEFR202
 
Integrando publicidad en nuestras Apps de Windows 8 con JS
Integrando publicidad en nuestras Apps de Windows 8 con JSIntegrando publicidad en nuestras Apps de Windows 8 con JS
Integrando publicidad en nuestras Apps de Windows 8 con JS
Vicente Gerardo Guzman Lucio
 
Tutorial 1 android
Tutorial 1 androidTutorial 1 android
Tutorial 1 android
libidinosa
 
Tutorial aprendiendo a programar
Tutorial aprendiendo a programarTutorial aprendiendo a programar
Tutorial aprendiendo a programar
Eduardo Méndez
 
Tutorial aprendiendo a programar
Tutorial aprendiendo a programarTutorial aprendiendo a programar
Tutorial aprendiendo a programar
blasty2
 
Tutorial aprendiendo a programar
Tutorial aprendiendo a programarTutorial aprendiendo a programar
Tutorial aprendiendo a programar
Juan Hoyos
 
Tutorial aprendiendo a programar
Tutorial aprendiendo a programarTutorial aprendiendo a programar
Tutorial aprendiendo a programar
blasty2
 
Visual basic 6 jose martinez terminado
Visual basic 6 jose martinez terminadoVisual basic 6 jose martinez terminado
Visual basic 6 jose martinez terminado
jose martinez
 
Clases de Programación Android
Clases de Programación AndroidClases de Programación Android
Clases de Programación Android
Jose Alvarado Robles
 
Componentes necesarios de android docx
Componentes necesarios de android  docxComponentes necesarios de android  docx
Componentes necesarios de android docx
grachika
 
Investigacion para agregar una imagen a eclipse
Investigacion para agregar una imagen a eclipseInvestigacion para agregar una imagen a eclipse
Investigacion para agregar una imagen a eclipse
Lucero De La Cruz
 
Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)
javier_ot99
 
Tutorial ASP .NET
Tutorial ASP .NETTutorial ASP .NET
Tutorial ASP .NET
Juan Camilo Sacanamboy
 
Cesnavarra 2008-boletín 2
Cesnavarra 2008-boletín 2Cesnavarra 2008-boletín 2
Cesnavarra 2008-boletín 2
Cein
 
TUTORIAL
TUTORIALTUTORIAL
TUTORIAL
ariannalizeeth
 
Manual de android parte 1
Manual de android parte 1Manual de android parte 1
Manual de android parte 1
ftriana5000
 
bases de datos desde visual basic
bases de datos desde visual basicbases de datos desde visual basic
bases de datos desde visual basic
santiagomario8
 

Similar a Desarrollando mi primera App para Windows 8 con C# (20)

Manual acceso a datos vb.net
Manual acceso a datos vb.netManual acceso a datos vb.net
Manual acceso a datos vb.net
 
Herramientas para el desarrollo de aplicaciones SharePoint
Herramientas para el desarrollo de aplicaciones SharePointHerramientas para el desarrollo de aplicaciones SharePoint
Herramientas para el desarrollo de aplicaciones SharePoint
 
Code bloks tutorial_terminado
Code bloks tutorial_terminadoCode bloks tutorial_terminado
Code bloks tutorial_terminado
 
Code bloks tutorial_terminado
Code bloks tutorial_terminadoCode bloks tutorial_terminado
Code bloks tutorial_terminado
 
Integrando publicidad en nuestras Apps de Windows 8 con JS
Integrando publicidad en nuestras Apps de Windows 8 con JSIntegrando publicidad en nuestras Apps de Windows 8 con JS
Integrando publicidad en nuestras Apps de Windows 8 con JS
 
Tutorial 1 android
Tutorial 1 androidTutorial 1 android
Tutorial 1 android
 
Tutorial aprendiendo a programar
Tutorial aprendiendo a programarTutorial aprendiendo a programar
Tutorial aprendiendo a programar
 
Tutorial aprendiendo a programar
Tutorial aprendiendo a programarTutorial aprendiendo a programar
Tutorial aprendiendo a programar
 
Tutorial aprendiendo a programar
Tutorial aprendiendo a programarTutorial aprendiendo a programar
Tutorial aprendiendo a programar
 
Tutorial aprendiendo a programar
Tutorial aprendiendo a programarTutorial aprendiendo a programar
Tutorial aprendiendo a programar
 
Visual basic 6 jose martinez terminado
Visual basic 6 jose martinez terminadoVisual basic 6 jose martinez terminado
Visual basic 6 jose martinez terminado
 
Clases de Programación Android
Clases de Programación AndroidClases de Programación Android
Clases de Programación Android
 
Componentes necesarios de android docx
Componentes necesarios de android  docxComponentes necesarios de android  docx
Componentes necesarios de android docx
 
Investigacion para agregar una imagen a eclipse
Investigacion para agregar una imagen a eclipseInvestigacion para agregar una imagen a eclipse
Investigacion para agregar una imagen a eclipse
 
Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)Manual de netbeans_7(2)(2)(2)
Manual de netbeans_7(2)(2)(2)
 
Tutorial ASP .NET
Tutorial ASP .NETTutorial ASP .NET
Tutorial ASP .NET
 
Cesnavarra 2008-boletín 2
Cesnavarra 2008-boletín 2Cesnavarra 2008-boletín 2
Cesnavarra 2008-boletín 2
 
TUTORIAL
TUTORIALTUTORIAL
TUTORIAL
 
Manual de android parte 1
Manual de android parte 1Manual de android parte 1
Manual de android parte 1
 
bases de datos desde visual basic
bases de datos desde visual basicbases de datos desde visual basic
bases de datos desde visual basic
 

Más de Vicente Gerardo Guzman Lucio

GPPB2024 - Integrando ChatGPT en Power Automate
GPPB2024 - Integrando ChatGPT en Power AutomateGPPB2024 - Integrando ChatGPT en Power Automate
GPPB2024 - Integrando ChatGPT en Power Automate
Vicente Gerardo Guzman Lucio
 
Introducción a Amazon Alexa.pptx
Introducción a Amazon Alexa.pptxIntroducción a Amazon Alexa.pptx
Introducción a Amazon Alexa.pptx
Vicente Gerardo Guzman Lucio
 
Creando un Chatbot en C# con ChatGPT.pdf
Creando un Chatbot en C# con ChatGPT.pdfCreando un Chatbot en C# con ChatGPT.pdf
Creando un Chatbot en C# con ChatGPT.pdf
Vicente Gerardo Guzman Lucio
 
ChatGPT & Alexa.pptx
ChatGPT & Alexa.pptxChatGPT & Alexa.pptx
ChatGPT & Alexa.pptx
Vicente Gerardo Guzman Lucio
 
Bienvenido .Net MAUI - la evolución de Xamarin.Forms
Bienvenido .Net MAUI - la evolución de Xamarin.FormsBienvenido .Net MAUI - la evolución de Xamarin.Forms
Bienvenido .Net MAUI - la evolución de Xamarin.Forms
Vicente Gerardo Guzman Lucio
 
Conectando un Azure Bot con una Alexa Skill
Conectando un Azure Bot con una Alexa SkillConectando un Azure Bot con una Alexa Skill
Conectando un Azure Bot con una Alexa Skill
Vicente Gerardo Guzman Lucio
 
Azure DevOps y Blazor Web Assembly
Azure DevOps y Blazor Web AssemblyAzure DevOps y Blazor Web Assembly
Azure DevOps y Blazor Web Assembly
Vicente Gerardo Guzman Lucio
 
Desarrollo de Interfaces de Voz: Alexa Skills
Desarrollo de Interfaces de Voz: Alexa SkillsDesarrollo de Interfaces de Voz: Alexa Skills
Desarrollo de Interfaces de Voz: Alexa Skills
Vicente Gerardo Guzman Lucio
 
Blazor vs VUE
Blazor vs VUEBlazor vs VUE
Introducción a Blazor
Introducción a BlazorIntroducción a Blazor
Introducción a Blazor
Vicente Gerardo Guzman Lucio
 
Infraestructura como Código en Azure
Infraestructura como Código en AzureInfraestructura como Código en Azure
Infraestructura como Código en Azure
Vicente Gerardo Guzman Lucio
 
Diseño de Experiencias de Voz con Amazon Alexa
Diseño de Experiencias de Voz con Amazon AlexaDiseño de Experiencias de Voz con Amazon Alexa
Diseño de Experiencias de Voz con Amazon Alexa
Vicente Gerardo Guzman Lucio
 
Alexa Skill con .NETCore & AWS Lambda
Alexa Skill con .NETCore & AWS LambdaAlexa Skill con .NETCore & AWS Lambda
Alexa Skill con .NETCore & AWS Lambda
Vicente Gerardo Guzman Lucio
 
Skills Nights - Vol.III - Primeros Pasos
Skills Nights - Vol.III - Primeros PasosSkills Nights - Vol.III - Primeros Pasos
Skills Nights - Vol.III - Primeros Pasos
Vicente Gerardo Guzman Lucio
 
¿Qué es la Nube?
¿Qué es la Nube?¿Qué es la Nube?
¿Qué es la Nube?
Vicente Gerardo Guzman Lucio
 
Consumiendo un servicio externo con Axios en Alexa
Consumiendo un servicio externo con Axios en AlexaConsumiendo un servicio externo con Axios en Alexa
Consumiendo un servicio externo con Axios en Alexa
Vicente Gerardo Guzman Lucio
 
La era de los Chatbots
La era de los ChatbotsLa era de los Chatbots
La era de los Chatbots
Vicente Gerardo Guzman Lucio
 
Android 64x con Xamarin.Forms
Android 64x con Xamarin.FormsAndroid 64x con Xamarin.Forms
Android 64x con Xamarin.Forms
Vicente Gerardo Guzman Lucio
 
Creando nuestra propia Skill de YouTube
Creando nuestra propia Skill de YouTubeCreando nuestra propia Skill de YouTube
Creando nuestra propia Skill de YouTube
Vicente Gerardo Guzman Lucio
 
Alexa Skill en 5 pasos
Alexa Skill en 5 pasosAlexa Skill en 5 pasos
Alexa Skill en 5 pasos
Vicente Gerardo Guzman Lucio
 

Más de Vicente Gerardo Guzman Lucio (20)

GPPB2024 - Integrando ChatGPT en Power Automate
GPPB2024 - Integrando ChatGPT en Power AutomateGPPB2024 - Integrando ChatGPT en Power Automate
GPPB2024 - Integrando ChatGPT en Power Automate
 
Introducción a Amazon Alexa.pptx
Introducción a Amazon Alexa.pptxIntroducción a Amazon Alexa.pptx
Introducción a Amazon Alexa.pptx
 
Creando un Chatbot en C# con ChatGPT.pdf
Creando un Chatbot en C# con ChatGPT.pdfCreando un Chatbot en C# con ChatGPT.pdf
Creando un Chatbot en C# con ChatGPT.pdf
 
ChatGPT & Alexa.pptx
ChatGPT & Alexa.pptxChatGPT & Alexa.pptx
ChatGPT & Alexa.pptx
 
Bienvenido .Net MAUI - la evolución de Xamarin.Forms
Bienvenido .Net MAUI - la evolución de Xamarin.FormsBienvenido .Net MAUI - la evolución de Xamarin.Forms
Bienvenido .Net MAUI - la evolución de Xamarin.Forms
 
Conectando un Azure Bot con una Alexa Skill
Conectando un Azure Bot con una Alexa SkillConectando un Azure Bot con una Alexa Skill
Conectando un Azure Bot con una Alexa Skill
 
Azure DevOps y Blazor Web Assembly
Azure DevOps y Blazor Web AssemblyAzure DevOps y Blazor Web Assembly
Azure DevOps y Blazor Web Assembly
 
Desarrollo de Interfaces de Voz: Alexa Skills
Desarrollo de Interfaces de Voz: Alexa SkillsDesarrollo de Interfaces de Voz: Alexa Skills
Desarrollo de Interfaces de Voz: Alexa Skills
 
Blazor vs VUE
Blazor vs VUEBlazor vs VUE
Blazor vs VUE
 
Introducción a Blazor
Introducción a BlazorIntroducción a Blazor
Introducción a Blazor
 
Infraestructura como Código en Azure
Infraestructura como Código en AzureInfraestructura como Código en Azure
Infraestructura como Código en Azure
 
Diseño de Experiencias de Voz con Amazon Alexa
Diseño de Experiencias de Voz con Amazon AlexaDiseño de Experiencias de Voz con Amazon Alexa
Diseño de Experiencias de Voz con Amazon Alexa
 
Alexa Skill con .NETCore & AWS Lambda
Alexa Skill con .NETCore & AWS LambdaAlexa Skill con .NETCore & AWS Lambda
Alexa Skill con .NETCore & AWS Lambda
 
Skills Nights - Vol.III - Primeros Pasos
Skills Nights - Vol.III - Primeros PasosSkills Nights - Vol.III - Primeros Pasos
Skills Nights - Vol.III - Primeros Pasos
 
¿Qué es la Nube?
¿Qué es la Nube?¿Qué es la Nube?
¿Qué es la Nube?
 
Consumiendo un servicio externo con Axios en Alexa
Consumiendo un servicio externo con Axios en AlexaConsumiendo un servicio externo con Axios en Alexa
Consumiendo un servicio externo con Axios en Alexa
 
La era de los Chatbots
La era de los ChatbotsLa era de los Chatbots
La era de los Chatbots
 
Android 64x con Xamarin.Forms
Android 64x con Xamarin.FormsAndroid 64x con Xamarin.Forms
Android 64x con Xamarin.Forms
 
Creando nuestra propia Skill de YouTube
Creando nuestra propia Skill de YouTubeCreando nuestra propia Skill de YouTube
Creando nuestra propia Skill de YouTube
 
Alexa Skill en 5 pasos
Alexa Skill en 5 pasosAlexa Skill en 5 pasos
Alexa Skill en 5 pasos
 

Último

Nuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsadNuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsad
larapalaciosmonzon28
 
Sitios web 3.0 funciones ventajas y desventajas
Sitios web 3.0 funciones ventajas y desventajasSitios web 3.0 funciones ventajas y desventajas
Sitios web 3.0 funciones ventajas y desventajas
paulroyal74
 
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
AMADO SALVADOR
 
Actividad Conceptos básicos de programación.pdf
Actividad Conceptos básicos de programación.pdfActividad Conceptos básicos de programación.pdf
Actividad Conceptos básicos de programación.pdf
NajwaNimri1
 
TECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVA
TECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVATECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVA
TECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVA
LilibethEstupian
 
Informació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdfInformació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdf
Festibity
 
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador ValenciaCatalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
AMADO SALVADOR
 
Catalogo general Ariston Amado Salvador distribuidor oficial Valencia
Catalogo general Ariston Amado Salvador distribuidor oficial ValenciaCatalogo general Ariston Amado Salvador distribuidor oficial Valencia
Catalogo general Ariston Amado Salvador distribuidor oficial Valencia
AMADO SALVADOR
 
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfqedublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
larapalaciosmonzon28
 
Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...
Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...
Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...
alejandromanuelve
 
Manual de Soporte y mantenimiento de equipo de cómputos
Manual de Soporte y mantenimiento de equipo de cómputosManual de Soporte y mantenimiento de equipo de cómputos
Manual de Soporte y mantenimiento de equipo de cómputos
cbtechchihuahua
 
IA en entornos rurales aplicada a la viticultura
IA en entornos rurales aplicada a la viticulturaIA en entornos rurales aplicada a la viticultura
IA en entornos rurales aplicada a la viticultura
Miguel Rebollo
 
herramientas de sitio web 3.0 2024
herramientas de sitio web 3.0  2024herramientas de sitio web 3.0  2024
herramientas de sitio web 3.0 2024
julio05042006
 
Informació Projecte Iniciativa TIC SOPRA STERIA.pdf
Informació Projecte Iniciativa TIC SOPRA STERIA.pdfInformació Projecte Iniciativa TIC SOPRA STERIA.pdf
Informació Projecte Iniciativa TIC SOPRA STERIA.pdf
Festibity
 
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor Oficial
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor OficialCatalogo Cajas Fuertes BTV Amado Salvador Distribuidor Oficial
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor Oficial
AMADO SALVADOR
 
SISTESIS RETO4 Grupo4 co-creadores .ppsx
SISTESIS RETO4 Grupo4 co-creadores .ppsxSISTESIS RETO4 Grupo4 co-creadores .ppsx
SISTESIS RETO4 Grupo4 co-creadores .ppsx
tamarita881
 
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial ValenciaCatalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
AMADO SALVADOR
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
MiguelAtencio10
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
doctorsoluciones34
 
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdfProjecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Festibity
 

Último (20)

Nuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsadNuevos tiempos, nuevos espacios.docxdsdsad
Nuevos tiempos, nuevos espacios.docxdsdsad
 
Sitios web 3.0 funciones ventajas y desventajas
Sitios web 3.0 funciones ventajas y desventajasSitios web 3.0 funciones ventajas y desventajas
Sitios web 3.0 funciones ventajas y desventajas
 
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
 
Actividad Conceptos básicos de programación.pdf
Actividad Conceptos básicos de programación.pdfActividad Conceptos básicos de programación.pdf
Actividad Conceptos básicos de programación.pdf
 
TECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVA
TECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVATECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVA
TECLADO ERGONÓMICO Y PANTALLAS TACTILES - GESTIÓN INTEGRAL EDUCATIVA
 
Informació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdfInformació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdf
 
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador ValenciaCatalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
 
Catalogo general Ariston Amado Salvador distribuidor oficial Valencia
Catalogo general Ariston Amado Salvador distribuidor oficial ValenciaCatalogo general Ariston Amado Salvador distribuidor oficial Valencia
Catalogo general Ariston Amado Salvador distribuidor oficial Valencia
 
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfqedublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
 
Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...
Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...
Informe DATA & IA 2024 Primera encuesta sobre el uso de IA en las empresas pe...
 
Manual de Soporte y mantenimiento de equipo de cómputos
Manual de Soporte y mantenimiento de equipo de cómputosManual de Soporte y mantenimiento de equipo de cómputos
Manual de Soporte y mantenimiento de equipo de cómputos
 
IA en entornos rurales aplicada a la viticultura
IA en entornos rurales aplicada a la viticulturaIA en entornos rurales aplicada a la viticultura
IA en entornos rurales aplicada a la viticultura
 
herramientas de sitio web 3.0 2024
herramientas de sitio web 3.0  2024herramientas de sitio web 3.0  2024
herramientas de sitio web 3.0 2024
 
Informació Projecte Iniciativa TIC SOPRA STERIA.pdf
Informació Projecte Iniciativa TIC SOPRA STERIA.pdfInformació Projecte Iniciativa TIC SOPRA STERIA.pdf
Informació Projecte Iniciativa TIC SOPRA STERIA.pdf
 
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor Oficial
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor OficialCatalogo Cajas Fuertes BTV Amado Salvador Distribuidor Oficial
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor Oficial
 
SISTESIS RETO4 Grupo4 co-creadores .ppsx
SISTESIS RETO4 Grupo4 co-creadores .ppsxSISTESIS RETO4 Grupo4 co-creadores .ppsx
SISTESIS RETO4 Grupo4 co-creadores .ppsx
 
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial ValenciaCatalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
 
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdfProjecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
 

Desarrollando mi primera App para Windows 8 con C#

  • 1. Desarrollando mi primera App para Windows 8 con C# “Medir el progreso del desarrollo de software por líneas de código es como medir el progreso de la construcción de un avión por su peso" -- Bill Gates El siguiente material se creó con la finalidad de enseñar a desarrollar una aplicación desde 0 para el nuevo sistema operativo de Microsoft: Windows 8. Antes de empezar se debe dejar bien claro que NO se pueden crear Apps para Windows 8 si no se cuenta con este SO instalado en la máquina, además se debe de contar previamente con: Visual Studio 2012 Una vez teniendo todo instalado, procedemos a generar un nuevo Proyecto, tal y como se muestra en la siguiente imagen: Vicente G. Guzmán Lucio Desarrollador .NET
  • 2. Nos desplegara la siguiente imagen, en donde nos mostrara un listado de tipos de plantillas que tenemos para seleccionar, para este Demo elegiremos la que se llama “Aplicación de cuadricula (XAML)”, le proporcionaremos un nombre y proporcionaremos la ruta en donde se guardara. Aplicación de Cuadricula (XAML) Proyecto de tres páginas de la Tienda Windows que navega entre elementos agrupaos organizados en una cuadricula. Las páginas dedicadas muestran detalles del grupo y de los elementos. Si quieres conocer los distintos tipos de plantillas entra al siguiente enlace: Plantillas de proyecto C#, VB y C++ para aplicaciones de la Tienda Windows Vicente G. Guzmán Lucio Desarrollador .NET
  • 3. Una vez que le demos al botón de Aceptar tendremos una pantalla similar a esta: Antes de comenzar a aventar código, identifiquemos las partes más importantes de nuestro ambiente de trabajo para familiarizarnos. Vicente G. Guzmán Lucio Desarrollador .NET
  • 4. Compilación Para poder ejecutar nuestro proyecto tenemos primero que compilarlo, esto se puede de realizar de distintas formas. En nuestra barra de controles accedemos a “Compilar” y enseguida aparecerá la opción de “Compilar Solución”, de igual forma nos muestra la forma de hacerlo presionando al mismo tiempo la combinación de teclas: Ctrl + Mayus + B, aunque en algunas máquinas no puede funcionar esta combinación, les sugiero intenten Ctrl + Shift + B. Cabe destacar que conforme vayamos creando o editando algunas partes, estas no se “empatan” con la solución, para esto también contamos con la opción de “Limpiar Solución”. En mi experiencia siempre limpio y compilo antes de ejecutar la aplicación. Después de haber realizado lo anterior, en la parte superior un botón de “play” el cual nos marca por default “Equipo Local”, esto significa que la aplicación se ejecutara en nuestra máquina. Nota// Se necesita tener Windows 8, en caso contrario, teniendo esta opción activa no funcionara. Además de poder ejecutar la App de manera local, el SDK de Visual Studio nos brinda la opción de compilar en un Simulador o en un Equipo remoto. Estas dos últimas opciones las conoceremos en el siguiente tutorial. Vicente G. Guzmán Lucio Desarrollador .NET
  • 5. También debemos de conocer la diferencia entre las modalidades de compilación, las cuales son solo dos: Debug & Release Debug: esta versión del programa se compila sin optimizar y con toda la información de depuración simbólica. La optimización complica la depuración, ya que la relación entre el código fuente y las instrucciones generadas es más compleja. Release: esta versión del programa no contiene información de depuración simbólica y está totalmente optimizada. La información de depuración se puede generar en Archivos PDB (C++), según las opciones del compilador utilizadas. Crear archivos PDB puede ser muy útil si luego necesita depurar la versión de lanzamiento. En otras palabras la versión de depuración se genera para la depuración y la versión de lanzamiento para la distribución final de lanzamiento. Explorador de Soluciones En el explorador de soluciones es donde se encuentra todo lo relacionado a nuestro proyecto, desde las Referencias, Imágenes y clases. Aquí podemos ver desde la vista diseño y el código de cada página o elemento. GroupedItemsPage.xaml (Design) GroupedItemsPage.xaml.cs (Code) Vicente G. Guzmán Lucio Desarrollador .NET
  • 6. Abramos la página de GroupedItemsPage, la cual es la principal de nuestro proyecto. Ahora compilemos nuestro proyecto para poder ver como se encuentra actualmente y comprobar que no existe ningún error. En este tutorial veremos cómo crear una App que consume un Feed, y para este demo utilizaremos el de este portal: http://geeks.ms/blogs/MainFeed.aspx Nota// Para que tu App sea una que se mantenga sola debes de ver que el sitio que quieras utilizar muestre la siguiente información: Está viendo una fuente cuyo contenido se actualiza con frecuencia. Las fuentes se agregan a la lista de fuentes comunes cada vez que se suscribe a ellas. La información actualizada en la fuente se descarga automáticamente en el equipo y se podrá consultar en Internet Explorer y en otros programas. Vicente G. Guzmán Lucio Desarrollador .NET
  • 7. Lo primero que editaremos será el archivo de la página “GroupedItemsPage.xaml.cs”, en el método LoadState. Antes: Lo que haremos será decirle al método de carga que añada y muestre todos los elementos que se puedan extraer del elemento que se encuentra en el “SampleDataSource”, en este caso será AllGroups. Despues: protected override async void LoadState (Object navigationParameter, Dictionary<String, Object> pageState) { this.DefaultViewModel["Groups"] = SampleDataSource.AllGroups; await SampleDataSource.AddGroupForFeedAsync("http://geeks.ms/blogs/MainFeed.aspx"); } SampleDataSource: Crea una colección de grupos y elementos con contenido codificado de forma rígida. SampleDataSource se inicializa con datos marcadores de posición en lugar de con datos de producción activos, por lo que se proporcionan datos de muestra tanto en el momento del diseño como en el de la ejecución. Ahora abriremos el elemento “SampleDataSource.cs” que se encuentra en la carpeta DataModel. Vicente G. Guzmán Lucio Desarrollador .NET
  • 8. Referencias faltantes. Las referencias son muy importantes a la hora de la creación de algunos métodos y eventos, es por eso que se deben de agregar si se conocen, en caso contrario se pueden añadir después. Las que ya se encuentran importadas en nuestro archivo son las siguientes: using using using using using using using using using using using using using System; System.Linq; System.Collections.Generic; System.Collections.ObjectModel; System.ComponentModel; System.Runtime.CompilerServices; Windows.ApplicationModel.Resources.Core; Windows.Foundation; Windows.Foundation.Collections; Windows.UI.Xaml.Data; Windows.UI.Xaml.Media; Windows.UI.Xaml.Media.Imaging; System.Collections.Specialized; Y las que añadiremos serán las siguientes: using System.IO; using System.Text.RegularExpressions; Cuando nos haga falta alguna referencia, al momento de compilar el mismo Visual Studio nos indica cual es la que no se encuentra. Por ejemplo: Solo es cuestión de dar doble click al error y este nos llevara a la línea exacta en el código. Para poder solucionarlo, solo es de posicionar el cursor en la palabra “Task” y cuando nos aparezca un cuadrito seleccionamos la primera opción: using.System.Threading.Tasks; Vicente G. Guzmán Lucio Desarrollador .NET
  • 9. Para resolver el segundo error, repetimos el mismo procedimiento, solo que aquí la referencia que nos hace falta es la de: using Windows.Web.Syndication; Y así luce nuestro archivo con todas las referencias: Vicente G. Guzmán Lucio Desarrollador .NET
  • 10. Busquemos la clase sellada SampleDataSource, veremos que contiene una instancia de la misma. public sealed class SampleDataSource { private static SampleDataSource _sampleDataSource = new SampleDataSource(); Lo que haremos ahora será agregar una colección de objetos SampleDataGroup arriba de la instancia a la que llamaremos AllGroups, la cual ocuparemos más adelante. public static readonly ObservableCollection<SampleDataGroup> AllGroups = new ObservableCollection<SampleDataGroup>(); Las lineas siguientes: private ObservableCollection<SampleDataGroup> _allGroups = new ObservableCollection<SampleDataGroup>(); public ObservableCollection<SampleDataGroup> AllGroups { get { return this._allGroups; } } public static IEnumerable<SampleDataGroup> GetGroups(string uniqueId) { if (!uniqueId.Equals("AllGroups")) throw new ArgumentException("Only 'AllGroups' is supported as a collection of groups"); return _sampleDataSource.AllGroups; } Las eliminamos, ya que no las utilizaremos. Y en las métodos de GetGroup y GetItem lo único que haremos será idenficar “_sampleDataSource” y lo borramos, para dejar la validación de AllGroups. Vicente G. Guzmán Lucio Desarrollador .NET
  • 11. Así nos debe de quedar hasta el momento: Ahora si observamos la clase publica de SampleDataSource contiene 6 grupos de ítems ya definidos por la aplicación, lo que haremos ahora sería cargar los ítems propios de la página que vamos a leer, en este caso el del Feed, para ello vamos a limpiar el método “SampleDataSource”, en otras palabras eliminar todo su contenido. Antes: Vicente G. Guzmán Lucio Desarrollador .NET
  • 12. Después: public SampleDataSource() { } Para llenar el SampleDataSource vamos a crear un método asíncrono que permita obtener los ítems de la URL, el cual se llamara “AddGroupForFeedAsync”, cuyo parámetro de entrada será la cadena de la URL a leer. Para los que no sepan que es un método asíncrono, este funciona de modo que se obtienen los datos en una consulta y se refrescan hasta que se genera una nueva. public static async Task<bool> AddGroupForFeedAsync(string feedUrl) { } Dentro de este método evaluaremos si es posible obtener el grupo de ítems de nuestra URL, en caso correcto se crearan 2 variables: feed y feedGroup. if (SampleDataSource.GetGroup(feedUrl) != null) return false; var feed = var feedGroup = La variable feed inicializara un objeto del tipo SyndicationClient para obtener los ítems de la URL. Y la variable feedGroup inicializara un SampleDataGroup que valida los campos de título, subtitulo e imagen. var feed = await new SyndicationClient().RetrieveFeedAsync(new Uri(feedUrl)); var feedGroup = new SampleDataGroup(uniqueId: feedUrl, title: feed.Title != null ? feed.Title.Text : null, subtitle: feed.Subtitle != null ? feed.Subtitle.Text : null, imagePath: feed.ImageUri != null ? feed.ImageUri.ToString(): "/Assets/Logito.jpg", description: null); En el campo de imagePath realizamos una simple validación en donde si la nota creada no tiene imagen o no puede ser mostrada (esto puede ser afectado por su formato o resolución) mostraremos una local. Hecho esto recorreremos los ítems de nuestra variable feed para cargar los elementos. foreach (var i in feed.Items) { } Para esto manipularemos la cadena denominada imagePath, la cual es igual al método GetImageFromPostContents que crearemos más adelante. string imagePath = GetImageFromPostContents(i); Vicente G. Guzmán Lucio Desarrollador .NET
  • 13. A continuación validaremos el valor de la cadena, en donde si es igual a nulo y el elemento de imagen del grupo también, mostremos una imagen definida por nosotros, esto para que no quede vacío a la hora de ejecución. if (imagePath == null && feedGroup.Image != null) imagePath = "/Assets/Logito.jpg"; Después los asignaremos a nuestro feedGroup. feedGroup.Items.Add(new SampleDataItem( uniqueId: i.Id, title: i.Title.Text, subtitle: null, imagePath: imagePath, description: null, content: Windows.Data.Html.HtmlUtilities.ConvertToText(i.Summary.Text), @group: feedGroup)); Ahora se procede a cargar el feedGroup creado en la vista de la aplicación, el cual es AllGroups. AllGroups.Add(feedGroup); return true; Ya para culminar crearemos un método en el cual obtendremos el formato de las imagenes que contiene el Feed, y también limpiaremos el contenido (caracteres Unicode) que nos arroje el texto del mismo. private static string GetImageFromPostContents(SyndicationItem item) { return Regex.Matches(item.Summary.Text, "hrefs*=s*(?:"(?<1>[^"]*)"|(?<1>S+))", RegexOptions.None) .Cast<Match>() .Where(m => { Uri url; if (Uri.TryCreate(m.Groups[1].Value, UriKind.Absolute, out url)) { string ext = Path.GetExtension(url.AbsolutePath).ToLower(); if (ext == ".png" || ext == ".jpg") return true; } return false; }) .Select(m => m.Groups[1].Value) .FirstOrDefault(); } } } Vicente G. Guzmán Lucio Desarrollador .NET
  • 14. Añadiendo la imagen faltante. La ruta que indicamos anteriormente proviene de la carpeta Assets, dentro de esta se encontrara la imagen que definimos previamente. Para agregar susodicha imagen (Logito.jpg) solo hagamos click derecho sobre la carpeta Assets y seleccionemos la opción: Agregar: Elemento existente. Seleccionamos la imagen y damos en Aceptar. Nota//La imagen debe de contar con las siguientes medidas: Logito.jpg = 150x150 px. Vicente G. Guzmán Lucio Desarrollador .NET
  • 15. Limpiemos y compilemos para comprobar que no tengamos ningún otro error. Si no aparece ninguno, solo apretemos F5 y veamos el resultado. Ya para que luzca un poco mejor cambiemos el nombre que aparece de “App1” por el de “Noticias Geeks”, vayamos al archivo App.xaml y localicemos la etiqueta que lo contiene. Vicente G. Guzmán Lucio Desarrollador .NET
  • 16. Ctrl + Shift + B y después F5 para poder ver reflejado el cambio. Si se selecciona cualquier noticia, así es como se muestra la descripción de la misma. Vicente G. Guzmán Lucio Desarrollador .NET
  • 17. Ya con esto hemos terminado el desarrollo de nuestra primera aplicación para Windows 8, ahora lo que solo nos queda por realizar es darle un buen diseño, agregarle la barra de Charms en donde se exprese quien la desarrollo e información de contacto, la cual va dentro del “Acerca de” y estará listo para publicarse en la Store. Para poder realizar esto último y si son estudiantes favor de mandar un correo a: mstechsmart@hotmail.com Comentando que asistieron al taller realizado en Campus Party y que les gustaría poder publicar su aplicación, el equipo les asignara un código. Cabe destacar que la continuidad de este material se publicara en el blog: www.luciomsp.wordpress.com Así que si gustan poder estar al tanto, solo suscríbanse y automáticamente les llegara a su correo la publicación del mismo. Vicente G. Guzmán Lucio Desarrollador .NET
  • 18. Bloque de Código Completo (/DataModel/SampleDataSource.cs) /// <summary> /// Crea una colección de grupos y elementos con contenido codificado de forma rígida. /// /// SampleDataSource se inicializa con datos de marcadores de posición en lugar de con datos de producción /// activos, por lo que se proporcionan datos de muestra tanto en el momento del diseño como en el de la ejecución. /// </summary> public sealed class SampleDataSource { public static readonly ObservableCollection<SampleDataGroup> AllGroups = new ObservableCollection<SampleDataGroup>(); private static SampleDataSource _sampleDataSource = new SampleDataSource(); public static SampleDataGroup GetGroup(string uniqueId) { // La búsqueda lineal sencilla es aceptable para conjuntos de datos reducidos var matches = AllGroups.Where((group) => group.UniqueId.Equals(uniqueId)); if (matches.Count() == 1) return matches.First(); return null; } public static SampleDataItem GetItem(string uniqueId) { // La búsqueda lineal sencilla es aceptable para conjuntos de datos reducidos var matches = AllGroups.SelectMany(group => group.Items).Where((item) => item.UniqueId.Equals(uniqueId)); if (matches.Count() == 1) return matches.First(); return null; } public SampleDataSource() { } public static async Task<bool> AddGroupForFeedAsync(string feedUrl) { if (SampleDataSource.GetGroup(feedUrl) != null) return false; var feed = await new SyndicationClient().RetrieveFeedAsync(new Uri(feedUrl)); var feedGroup = new SampleDataGroup( uniqueId: feedUrl, title: feed.Title != null ? feed.Title.Text : null, subtitle: feed.Subtitle != null ? feed.Subtitle.Text : null, imagePath: feed.ImageUri != null ? feed.ImageUri.ToString() : "/Assets/Logito.jpg", description: null); Vicente G. Guzmán Lucio Desarrollador .NET
  • 19. foreach (var i in feed.Items) { string imagePath = GetImageFromPostContents(i); if (imagePath == null && feedGroup.Image != null) imagePath = "/Assets/Logito.jpg"; feedGroup.Items.Add(new SampleDataItem( uniqueId: i.Id, title: i.Title.Text, subtitle: null, imagePath: imagePath, description: null, content: Windows.Data.Html.HtmlUtilities.ConvertToText(i.Summary.Text), @group: feedGroup)); } AllGroups.Add(feedGroup); return true; } private static string GetImageFromPostContents(SyndicationItem item) { return Regex.Matches(item.Summary.Text, "hrefs*=s*(?:"(?<1>[^"]*)"|(?<1>S+))", RegexOptions.None) .Cast<Match>() .Where(m => { Uri url; if (Uri.TryCreate(m.Groups[1].Value, UriKind.Absolute, out url)) { string ext = Path.GetExtension(url.AbsolutePath).ToLower(); if (ext == ".png" || ext == ".jpg") return true; } return false; }) .Select(m => m.Groups[1].Value) .FirstOrDefault(); } } } Vicente G. Guzmán Lucio Desarrollador .NET