Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Primeros pasos
¿Qué es Xamarin?
Instalación
Instalación de Xamarin en Windows
Instalación de versiones preliminares de Xamarin (Windows)
Desinstalación de Xamarin desde Visual Studio
Instalación de Visual Studio para Mac
Instalación de versiones preliminares de Xamarin (Mac)
Desinstalación de Visual Studio para Mac
Instrucciones de configuración del firewall para Xamarin
Plataformas compatibles
Primera aplicación
Guías de inicio rápido
Archivo > Nuevo
Varias páginas
Base de datos
Aplicación de estilos
Profundización
Tutoriales
Diseño de pila
Etiqueta
Botón
Entrada de texto
Editor de texto
Imágenes
Diseño de cuadrícula
Listas
Elementos emergentes
Ciclo de vida de la aplicación
Base de datos local
servicios Web
Obtener información sobre Xamarin
Desarrolladores de .NET
Desarrolladores de Java
Desarrolladores de Objective-C
Azure
Guía de desarrollo
¿Qué es Xamarin?
15/04/2020 • 10 minutes to read • Edit Online
Xamarin es una plataforma de código abierto para compilar aplicaciones modernas y con mejor rendimiento para
iOS, Android y Windows con .NET. Xamarin es una capa de abstracción que administra la comunicación de código
compartido con el código de plataforma subyacente. Xamarin se ejecuta en un entorno administrado que
proporciona ventajas como la asignación de memoria y la recolección de elementos no utilizados.
Xamarin permite a los desarrolladores compartir un promedio del 90 % de la aplicación entre plataformas. Este
patrón permite a los desarrolladores escribir toda la lógica de negocios en un solo lenguaje (o reutilizar el código
de aplicación existente), pero conseguir un rendimiento y una apariencia nativos en cada plataforma.
Las aplicaciones de Xamarin se pueden escribir en PC o Mac, y compilar en paquetes de aplicación nativos, como
un archivo .apk en Android o .ipa en iOS.
NOTE
Para la compilación e implementación de aplicaciones para iOS, en la actualidad se necesita un equipo MacOS. Para más
información sobre los requisitos de desarrollo, vea Requisitos del sistema.
Funcionamiento de Xamarin
En el diagrama se muestra la arquitectura general de una aplicación Xamarin multiplataforma. Xamarin permite
crear una interfaz de usuario nativa en cada plataforma y escribir lógica de negocios en C# que se comparte entre
plataformas. En la mayoría de los casos, con Xamarin se puede compartir el 80 % del código de la aplicación.
Xamarin se basa en Mono , una versión de código abierto de .NET Framework que se basa en los estándares ECMA
de .NET. Mono ha existido desde hace casi tanto tiempo como .NET Framework y se ejecuta en la mayoría de
plataformas, como Linux, Unix, FreeBSD y macOS. El entorno de ejecución Mono controla de forma automática
tareas como la asignación de memoria, la recolección de elementos no utilizados y la interoperabilidad con las
plataformas subyacentes.
Para más información sobre la arquitectura específica de la plataforma, vea Xamarin.Android y Xamarin.iOS.
Características agregadas
Xamarin combina las funciones de las plataformas nativas y agrega una serie de características, entre las que se
incluyen las siguientes:
1. Enlaces completos para los SDK subyacentes : Xamarin contiene enlaces para casi todos los SDK de
plataforma subyacentes en iOS y Android. Además, estos enlaces están fuertemente tipados, lo que significa que
la navegación y el uso son fáciles y que proporcionan una sólida comprobación de tipos en tiempo de
compilación y durante el desarrollo. Los enlaces fuertemente tipados producen menos errores en tiempo de
ejecución y aplicaciones de mayor calidad.
2. Interoperabilidad con Objective-C, Java, C y C++ : Xamarin ofrece funciones para invocar directamente
bibliotecas de Objective-C, Java, C y C++, lo que permite usar una amplia variedad de código de terceros. Estas
funciones permiten usar bibliotecas existentes de iOS y Android escritas en Objective-C, Java, C o C++. Además,
Xamarin ofrece proyectos de enlace que permiten enlazar bibliotecas nativas de Objective-C y Java mediante
una sintaxis declarativa.
3. Construcciones de lenguaje moderno : las aplicaciones Xamarin se escriben en C#, un lenguaje moderno
que incluye mejoras considerables con respecto a Objective-C y Java, como características de lenguaje dinámico,
construcciones funcionales como lambdas, LINQ, características de programación en paralelo, genéricos y
mucho más.
4. Biblioteca de clases base (BCL) sólida : las aplicaciones Xamarin usan la BCL de .NET, una gran colección de
clases con características completas y optimizadas, como una compatibilidad eficaz con XML, bases de datos,
serialización, E/S, cadenas, redes, etc. El código de C# existente se puede compilar para usarlo en una aplicación,
lo que proporciona acceso a miles de bibliotecas que agregan funcionalidad más allá de la BCL.
5. Entorno de desarrollo integrado (IDE) moderno : Xamarin usa Visual Studio, un IDE moderno que incluye
características como la finalización automática de código, un sofisticado sistema de administración de proyectos
y soluciones, una exhaustiva biblioteca de plantillas de proyecto, control de código fuente integrado, etc.
6. Compatibilidad multiplataforma móvil : Xamarin ofrece una compatibilidad multiplataforma sofisticada con
las tres principales plataformas: iOS, Android y Windows. Se pueden escribir aplicaciones de modo que
compartan hasta el 90 % del código, y Xamarin.Essentials ofrece una API unificada para acceder a recursos
comunes de las tres plataformas. El código compartido puede reducir considerablemente los costos de
desarrollo y el tiempo de salida al mercado para los desarrolladores para dispositivos móviles.
Xamarin.Android
Las aplicaciones Xamarin.Android se compilan desde C# en lenguaje intermedio (IL) que, después, se compila
Just-in-Time (JIT) en un ensamblado nativo cuando se inicia la aplicación. Las aplicaciones Xamarin.Android se
ejecutan en el entorno de ejecución Mono, en paralelo con la máquina virtual en tiempo de ejecución de Android
(ART). Xamarin proporciona enlaces .NET a los espacios de nombres Android.* y Java.*. El entorno de ejecución
Mono llama a estos espacios de nombres a través de contenedores administrados que se pueden llamar
(MCW) y proporciona a ART contenedores que se pueden llamar de Android (ACW) , lo que permite que
ambos entornos invoquen código entre sí.
Para más información, vea Arquitectura de Xamarin.Android.
Xamarin.iOS
Las aplicaciones Xamarin.iOS se compilan Ahead-of-Time (AOT) de forma completa desde código de C# en
código de ensamblado de ARM nativo. Xamarin usa selectores para exponer Objective-C en código de C#
administrado y registradores para exponer código de C# administrado en Objective-C. Los selectores y
registradores se denominan colectivamente "enlaces" y permiten la comunicación entre Objective-C y C#.
Para más información, vea Arquitectura de Xamarin.iOS.
Xamarin.Essentials
Xamarin.Essentials es una biblioteca que proporciona API multiplataforma para características de dispositivos
nativos. Como sucede con Xamarin, Xamarin.Essentials es una abstracción que simplifica el proceso de acceso a
funciones nativas. Algunos ejemplos de la funcionalidad proporcionada por Xamarin.Essentials son los siguientes:
Información del dispositivo
Sistema de archivos
Acelerómetro
Marcador telefónico
Texto a voz
Bloqueo de pantalla
Para más información, vea Xamarin.Essentials.
Xamarin.Forms
Xamarin.Forms es un marco de interfaz de usuario de código abierto. Xamarin.Forms permite a los desarrolladores
compilar aplicaciones iOS, Android y Windows desde un único código base compartido. Xamarin.Forms permite a
los desarrolladores crear interfaces de usuario en XAML con código subyacente en C#. Estas interfaces de usuario
se representan como controles nativos con mejor rendimiento en cada plataforma. Algunos ejemplos de
características proporcionadas por Xamarin.Forms son los siguientes:
Lenguaje de la interfaz de usuario de XAML
Enlace de datos
Gestos
Efectos
Aplicación de estilos
Para más información, vea Xamarin.Forms.
Primeros pasos
Las guías siguientes le ayudarán a compilar la primera aplicación con Xamarin:
Introducción a Xamarin.Forms
Introducción a Xamarin.Android
Introducción a Xamarin.iOS
Introducción a Xamarin.Mac
Vídeo relacionado
Encuentre más vídeos de Xamarin en Channel 9 y YouTube.
Instalación de Xamarin
15/04/2020 • 4 minutes to read • Edit Online
Cómo configurar Visual Studio y Xamarin para comenzar a crear aplicaciones móviles con .NET.
4. Cuando esté listo para comenzar la instalación de Visual Studio 2019, haga clic en el botón Instalar de la
esquina inferior derecha:
5. Cuando esté listo para comenzar la instalación de Visual Studio 2017, haga clic en el botón Instalar situado
en la esquina inferior derecha:
En función de la edición de Visual Studio 2017 que vaya a instalar, el proceso de instalación puede tardar
bastante tiempo. Puede usar las barras de progreso para supervisar la instalación:
6. Cuando haya finalizado la instalación de Visual Studio 2017, haga clic en el botón Iniciar para iniciar Visual
Studio:
Vínculos relacionados
Desinstalación de Xamarin
Instrucciones de configuración del firewall de Xamarin
Instalación de Xamarin en Visual Studio 2019
15/04/2020 • 3 minutes to read • Edit Online
Instalación
Xamarin se puede instalar como parte de una nueva instalación de Visual Studio 2019, con los pasos siguientes:
1. Descargue Visual Studio 2019 Community, Visual Studio Professional o Visual Studio Enterprise desde la
página de Visual Studio (en la parte inferior se encuentran los vínculos de descarga).
2. Haga doble clic en el paquete descargado para iniciar la instalación.
3. Seleccione la carga de trabajo Desarrollo para dispositivos móviles con .NET en la pantalla de
instalación:
4. Cuando esté listo para comenzar la instalación de Visual Studio 2019, haga clic en el botón Instalar de la
esquina inferior derecha:
5. Cuando haya finalizado la instalación de Visual Studio 2019, haga clic en el botón Iniciar para iniciar Visual
Studio:
Puede hacer clic en Ayuda > Acerca de Microsoft Visual Studio y desplazarse por la lista de productos
instalados para ver si Xamarin está instalado:
Para obtener más información sobre cómo encontrar la información de la versión, consulte Where can I find my
version information and logs? (¿Dónde puedo encontrar los registros y la información de la versión?).
Pasos siguientes
La instalación de Xamarin en Visual Studio 2019 le permite empezar a escribir código para las aplicaciones, pero
requiere configuración adicional para compilar e implementar las aplicaciones en el simulador, el emulador y el
dispositivo. Consulte las siguientes guías para completar la instalación y empezar a compilar aplicaciones
multiplataforma.
iOS
Para obtener información detallada, consulte la guía de instalación de Xamarin.iOS en Windows.
1. Instalación de Visual Studio para Mac
2. Conexión de Visual Studio con el host de compilación del equipo Mac
3. Configuración del desarrollador de iOS: necesaria para ejecutar la aplicación en el dispositivo
4. Simulador remoto de iOS
5. Introducción a Xamarin.iOS para Visual Studio
Android
Para obtener información detallada, consulte la guía de instalación de Xamarin.Android en Windows.
1. Configuración de Xamarin.Android
2. Uso del administrador de Android SDK de Xamarin
3. Emulador de Android SDK
4. Configurar el dispositivo para el desarrollo
Instalación de la versión preliminar de Xamarin en
Windows
15/04/2020 • 2 minutes to read • Edit Online
En Visual Studio 2019 y Visual Studio 2017 no se admiten los canales alfa, beta ni estable de la misma manera que
en versiones anteriores. En su lugar, hay solo dos opciones:
Lanzamiento : equivalente al canal estable en Visual Studio para Mac
Versión preliminar : equivalente a los canales alfa y beta en Visual Studio para Mac
TIP
Para probar las características de versión preliminar, debe descargar el instalador de Visual Studio Preview, que le ofrece la
opción de instalar versiones preliminares de Visual Studio en paralelo con la versión estable (versión de lanzamiento). En
las notas de la versión puede encontrar más información sobre las novedades de Visual Studio 2019.
La versión preliminar de Visual Studio puede contener las versiones preliminares correspondientes de la
funcionalidad de Xamarin, incluidas:
Xamarin.Forms
Xamarin.iOS
Xamarin.Android
Generador de perfiles de Xamarin
Xamarin Inspector
Simulador iOS remoto de Xamarin
La captura de pantalla del instalador de versión preliminar siguiente muestra las opciones de versión
preliminar y lanzamiento (tenga en cuenta los números de versión en gris: la versión 15.0 es de lanzamiento y la
versión 15.1 es una versión preliminar):
Durante el proceso de instalación, se puede aplicar un alias de instalación a la instalación en paralelo (por lo que
pueden distinguirse en el menú Inicio), tal y como se muestra a continuación:
3. En la pestaña Cargas de trabajo , anule la selección de la opción Desarrollo móvil con .NET (en la
sección Dispositivos móviles y juegos ).
Se quiere desinstalar componentes individuales de Xamarin, como el generador de perfiles o los libros, puede
cambiar a la pestaña Componentes individuales en el paso 3 y desactivar componentes específicos:
Para desinstalar completamente Visual Studio 2017, elija Desinstalar en el menú de tres barras que hay junto al
botón Iniciar .
IMPORTANT
Si tiene dos o más instancias de Visual Studio instaladas en paralelo (SxS), como una versión de lanzamiento y una versión
preliminar, es posible que al desinstalar una instancia se quiten algunas funciones de Xamarin de las otras instancias de Visual
Studio, incluidas:
Generador de perfiles de Xamarin
Libros/Inspector de Xamarin
Simulador iOS remoto de Xamarin
SDK de Apple Bonjour
Bajo ciertas condiciones, la desinstalación de una de las instancias SxS puede ocasionar la eliminación incorrecta de estas
características. Esto puede degradar el rendimiento de la plataforma Xamarin en las instancias de Visual Studio que
permanecen en el sistema después de desinstalar la instancia SxS.
Esto se puede resolver mediante la ejecución de la opción Reparación en el instalador de Visual Studio, que volverá a instalar
los componentes que falten.
Elimine el directorio de la caché del componente MEF de Visual Studio, que debería estar en la ubicación siguiente:
%LOCALAPPDATA%\Microsoft\VisualStudio\1*.0\ComponentModelCache
Consulte el directorio Vir tualStore para ver si es posible que Windows haya almacenado allí algún archivo de
superposición para los directorios Extensions\Xamarin o ComponentModelCache :
%LOCALAPPDATA%\VirtualStore
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\SharedDlls
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\1*.0\ExtensionManager\PendingDeletions
Elimine las entradas que parezca que puedan estar relacionadas con Xamarin. Por ejemplo, todo lo que contenga
los términos mono o xamarin .
Abra un símbolo de sistema de administrador cmd.exe y, después, ejecute los comandos devenv /setup y
devenv /updateconfiguration para cada versión instalada de Visual Studio. Por ejemplo, para Visual Studio 2015:
Lista de los hosts que se deben permitir en el firewall para que la plataforma de Xamarin funcione en la empresa.
Para que los productos de Xamarin se instalen y funcionen correctamente, determinados puntos de conexión
deben ser accesibles para descargar las herramientas y las actualizaciones necesarias para el software. Si usted o la
empresa tienen una configuración de firewall estricta, puede experimentar problemas con la instalación, las
licencias, los componentes, etc. En este documento se indican algunos de los puntos de conexión conocidos que se
deben permitir en el firewall para que Xamarin funcione. No se incluyen los puntos de conexión necesarios para las
herramientas de otros fabricantes incluidas en la descarga. Si después de repasar esta lista sigue teniendo
problemas, consulte las guías de solución de problemas de instalación de Apple o Android.
Las aplicaciones de Xamarin.Forms pueden escribirse para los siguientes sistemas operativos:
iOS 9 o versiones posteriores.
Android 4.4 (API 19) o versiones posteriores (más detalles). Pero se recomienda Android 5.0 (API 21) como la
API mínima. Esto garantiza la compatibilidad total con todas las bibliotecas de compatibilidad de Android, a la
vez que se destina a la mayoría de los dispositivos Android.
Plataforma universal de Windows de Windows 10.
Las aplicaciones Xamarin.Forms para iOS, Android y la plataforma universal de Windows (UWP) se pueden
compilar en Visual Studio. Pero se necesita un equipo Mac en red para el desarrollo de iOS con la última versión de
Xcode y la versión mínima de macOS que especifica Apple. Para más información, vea Requisitos de Windows.
Las aplicaciones Xamarin.Forms para iOS y Android se pueden compilar en Visual Studio para Mac. Para más
información, vea Requisitos de macOS.
NOTE
Para desarrollar aplicaciones con Xamarin.Forms es necesario estar familiarizado con .NET Standard.
Vea este vídeo y siga el tutorial para crear una primera aplicación móvil con Xamarin.Forms.
2. Busque "Xamarin" o elija Dispositivos móviles en el menú Tipo de proyecto . Seleccione el tipo de
proyecto Aplicación móvil (Xamarin.Forms) :
3. Elija un nombre de proyecto; en el ejemplo se usa "AwesomeApp":
4. Haga clic en el tipo de proyecto En blanco y asegúrese de que Android e iOS estén seleccionados:
5. Espere hasta que se restauren los paquetes de NuGet (aparecerá un mensaje de "Restauración completada"
en la barra de estado).
6. Las nuevas instalaciones de Visual Studio 2019 no tendrán un emulador de Android configurado. Haga clic
en la flecha desplegable del botón Depurar y elija Crear Android Emulator para iniciar la pantalla de
creación del emulador:
7. En la pantalla de creación del emulador, use la configuración predeterminada y haga clic en el botón Crear :
9. Ahora en Visual Studio 2019 se debería mostrar el nombre del nuevo emulador en el botón Depurar :
10. Haga clic en el botón Depurar para compilar e implementar la aplicación en el emulador de Android:
Personalización de la aplicación
La aplicación se puede personalizar para agregar funcionalidad interactiva. Realice los pasos siguientes para
agregar la interacción del usuario a la aplicación:
1. Edite MainPage.xaml , agregando este XAML antes del final de </StackLayout> :
int count = 0;
void Button_Clicked(object sender, System.EventArgs e)
{
count++;
((Button)sender).Text = $"You clicked {count} times.";
}
NOTE
En la aplicación de ejemplo se incluye la funcionalidad interactiva adicional que no se trata en el vídeo.
2. Asegúrese de que Android y iOS están seleccionados, con uso compartido del código .NET Standard :
3. Espere hasta que se restauren los paquetes de NuGet (aparecerá un mensaje de "Restauración completada"
en la barra de estado).
4. Inicie Android Emulator presionando el botón de depuración (o el elemento de menú Depurar > Iniciar
depuración ).
5. Edite MainPage.xaml , agregando este XAML antes del final de </StackLayout> :
TIP
Es posible crear y depurar la aplicación de iOS desde Visual Studio con un equipo Mac en red. Consulte las
instrucciones de configuración para obtener más información.
4. Inicie Android Emulator presionando el botón de depuración (o Ejecutar > Iniciar depuración ).
5. Edite MainPage.xaml , agregando este XAML antes del final de </StackLayout> :
int count = 0;
void Handle_Clicked(object sender, System.EventArgs e)
{
count++;
((Button)sender).Text = $"You clicked {count} times.";
}
Pasos siguientes
Inicio rápido de una sola página: compilación de una aplicación más funcional.
Ejemplos de Xamarin.Forms: descarga y ejecución de ejemplos de código y aplicaciones de muestra.
Libro electrónico Creación de aplicaciones móviles: capítulos detallados en los que se describe el desarrollo de
Xamarin.Forms, disponible como archivo PDF y que incluye cientos de ejemplos adicionales.
Inicios rápidos de Xamarin.Forms
15/04/2020 • 2 minutes to read • Edit Online
Obtenga información sobre cómo crear aplicaciones para dispositivos móviles con Xamarin.Forms.
Descargar el ejemplo
En este inicio rápido aprenderá a:
Crear una aplicación Xamarin.Forms multiplataforma.
Definir la interfaz de usuario para una página mediante el lenguaje XAML.
Interactuar con los elementos de la interfaz de usuario XAML desde el código.
El inicio rápido le guía sobre cómo crear una aplicación Xamarin.Forms multiplataforma que permite escribir una
nota y conservarla en el almacenamiento del dispositivo. A continuación se muestra la aplicación final:
Requisitos previos
Visual Studio 2019 (última versión), con la carga de trabajo Desarrollo para dispositivos móviles con
.NET instalada.
Conocimientos de C#.
(opcional) Un equipo Mac emparejado para compilar la aplicación en iOS.
Para más información sobre estos requisitos previos, vea Instalación de Xamarin. Para obtener información sobre
cómo conectar Visual Studio 2019 a un host de compilación de Mac, consulte Emparejar con Mac para el
desarrollo de Xamarin.iOS.
3. En el cuadro de diálogo Configure su nuevo proyecto , establezca Nombre del proyecto en Notes ,
elija una ubicación adecuada para el proyecto y haga clic en el botón Crear :
IMPORTANT
Los fragmentos de XAML y C# en este inicio rápido requieren que la solución se denomine Notes . El uso de otro
nombre dará como resultado errores de compilación al copiar el código de este inicio rápido en la solución.
Para obtener más información sobre la biblioteca de .NET Standard creada, vea Anatomía de una aplicación
de Xamarin.Forms en Análisis detallado de inicio rápido de Xamarin.Forms.
5. En el Explorador de soluciones , en el proyecto Notes , haga doble clic en MainPage.xaml para abrirlo:
6. En MainPage.xaml , quite todo el código de plantilla y sustitúyalo por el siguiente código:
Este código define mediante declaración la interfaz de usuario para la página, que consta de una instancia
de Label para mostrar texto, una instancia de Editor para entrada de texto y dos instancias de Button
que dirigen la aplicación para guardar o eliminar un archivo. Las dos instancias de Button se disponen
horizontalmente en Grid , mientras que Label , Editor y Grid se disponen verticalmente en
StackLayout . Para más información sobre la creación de la interfaz de usuario, vea Interfaz de usuario en
Análisis detallado de inicio rápido de Xamarin.Forms.
Guarde los cambios en MainPage.xaml presionando CTRL+S y cierre el archivo.
7. En el Explorador de soluciones , en el proyecto Notes , expanda MainPage.xaml y haga doble clic en
MainPage.xaml.cs para abrirlo:
8. En MainPage.xaml.cs , quite todo el código de plantilla y sustitúyalo por el siguiente código:
using System;
using System.IO;
using Xamarin.Forms;
namespace Notes
{
public partial class MainPage : ContentPage
{
string _fileName =
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "notes.txt");
public MainPage()
{
InitializeComponent();
if (File.Exists(_fileName))
{
editor.Text = File.ReadAllText(_fileName);
}
}
Si hay errores, repita los pasos anteriores y corrija los errores hasta que la solución se compile
correctamente.
2. En la barra de herramientas de Visual Studio, pulse el botón Iniciar (el botón triangular que parece un
botón de reproducción) para iniciar la aplicación en la instancia elegida de Android Emulator:
NOTE
Los pasos siguientes solo deben realizarse si se tiene un equipo Mac emparejado que cumpla los requisitos del
sistema para el desarrollo de Xamarin.Forms.
3. En la barra de herramientas de Visual Studio, haga clic con el botón derecho en el proyecto Notes.iOS y
seleccione Establecer como proyecto de inicio .
4. En la barra de herramientas de Visual Studio, pulse el botón Iniciar (el botón triangular que parece un
botón de reproducción) para iniciar la aplicación en la instancia elegida de iOS Simulator:
IMPORTANT
Los fragmentos de XAML y C# en este inicio rápido requieren que la solución se denomine Notes . El uso de otro
nombre dará como resultado errores de compilación al copiar el código de este inicio rápido en la solución.
3. En el cuadro de diálogo New Cross Platform App (Nueva aplicación multiplataforma), haga clic en
Aplicación en blanco , seleccione .NET Standard como estrategia de código de uso compartido y haga
clic en el botón Aceptar :
Para obtener más información sobre la biblioteca de .NET Standard creada, vea Anatomía de una aplicación
de Xamarin.Forms en Análisis detallado de inicio rápido de Xamarin.Forms.
4. En el Explorador de soluciones , en el proyecto Notes , haga doble clic en MainPage.xaml para abrirlo:
Este código define mediante declaración la interfaz de usuario para la página, que consta de una instancia
de Label para mostrar texto, una instancia de Editor para entrada de texto y dos instancias de Button
que dirigen la aplicación para guardar o eliminar un archivo. Las dos instancias de Button se disponen
horizontalmente en Grid , mientras que Label , Editor y Grid se disponen verticalmente en
StackLayout . Para más información sobre la creación de la interfaz de usuario, vea Interfaz de usuario en
Análisis detallado de inicio rápido de Xamarin.Forms.
Guarde los cambios en MainPage.xaml presionando CTRL+S y cierre el archivo.
6. En el Explorador de soluciones , en el proyecto Notes , expanda MainPage.xaml y haga doble clic en
MainPage.xaml.cs para abrirlo:
7. En MainPage.xaml.cs , quite todo el código de plantilla y sustitúyalo por el siguiente código:
using System;
using System.IO;
using Xamarin.Forms;
namespace Notes
{
public partial class MainPage : ContentPage
{
string _fileName =
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "notes.txt");
public MainPage()
{
InitializeComponent();
if (File.Exists(_fileName))
{
editor.Text = File.ReadAllText(_fileName);
}
}
Este código define un campo _fileName , que hace referencia a un archivo denominado notes.txt que
almacenará los datos de la nota en la carpeta de datos de la aplicación local para la aplicación. Cuando se
ejecuta el constructor de páginas, el archivo se lee, si existe, y se muestra en el Editor . Al presionar el
control Button Guardar , se ejecuta el controlador de eventos OnSaveButtonClicked , que guarda el
contenido de Editor en el archivo. Al presionar el control Button Eliminar , se ejecuta el controlador de
eventos OnDeleteButtonClicked , que elimina el archivo, siempre que exista, y quita cualquier texto de
Editor . Para más información sobre la interacción del usuario, vea Respuesta a la interacción del usuario
en Análisis detallado de inicio rápido de Xamarin.Forms.
Guarde los cambios en MainPage.xaml.cs presionando CTRL+S y cierre el archivo.
Compilar el tutorial rápido
1. En Visual Studio, seleccione el elemento de menú Compilación > Compilar solución (o presione F6). La
solución se compilará y aparecerá un mensaje de operación correcta en la barra de estado de Visual Studio:
Si hay errores, repita los pasos anteriores y corrija los errores hasta que la solución se compile
correctamente.
2. En la barra de herramientas de Visual Studio, pulse el botón Iniciar (el botón triangular que parece un
botón de reproducción) para iniciar la aplicación en la instancia elegida de Android Emulator:
NOTE
Los pasos siguientes solo deben realizarse si se tiene un equipo Mac emparejado que cumpla los requisitos del
sistema para el desarrollo de Xamarin.Forms.
3. En la barra de herramientas de Visual Studio, haga clic con el botón derecho en el proyecto Notes.iOS y
seleccione Establecer como proyecto de inicio .
4. En la barra de herramientas de Visual Studio, pulse el botón Iniciar (el botón triangular que parece un
botón de reproducción) para iniciar la aplicación en la instancia elegida de iOS Simulator:
Para obtener más información sobre la biblioteca de .NET Standard creada, vea Anatomía de una aplicación
de Xamarin.Forms en Análisis detallado de inicio rápido de Xamarin.Forms.
5. En el Panel de solución , en el proyecto Notes , haga doble clic en MainPage.xaml para abrirlo:
Este código define mediante declaración la interfaz de usuario para la página, que consta de una instancia
de Label para mostrar texto, una instancia de Editor para entrada de texto y dos instancias de Button
que dirigen la aplicación para guardar o eliminar un archivo. Las dos instancias de Button se disponen
horizontalmente en Grid , mientras que Label , Editor y Grid se disponen verticalmente en
StackLayout . Para más información sobre la creación de la interfaz de usuario, vea Interfaz de usuario en
Análisis detallado de inicio rápido de Xamarin.Forms.
Guarde los cambios en MainPage.xaml eligiendo Archivo > Guardar (o presionando ⌘ + S ) y cierre el
archivo.
7. En el Panel de solución , en el proyecto Notes , expanda MainPage.xaml y haga doble clic en
MainPage.xaml.cs para abrirlo:
8. En MainPage.xaml.cs , quite todo el código de plantilla y sustitúyalo por el siguiente código:
using System;
using System.IO;
using Xamarin.Forms;
namespace Notes
{
public partial class MainPage : ContentPage
{
string _fileName =
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "notes.txt");
public MainPage()
{
InitializeComponent();
if (File.Exists(_fileName))
{
editor.Text = File.ReadAllText(_fileName);
}
}
Este código define un campo _fileName , que hace referencia a un archivo denominado notes.txt que
almacenará los datos de la nota en la carpeta de datos de la aplicación local para la aplicación. Cuando se
ejecuta el constructor de páginas, el archivo se lee, si existe, y se muestra en el Editor . Al presionar el
control Button Guardar , se ejecuta el controlador de eventos OnSaveButtonClicked , que guarda el
contenido de Editor en el archivo. Al presionar el control Button Eliminar , se ejecuta el controlador de
eventos OnDeleteButtonClicked , que elimina el archivo, siempre que exista, y quita cualquier texto de
Editor . Para más información sobre la interacción del usuario, vea Respuesta a la interacción del usuario
en Análisis detallado de inicio rápido de Xamarin.Forms.
Guarde los cambios en MainPage.xaml.cs eligiendo Archivo > Guardar (o presionando ⌘ + S ) y cierre
el archivo.
Compilación del inicio rápido
1. En Visual Studio para Mac, seleccione el elemento de menú Compilación > Compilar todo (o pulse ⌘ +
B ). El proyecto se compilará y aparecerá un mensaje de operación correcta en la barra de herramientas de
Visual Studio para Mac.
Si hay errores, repita los pasos anteriores y corrija los errores hasta que la solución se compile
correctamente.
2. En el Panel de solución , seleccione el proyecto Notes.iOS , haga clic con el botón derecho y seleccione
Establecer como proyecto de inicio :
3. En la barra de herramientas de Visual Studio para Mac, pulse el botón Iniciar (el botón triangular similar a
un botón de reproducción) para iniciar la aplicación en la instancia elegida de iOS Simulator:
5. En la barra de herramientas de Visual Studio para Mac, pulse el botón Iniciar (el botón triangular similar a
un botón de reproducción) para iniciar la aplicación en la instancia elegida de Android Emulator:
Pasos siguientes
En este inicio rápido ha aprendido a:
Crear una aplicación Xamarin.Forms multiplataforma.
Definir la interfaz de usuario para una página mediante el lenguaje XAML.
Interactuar con los elementos de la interfaz de usuario XAML desde el código.
Para convertir esta aplicación de página única en una de varias páginas, continúe con el siguiente inicio rápido.
Siguiente
Vínculos relacionados
Notes (ejemplo)
Análisis detallado de inicio rápido de Xamarin.Forms
Navegación en una aplicación Xamarin.Forms de
varias páginas
15/04/2020 • 26 minutes to read • Edit Online
Descargar el ejemplo
En este inicio rápido aprenderá a:
Agregar páginas adicionales a una solución de Xamarin.Forms.
Realizar la navegación entre las páginas.
Usar el enlace de datos para sincronizar datos entre los elementos de la interfaz de usuario y su origen de
datos.
En este inicio rápido se describe cómo convertir una aplicación Xamarin.Forms multiplataforma de página única,
capaz de almacenar una sola nota, en una aplicación de varias páginas, capaz de almacenar varias notas. A
continuación se muestra la aplicación final:
Requisitos previos
Antes de intentar este inicio rápido, debe completar correctamente el inicio rápido anterior. También puede
descargar el ejemplo del inicio rápido anterior y usarlo como punto de partida para este.
5. En el cuadro de diálogo Agregar nuevo elemento , seleccione Elementos de Visual C# > Clase , asigne
el nombre Note al nuevo archivo y haga clic en el botón Agregar :
Esto agregará una clase denominada Note a la carpeta Modelos del proyecto Notes .
6. En Note.cs , quite todo el código de plantilla y sustitúyalo por el siguiente:
using System;
namespace Notes.Models
{
public class Note
{
public string Filename { get; set; }
public string Text { get; set; }
public DateTime Date { get; set; }
}
}
Esta clase define un modelo Note que almacenará los datos sobre cada nota en la aplicación.
Presione CTRL+S para guardar los cambios en Note.cs y cierre el archivo.
7. En el Explorador de soluciones , haga clic con el botón derecho en el proyecto Notes y seleccione
Agregar > Nuevo elemento... . En el cuadro de diálogo Agregar nuevo elemento , seleccione
Elementos de Visual C# > Xamarin.Forms > Página de contenido , asigne el nombre
NoteEntr yPage al nuevo archivo y haga clic en el botón Agregar :
Esto agregará una página nueva denominada NoteEntr yPage a la carpeta raíz del proyecto. Esta página
será la segunda de la aplicación.
8. En NoteEntr yPage.xaml , quite todo el código de plantilla y reemplácelo por el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Notes.NoteEntryPage"
Title="Note Entry">
<StackLayout Margin="20">
<Editor Placeholder="Enter your note"
Text="{Binding Text}"
HeightRequest="100" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Button Text="Save"
Clicked="OnSaveButtonClicked" />
<Button Grid.Column="1"
Text="Delete"
Clicked="OnDeleteButtonClicked"/>
</Grid>
</StackLayout>
</ContentPage>
Este código define mediante declaración la interfaz de usuario para la página, que consta de una instancia
de Editor para la entrada de texto y dos instancias de Button que dirigen la aplicación para guardar o
eliminar un archivo. Las dos instancias de Button se disponen horizontalmente en Grid , mientras que
Editor y Grid se disponen en vertical en StackLayout . Además, Editor usa el enlace de datos para
enlazar con la propiedad Text del modelo Note . Para más información sobre el enlace de datos, vea
Enlace de datos en Análisis detallado de inicio rápido de Xamarin.Forms.
Presione CTRL+S para guardar los cambios en NoteEntr yPage.xaml y cierre el archivo.
9. En NoteEntr yPage.xaml.cs , quite todo el código de plantilla y reemplácelo por el siguiente:
using System;
using System.IO;
using Xamarin.Forms;
using Notes.Models;
namespace Notes
{
public partial class NoteEntryPage : ContentPage
{
public NoteEntryPage()
{
InitializeComponent();
}
if (string.IsNullOrWhiteSpace(note.Filename))
{
// Save
var filename = Path.Combine(App.FolderPath, $"{Path.GetRandomFileName()}.notes.txt");
File.WriteAllText(filename, note.Text);
}
else
{
// Update
File.WriteAllText(note.Filename, note.Text);
}
await Navigation.PopAsync();
}
if (File.Exists(note.Filename))
{
File.Delete(note.Filename);
}
await Navigation.PopAsync();
}
}
}
Este código almacena una instancia de Note , que representa una única nota, en el elemento
BindingContext de la página. Cuando se presiona el objeto Button Guardar se ejecuta el controlador de
eventos OnSaveButtonClicked , que guarda el contenido de Editor en un archivo nuevo con un nombre de
archivo generado de forma aleatoria, o bien en un archivo existente si se va a actualizar una nota. En ambos
casos, el archivo se almacena en la carpeta de datos de la aplicación local. Después, el método regresa a la
página anterior. Al pulsar el objeto Button Eliminar , se ejecuta el controlador de eventos
OnDeleteButtonClicked , que elimina el archivo, siempre que exista, y regresa a la página anterior. Para más
información sobre la navegación, vea Navegación en Análisis detallado de inicio rápido de Xamarin.Forms.
Presione CTRL+S para guardar los cambios en NoteEntr yPage.xaml.cs y cierre el archivo.
WARNING
Si en este momento intenta compilar la aplicación, se producirán errores que se corregirán en pasos posteriores.
10. En el Explorador de soluciones , haga clic con el botón derecho en el proyecto Notes y seleccione
Agregar > Nuevo elemento... . En el cuadro de diálogo Agregar nuevo elemento , seleccione
Elementos de Visual C# > Xamarin.Forms > Página de contenido , asigne el nombre NotesPage al
nuevo archivo y haga clic en el botón Agregar .
Esto agregará una página nueva denominada NotesPage a la carpeta raíz del proyecto. Esta página será la
página raíz de la aplicación.
11. En NotesPage.xaml , quite todo el código de plantilla y sustitúyalo por el siguiente:
Este código define mediante declaración la interfaz de usuario de la página, que consiste en los objetos
ListView y ToolbarItem . En ListView se usa el enlace de datos para mostrar las notas recuperadas por la
aplicación y, al seleccionar una nota, se navegará a NoteEntryPage donde la nota se puede modificar. Como
alternativa, se puede presionar el objeto ToolbarItem para crear una nota. Para más información sobre el
enlace de datos, vea Enlace de datos en Análisis detallado de inicio rápido de Xamarin.Forms.
Presione CTRL+S para guardar los cambios en NotesPage.xaml y cierre el archivo.
12. En NotesPage.xaml.cs , quite todo el código de plantilla y sustitúyalo por el siguiente:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Xamarin.Forms;
using Notes.Models;
namespace Notes
{
public partial class NotesPage : ContentPage
{
public NotesPage()
{
InitializeComponent();
}
listView.ItemsSource = notes
.OrderBy(d => d.Date)
.ToList();
}
Este código define la funcionalidad de NotesPage . Cuando aparece la página, se ejecuta el método
OnAppearing , que rellena el objeto ListView con las notas que se han recuperado de la carpeta de datos de
la aplicación local. Cuando se presiona ToolbarItem , se ejecuta el controlador de eventos
OnNoteAddedClicked . Este método navega hasta NoteEntryPage , y establece el elemento BindingContext de
NoteEntryPage en una instancia nueva de Note . Cuando se selecciona un elemento de ListView , se ejecuta
el controlador de eventos OnListViewItemSelected . Este método navega hasta NoteEntryPage , y establece el
elemento BindingContext de NoteEntryPage en la instancia de Note seleccionada. Para más información
sobre la navegación, vea Navegación en Análisis detallado de inicio rápido de Xamarin.Forms.
Presione CTRL+S para guardar los cambios en NotesPage.xaml.cs y cierre el archivo.
WARNING
Si en este momento intenta compilar la aplicación, se producirán errores que se corregirán en pasos posteriores.
13. En el Explorador de soluciones , haga doble clic en App.xaml.cs para abrirlo. Después, reemplace el
código existente con el siguiente:
using System;
using System.IO;
using Xamarin.Forms;
namespace Notes
{
public partial class App : Application
{
public static string FolderPath { get; private set; }
public App()
{
InitializeComponent();
FolderPath =
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));
MainPage = new NavigationPage(new NotesPage());
}
// ...
}
}
Este código agrega una declaración de espacio de nombres para el espacio de nombres System.IO y una
declaración para una propiedad FolderPath estática de tipo string . La propiedad FolderPath se usa para
almacenar la ruta de acceso en el dispositivo en el que se almacenarán los datos de la nota. Además, el
código inicializa la propiedad FolderPath en el constructor App e inicializa la propiedad MainPage para
que sea un elemento NavigationPage que hospede una instancia de NotesPage . Para más información
sobre la navegación, vea Navegación en Análisis detallado de inicio rápido de Xamarin.Forms.
Guarde los cambios en App.xaml.cs presionando CTRL+S y cierre el archivo.
14. En el Explorador de soluciones , en el proyecto Notes , haga clic con el botón derecho en
MainPage.xaml y seleccione Eliminar . En el cuadro de diálogo que aparece, presione el botón Aceptar
para quitar el archivo del disco duro.
Esto quita una página que ya no se usa.
15. Compile y ejecute el proyecto en cada plataforma. Para más información, vea Compilación del inicio rápido.
En NotesPage presione el botón + para ir hasta NoteEntr yPage y escriba una nota. Después de guardar
la nota, la aplicación volverá a NotesPage .
Escriba un número de notas, de longitud variable, para observar el comportamiento de la aplicación.
2. En el Panel de solución , seleccione el proyecto Notes , haga clic con el botón derecho y seleccione
Agregar > Nueva carpeta :
5. En el cuadro de diálogo Nuevo archivo , seleccione General > Clase vacía , asigne el nombre Note al
nuevo archivo y haga clic en el botón Nuevo :
Esto agregará una clase denominada Note a la carpeta Modelos del proyecto Notes .
6. En Note.cs , quite todo el código de plantilla y sustitúyalo por el siguiente:
using System;
namespace Notes.Models
{
public class Note
{
public string Filename { get; set; }
public string Text { get; set; }
public DateTime Date { get; set; }
}
}
Esta clase define un modelo Note que almacenará los datos sobre cada nota en la aplicación.
Para guardar los cambios en Note.cs , seleccione Archivo > Guardar (o bien presione ⌘ + S ) y cierre el
archivo.
7. En el Panel de solución , seleccione el proyecto Notes , haga clic con el botón derecho y seleccione
Agregar > Nuevo archivo . En el cuadro de diálogo Nuevo archivo , seleccione Formularios > XAML
ContentPage de Forms , asigne el nombre NoteEntr yPage al nuevo archivo, y haga clic en el botón
Nuevo :
Esto agregará una página nueva denominada NoteEntr yPage a la carpeta raíz del proyecto. Esta página
será la segunda de la aplicación.
8. En NoteEntr yPage.xaml , quite todo el código de plantilla y reemplácelo por el siguiente:
Este código define mediante declaración la interfaz de usuario para la página, que consta de una instancia
de Editor para la entrada de texto y dos instancias de Button que dirigen la aplicación para guardar o
eliminar un archivo. Las dos instancias de Button se disponen horizontalmente en Grid , mientras que
Editor y Grid se disponen en vertical en StackLayout . Además, Editor usa el enlace de datos para
enlazar con la propiedad Text del modelo Note . Para más información sobre el enlace de datos, vea
Enlace de datos en Análisis detallado de inicio rápido de Xamarin.Forms.
Para guardar los cambios en NoteEntr yPage.xaml , seleccione Archivo > Guardar (o bien presione ⌘ +
S ) y cierre el archivo.
9. En NoteEntr yPage.xaml.cs , quite todo el código de plantilla y reemplácelo por el siguiente:
using System;
using System.IO;
using Xamarin.Forms;
using Notes.Models;
namespace Notes
{
public partial class NoteEntryPage : ContentPage
{
public NoteEntryPage()
{
InitializeComponent();
}
if (string.IsNullOrWhiteSpace(note.Filename))
{
// Save
var filename = Path.Combine(App.FolderPath, $"{Path.GetRandomFileName()}.notes.txt");
File.WriteAllText(filename, note.Text);
}
else
{
// Update
File.WriteAllText(note.Filename, note.Text);
}
await Navigation.PopAsync();
}
if (File.Exists(note.Filename))
{
File.Delete(note.Filename);
}
await Navigation.PopAsync();
}
}
}
Este código almacena una instancia de Note , que representa una única nota, en el elemento
BindingContext de la página. Cuando se presiona el objeto Button Guardar se ejecuta el controlador de
eventos OnSaveButtonClicked , que guarda el contenido de Editor en un archivo nuevo con un nombre de
archivo generado de forma aleatoria, o bien en un archivo existente si se va a actualizar una nota. En ambos
casos, el archivo se almacena en la carpeta de datos de la aplicación local. Después, el método regresa a la
página anterior. Al pulsar el objeto Button Eliminar , se ejecuta el controlador de eventos
OnDeleteButtonClicked , que elimina el archivo, siempre que exista, y regresa a la página anterior. Para más
información sobre la navegación, vea Navegación en Análisis detallado de inicio rápido de Xamarin.Forms.
Para guardar los cambios en NoteEntr yPage.xaml.cs , seleccione Archivo > Guardar (o bien presione ⌘
+ S ) y cierre el archivo.
WARNING
Si en este momento intenta compilar la aplicación, se producirán errores que se corregirán en pasos posteriores.
10. En el Panel de solución , seleccione el proyecto Notes , haga clic con el botón derecho y seleccione
Agregar > Nuevo archivo . En el cuadro de diálogo Nuevo archivo , seleccione Formularios > XAML
ContentPage de Forms , asigne el nombre NotesPage al nuevo archivo y haga clic en el botón Nuevo .
Esto agregará una página nueva denominada NotesPage a la carpeta raíz del proyecto. Esta página será la
página raíz de la aplicación.
11. En NotesPage.xaml , quite todo el código de plantilla y sustitúyalo por el siguiente:
Este código define mediante declaración la interfaz de usuario de la página, que consiste en los objetos
ListView y ToolbarItem . En ListView se usa el enlace de datos para mostrar las notas recuperadas por la
aplicación y, al seleccionar una nota, se navegará a NoteEntryPage donde la nota se puede modificar. Como
alternativa, se puede presionar el objeto ToolbarItem para crear una nota. Para más información sobre el
enlace de datos, vea Enlace de datos en Análisis detallado de inicio rápido de Xamarin.Forms.
Para guardar los cambios en NotesPage.xaml , seleccione Archivo > Guardar (o bien presione ⌘ + S ) y
cierre el archivo.
12. En NotesPage.xaml.cs , quite todo el código de plantilla y sustitúyalo por el siguiente:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Xamarin.Forms;
using Notes.Models;
namespace Notes
{
public partial class NotesPage : ContentPage
{
public NotesPage()
{
InitializeComponent();
}
listView.ItemsSource = notes
.OrderBy(d => d.Date)
.ToList();
}
Este código define la funcionalidad de NotesPage . Cuando aparece la página, se ejecuta el método
OnAppearing , que rellena el objeto ListView con las notas que se han recuperado de la carpeta de datos de
la aplicación local. Cuando se presiona ToolbarItem , se ejecuta el controlador de eventos
OnNoteAddedClicked . Este método navega hasta NoteEntryPage , y establece el elemento BindingContext de
NoteEntryPage en una instancia nueva de Note . Cuando se selecciona un elemento de ListView , se ejecuta
el controlador de eventos OnListViewItemSelected . Este método navega hasta NoteEntryPage , y establece el
elemento BindingContext de NoteEntryPage en la instancia de Note seleccionada. Para más información
sobre la navegación, vea Navegación en Análisis detallado de inicio rápido de Xamarin.Forms.
Para guardar los cambios en NotesPage.xaml.cs , seleccione Archivo > Guardar (o bien presione ⌘ +
S ) y cierre el archivo.
WARNING
Si en este momento intenta compilar la aplicación, se producirán errores que se corregirán en pasos posteriores.
13. En el Panel de solución , haga doble clic en App.xaml.cs para abrirlo. Después, reemplace el código
existente con el siguiente:
using System;
using System.IO;
using Xamarin.Forms;
namespace Notes
{
public partial class App : Application
{
public static string FolderPath { get; private set; }
public App()
{
InitializeComponent();
FolderPath =
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));
MainPage = new NavigationPage(new NotesPage());
}
// ...
}
}
Este código agrega una declaración de espacio de nombres para el espacio de nombres System.IO y una
declaración para una propiedad FolderPath estática de tipo string . La propiedad FolderPath se usa para
almacenar la ruta de acceso en el dispositivo en el que se almacenarán los datos de la nota. Además, el
código inicializa la propiedad FolderPath en el constructor App e inicializa la propiedad MainPage para
que sea un elemento NavigationPage que hospede una instancia de NotesPage . Para más información
sobre la navegación, vea Navegación en Análisis detallado de inicio rápido de Xamarin.Forms.
Guarde los cambios en App.xaml.cs eligiendo Archivo > Guardar (o presionando ⌘ + S ) y cierre el
archivo.
14. En el Panel de solución , en el proyecto Notes , haga clic con el botón derecho en MainPage.xaml y
seleccione Quitar . En el cuadro de diálogo que aparece, presione el botón Eliminar para quitar el archivo
del disco duro.
Esto quita una página que ya no se usa.
15. Compile y ejecute el proyecto en cada plataforma. Para más información, vea Compilación del inicio rápido.
En NotesPage presione el botón + para ir hasta NoteEntr yPage y escriba una nota. Después de guardar
la nota, la aplicación volverá a NotesPage .
Escriba un número de notas, de longitud variable, para observar el comportamiento de la aplicación.
Pasos siguientes
En este inicio rápido ha aprendido a:
Agregar páginas adicionales a una solución de Xamarin.Forms.
Realizar la navegación entre las páginas.
Usar el enlace de datos para sincronizar datos entre los elementos de la interfaz de usuario y su origen de
datos.
Para modificar la aplicación de modo que almacene sus datos en una base de datos de SQLite.NET local, continúe
con el inicio rápido siguiente.
Siguiente
Vínculos relacionados
Notes (ejemplo)
Análisis detallado de inicio rápido de Xamarin.Forms
Almacenamiento de datos en una base de datos de
SQLite.NET local
15/04/2020 • 18 minutes to read • Edit Online
Descargar el ejemplo
En este inicio rápido aprenderá a:
Usar el Administrador de paquetes de NuGet para agregar un paquete NuGet a un proyecto.
Almacenar datos de forma local en una base de datos de SQLite.NET.
En el inicio rápido se le guía sobre cómo almacenar datos en una base de datos de SQLite.NET local. A
continuación se muestra la aplicación final:
Requisitos previos
Antes de intentar este inicio rápido, debe completar correctamente el inicio rápido anterior. También puede
descargar el ejemplo del inicio rápido anterior y usarlo como punto de partida para este.
NOTE
Hay varios paquetes NuGet con nombres similares. El paquete correcto tiene estos atributos:
Autores: Frank A. Krueger
Id.: sqlite-net-pcl
Vínculo de NuGet: sqlite-net-pcl
A pesar del nombre del paquete, este paquete NuGet puede usarse en proyectos de .NET Standard.
namespace Notes.Models
{
public class Note
{
[PrimaryKey, AutoIncrement]
public int ID { get; set; }
public string Text { get; set; }
public DateTime Date { get; set; }
}
}
Esta clase define un modelo Note que almacenará los datos sobre cada nota en la aplicación. La propiedad
ID está marcada con los atributos PrimaryKey y AutoIncrement para garantizar que cada instancia de
Note en la base de datos de SQLite.NET tenga un identificador único proporcionado por SQLite.NET.
WARNING
Si en este momento intenta compilar la aplicación, se producirán errores que se corregirán en pasos posteriores.
5. En el Explorador de soluciones , agregue una nueva carpeta denominada Datos al proyecto Notes .
6. En el Explorador de soluciones , en el proyecto Notes , agregue una nueva clase denominada
NoteDatabase a la carpeta Datos .
7. En NoteDatabase.cs , reemplace el código existente con el siguiente:
using System.Collections.Generic;
using System.Threading.Tasks;
using SQLite;
using Notes.Models;
namespace Notes.Data
{
public class NoteDatabase
{
readonly SQLiteAsyncConnection _database;
Esta clase contiene código para crear la base de datos, leer datos de ella, escribir datos en ella y eliminarlos.
El código usa API asincrónicas de SQLite.NET que mueven las operaciones de base de datos a subprocesos
en segundo plano. Además, el constructor NoteDatabase toma la ruta de acceso del archivo de base de
datos como un argumento. La clase App proporcionará esta ruta de acceso en el paso siguiente.
Presione CTRL+S para guardar los cambios en NoteDatabase.cs y cierre el archivo.
WARNING
Si en este momento intenta compilar la aplicación, se producirán errores que se corregirán en pasos posteriores.
8. En el Explorador de soluciones , en el proyecto Notes , haga doble clic en App.xaml.cs para abrirlo.
Después, reemplace el código existente con el siguiente:
using System;
using System.IO;
using Xamarin.Forms;
using Notes.Data;
namespace Notes
{
public partial class App : Application
{
static NoteDatabase database;
public App()
{
InitializeComponent();
MainPage = new NavigationPage(new NotesPage());
}
Este código define una propiedad Database que crea una instancia de NoteDatabase como singleton, y pasa
el nombre de archivo de la base de datos como argumento al constructor NoteDatabase . La ventaja de
exponer la base de datos como un singleton es que se crea una conexión de base de datos única que se
mantiene abierta mientras la aplicación se ejecuta, lo que evita el gasto de abrir y cerrar el archivo de base
de datos cada vez que se realiza una operación de base de datos.
Guarde los cambios en App.xaml.cs presionando CTRL+S y cierre el archivo.
WARNING
Si en este momento intenta compilar la aplicación, se producirán errores que se corregirán en pasos posteriores.
Este código rellena el elemento ListView con todas las notas almacenadas en la base de datos.
Presione CTRL+S para guardar los cambios en NotesPage.xaml.cs y cierre el archivo.
WARNING
Si en este momento intenta compilar la aplicación, se producirán errores que se corregirán en pasos posteriores.
10. En el Explorador de soluciones , haga doble clic en NoteEntr yPage.xaml.cs para abrirlo. Después,
reemplace los métodos OnSaveButtonClicked y OnDeleteButtonClicked con el código siguiente:
NoteEntryPage almacena una instancia de Note , que representa una única nota, en el objeto
BindingContext de la página. Cuando se ejecuta el controlador de eventos OnSaveButtonClicked , la instancia
de Note se guarda en la base de datos y la aplicación regresa a la página anterior. Cuando se ejecuta el
controlador de eventos OnDeleteButtonClicked , la instancia de Note se elimina de la base de datos y la
aplicación regresa a la página anterior.
Presione CTRL+S para guardar los cambios en NoteEntr yPage.xaml.cs y cierre el archivo.
11. Compile y ejecute el proyecto en cada plataforma. Para más información, vea Compilación del inicio rápido.
En NotesPage presione el botón + para ir hasta NoteEntr yPage y escriba una nota. Después de guardar
la nota, la aplicación volverá a NotesPage .
Escriba un número de notas, de longitud variable, para observar el comportamiento de la aplicación.
NOTE
Hay varios paquetes NuGet con nombres similares. El paquete correcto tiene estos atributos:
Autor : Frank A. Krueger
Id.: sqlite-net-pcl
Vínculo de NuGet: sqlite-net-pcl
A pesar del nombre del paquete, este paquete NuGet puede usarse en proyectos de .NET Standard.
namespace Notes.Models
{
public class Note
{
[PrimaryKey, AutoIncrement]
public int ID { get; set; }
public string Text { get; set; }
public DateTime Date { get; set; }
}
}
Esta clase define un modelo Note que almacenará los datos sobre cada nota en la aplicación. La propiedad
ID está marcada con los atributos PrimaryKey y AutoIncrement para garantizar que cada instancia de
Note en la base de datos de SQLite.NET tenga un identificador único proporcionado por SQLite.NET.
Para guardar los cambios en Note.cs , seleccione Archivo > Guardar (o bien presione ⌘ + S ) y cierre el
archivo.
WARNING
Si en este momento intenta compilar la aplicación, se producirán errores que se corregirán en pasos posteriores.
5. En el Panel de solución , agregue una nueva carpeta denominada Datos al proyecto Notes .
6. En el Panel de solución , en el proyecto Notes , agregue una nueva clase denominada NoteDatabase a la
carpeta Datos .
7. En NoteDatabase.cs , reemplace el código existente con el siguiente:
using System.Collections.Generic;
using System.Threading.Tasks;
using SQLite;
using Notes.Models;
namespace Notes.Data
{
public class NoteDatabase
{
readonly SQLiteAsyncConnection _database;
Esta clase contiene código para crear la base de datos, leer datos de ella, escribir datos en ella y eliminarlos.
El código usa API asincrónicas de SQLite.NET que mueven las operaciones de base de datos a subprocesos
en segundo plano. Además, el constructor NoteDatabase toma la ruta de acceso del archivo de base de
datos como un argumento. La clase App proporcionará esta ruta de acceso en el paso siguiente.
Para guardar los cambios en NoteDatabase.cs , seleccione Archivo > Guardar (o bien presione ⌘ + S ) y
cierre el archivo.
WARNING
Si en este momento intenta compilar la aplicación, se producirán errores que se corregirán en pasos posteriores.
8. En el Panel de solución , en el proyecto Notes , haga doble clic en App.xaml.cs para abrirlo. Después,
reemplace el código existente con el siguiente:
using System;
using System.IO;
using Xamarin.Forms;
using Notes.Data;
namespace Notes
{
public partial class App : Application
{
static NoteDatabase database;
public App()
{
InitializeComponent();
MainPage = new NavigationPage(new NotesPage());
}
Este código define una propiedad Database que crea una instancia de NoteDatabase como singleton, y pasa
el nombre de archivo de la base de datos como argumento al constructor NoteDatabase . La ventaja de
exponer la base de datos como un singleton es que se crea una conexión de base de datos única que se
mantiene abierta mientras la aplicación se ejecuta, lo que evita el gasto de abrir y cerrar el archivo de base
de datos cada vez que se realiza una operación de base de datos.
Guarde los cambios en App.xaml.cs eligiendo Archivo > Guardar (o presionando ⌘ + S ) y cierre el
archivo.
WARNING
Si en este momento intenta compilar la aplicación, se producirán errores que se corregirán en pasos posteriores.
9. En el Panel de solución , en el proyecto Notes , haga doble clic en NotesPage.xaml.cs para abrirlo.
Después, reemplace el método OnAppearing con el código siguiente:
Este código rellena el elemento ListView con todas las notas almacenadas en la base de datos.
Para guardar los cambios en NotesPage.xaml.cs , seleccione Archivo > Guardar (o bien presione ⌘ +
S ) y cierre el archivo.
WARNING
Si en este momento intenta compilar la aplicación, se producirán errores que se corregirán en pasos posteriores.
10. En el Panel de solución , haga doble clic en NoteEntr yPage.xaml.cs para abrirlo. Después, reemplace los
métodos OnSaveButtonClicked y OnDeleteButtonClicked con el código siguiente:
NoteEntryPage almacena una instancia de Note , que representa una única nota, en el objeto
BindingContext de la página. Cuando se ejecuta el controlador de eventos OnSaveButtonClicked , la instancia
de Note se guarda en la base de datos y la aplicación regresa a la página anterior. Cuando se ejecuta el
controlador de eventos OnDeleteButtonClicked , la instancia de Note se elimina de la base de datos y la
aplicación regresa a la página anterior.
Para guardar los cambios en NoteEntr yPage.xaml.cs , seleccione Archivo > Guardar (o bien presione ⌘
+ S ) y cierre el archivo.
11. Compile y ejecute el proyecto en cada plataforma. Para más información, vea Compilación del inicio rápido.
En NotesPage presione el botón + para ir hasta NoteEntr yPage y escriba una nota. Después de guardar
la nota, la aplicación volverá a NotesPage .
Escriba un número de notas, de longitud variable, para observar el comportamiento de la aplicación.
Pasos siguientes
En este inicio rápido ha aprendido a:
Usar el Administrador de paquetes de NuGet para agregar un paquete NuGet a un proyecto.
Almacenar datos de forma local en una base de datos de SQLite.NET.
Para aplicar estilo a la aplicación con estilos XAML, continúe con el inicio rápido siguiente.
Siguiente
Vínculos relacionados
Notes (ejemplo)
Análisis detallado de inicio rápido de Xamarin.Forms
Estilo de una aplicación Xamarin.Forms
multiplataforma
15/04/2020 • 10 minutes to read • Edit Online
Descargar el ejemplo
En este inicio rápido aprenderá a:
Aplicar estilo a una aplicación Xamarin.Forms mediante estilos XAML.
En el inicio rápido se describe cómo aplicar estilo a una aplicación Xamarin.Forms multiplataforma con estilos
XAML. A continuación se muestra la aplicación final:
Requisitos previos
Antes de intentar este inicio rápido, debe completar correctamente el inicio rápido anterior. También puede
descargar el ejemplo del inicio rápido anterior y usarlo como punto de partida para este.
<Thickness x:Key="PageMargin">20</Thickness>
</Application.Resources>
</Application>
En este código se define un valor Thickness , una serie de valores Color y estilos implícitos para los
objetos NavigationPage y ContentPage . Tenga en cuenta que estos estilos, que están en el objeto
ResourceDictionary de nivel de aplicación, se pueden consumir en toda la aplicación. Para más información
sobre los estilos XAML, vea Aplicación de estilos en Análisis detallado de inicio rápido de Xamarin.Forms.
Presione CTRL+S para guardar los cambios en App.xaml y cierre el archivo.
3. En el Explorador de soluciones , en el proyecto Notes , haga doble clic en NotesPage.xaml para abrirlo.
Después, reemplace el código existente con el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Notes.NotesPage"
Title="Notes">
<ContentPage.Resources>
<!-- Implicit styles -->
<Style TargetType="{x:Type ListView}">
<Setter Property="BackgroundColor"
Value="{StaticResource AppBackgroundColor}" />
</Style>
</ContentPage.Resources>
<ContentPage.ToolbarItems>
<ToolbarItem Text="+"
Clicked="OnNoteAddedClicked" />
</ContentPage.ToolbarItems>
<ListView x:Name="listView"
Margin="{StaticResource PageMargin}"
ItemSelected="OnListViewItemSelected">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Text}"
TextColor="Black"
Detail="{Binding Date}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage>
Este código agrega un estilo implícito para ListView al objeto ResourceDictionary de nivel de página, y
establece la propiedad ListView.Margin en un valor definido en el objeto ResourceDictionary de nivel de la
aplicación. Tenga en cuenta que el estilo implícito ListView se ha agregado al objeto ResourceDictionary
de nivel de página, porque solo lo usa NotesPage . Para más información sobre los estilos XAML, vea
Aplicación de estilos en Análisis detallado de inicio rápido de Xamarin.Forms.
Presione CTRL+S para guardar los cambios en NotesPage.xaml y cierre el archivo.
4. En el Explorador de soluciones , en el proyecto Notes , haga doble clic en NoteEntr yPage.xaml para
abrirlo. Después, reemplace el código existente con el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Notes.NoteEntryPage"
Title="Note Entry">
<ContentPage.Resources>
<!-- Implicit styles -->
<Style TargetType="{x:Type Editor}">
<Setter Property="BackgroundColor"
Value="{StaticResource AppBackgroundColor}" />
</Style>
<Style TargetType="Button"
ApplyToDerivedTypes="True"
CanCascade="True">
<Setter Property="FontSize" Value="Medium" />
<Setter Property="BackgroundColor" Value="#1976D2" />
<Setter Property="TextColor" Value="White" />
<Setter Property="CornerRadius" Value="5" />
</Style>
</ContentPage.Resources>
</ContentPage>
Este código agrega estilos implícitos para las vistas Editor y Button al objeto ResourceDictionary de nivel
de página, y establece la propiedad StackLayout.Margin en un valor definido en el objeto
ResourceDictionary de nivel de la aplicación. Tenga en cuenta que los estilos implícitos Editor y Button
sen ha agregado al objeto ResourceDictionary de nivel de página, porque solo los usa NoteEntryPage . Para
más información sobre los estilos XAML, vea Aplicación de estilos en Análisis detallado de inicio rápido de
Xamarin.Forms.
Presione CTRL+S para guardar los cambios en NoteEntr yPage.xaml y cierre el archivo.
5. Compile y ejecute el proyecto en cada plataforma. Para más información, vea Compilación del inicio rápido.
En NotesPage presione el botón + para ir hasta NoteEntr yPage y escriba una nota. En cada página,
observe cómo ha cambiado el estilo con respecto al inicio rápido anterior.
<Thickness x:Key="PageMargin">20</Thickness>
</Application.Resources>
</Application>
En este código se define un valor Thickness , una serie de valores Color y estilos implícitos para los
objetos NavigationPage y ContentPage . Tenga en cuenta que estos estilos, que están en el objeto
ResourceDictionary de nivel de aplicación, se pueden consumir en toda la aplicación. Para más información
sobre los estilos XAML, vea Aplicación de estilos en Análisis detallado de inicio rápido de Xamarin.Forms.
Para guardar los cambios en App.xaml , seleccione Archivo > Guardar (o presione ⌘ + S ) y cierre el
archivo.
3. En el Panel de solución , en el proyecto Notes , haga doble clic en NotesPage.xaml para abrirlo. Después,
reemplace el código existente con el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Notes.NotesPage"
Title="Notes">
<ContentPage.Resources>
<!-- Implicit styles -->
<Style TargetType="{x:Type ListView}">
<Setter Property="BackgroundColor"
Value="{StaticResource AppBackgroundColor}" />
</Style>
</ContentPage.Resources>
<ContentPage.ToolbarItems>
<ToolbarItem Text="+"
Clicked="OnNoteAddedClicked" />
</ContentPage.ToolbarItems>
<ListView x:Name="listView"
Margin="{StaticResource PageMargin}"
ItemSelected="OnListViewItemSelected">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Text}"
TextColor="Black"
Detail="{Binding Date}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage>
Este código agrega un estilo implícito para ListView al objeto ResourceDictionary de nivel de página, y
establece la propiedad ListView.Margin en un valor definido en el objeto ResourceDictionary de nivel de la
aplicación. Tenga en cuenta que el estilo implícito ListView se ha agregado al objeto ResourceDictionary
de nivel de página, porque solo lo usa NotesPage . Para más información sobre los estilos XAML, vea
Aplicación de estilos en Análisis detallado de inicio rápido de Xamarin.Forms.
Para guardar los cambios en NotesPage.xaml , seleccione Archivo > Guardar (o bien presione ⌘ + S ) y
cierre el archivo.
4. En el Panel de solución , en el proyecto Notes , haga doble clic en NoteEntr yPage.xaml para abrirlo.
Después, reemplace el código existente con el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Notes.NoteEntryPage"
Title="Note Entry">
<ContentPage.Resources>
<!-- Implicit styles -->
<Style TargetType="{x:Type Editor}">
<Setter Property="BackgroundColor"
Value="{StaticResource AppBackgroundColor}" />
</Style>
<Style TargetType="Button"
ApplyToDerivedTypes="True"
CanCascade="True">
<Setter Property="FontSize" Value="Medium" />
<Setter Property="BackgroundColor" Value="#1976D2" />
<Setter Property="TextColor" Value="White" />
<Setter Property="CornerRadius" Value="5" />
</Style>
</ContentPage.Resources>
</ContentPage>
Este código agrega estilos implícitos para las vistas Editor y Button al objeto ResourceDictionary de nivel
de página, y establece la propiedad StackLayout.Margin en un valor definido en el objeto
ResourceDictionary de nivel de la aplicación. Tenga en cuenta que los estilos implícitos Editor y Button
sen ha agregado al objeto ResourceDictionary de nivel de página, porque solo los usa NoteEntryPage . Para
más información sobre los estilos XAML, vea Aplicación de estilos en Análisis detallado de inicio rápido de
Xamarin.Forms.
Para guardar los cambios en NoteEntr yPage.xaml , seleccione Archivo > Guardar (o bien presione ⌘ +
S ) y cierre el archivo.
5. Compile y ejecute el proyecto en cada plataforma. Para más información, vea Compilación del inicio rápido.
En NotesPage presione el botón + para ir hasta NoteEntr yPage y escriba una nota. En cada página,
observe cómo ha cambiado el estilo con respecto al inicio rápido anterior.
Pasos siguientes
En este inicio rápido ha aprendido a:
Aplicar estilo a una aplicación Xamarin.Forms mediante estilos XAML.
Para obtener más información sobre los aspectos básicos del desarrollo de aplicaciones con Xamarin.Forms,
continúe con el análisis detallado de inicio rápido.
Siguiente
Vínculos relacionados
Notes (ejemplo)
Análisis detallado de inicio rápido de Xamarin.Forms
Análisis detallado de inicio rápido de
Xamarin.Forms
14/05/2020 • 36 minutes to read • Edit Online
Para maximizar la reutilización del código de inicio, las aplicaciones de Xamarin.Forms tienen una
clase única denominada App que es responsable de crear instancias de la primera página que
mostrará la aplicación en cada plataforma, como se muestra en el siguiente ejemplo de código:
using Xamarin.Forms;
namespace Notes
{
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new NavigationPage(new NotesPage());
}
...
}
}
using Xamarin.Forms.Xaml;
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
El atributo XamlCompilation activa el compilador XAML, para que XAML se compile directamente
en lenguaje intermedio. Para obtener más información, consulte Compilación XAML.
namespace Notes.iOS
{
[Register("AppDelegate")]
public partial class AppDelegate :
global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());
return base.FinishedLaunching(app, options);
}
}
}
namespace Notes.Droid
{
[Activity(Label = "Notes",
Icon = "@mipmap/icon",
Theme = "@style/MainTheme",
MainLauncher = true,
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
}
}
Xamarin.Forms.Forms.Init (e);
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
...
}
namespace Notes.UWP
{
public sealed partial class MainPage
{
public MainPage()
{
this.InitializeComponent();
this.LoadApplication(new Notes.App());
}
}
}
Interfaz de usuario
Existen cuatro grupos de controles principales que se usan para crear la interfaz de usuario de
una aplicación Xamarin.Forms:
1. Páginas : las páginas de Xamarin.Forms representan pantallas de aplicaciones móviles
multiplataforma. En la aplicación Notes se usa la clase ContentPage para mostrar pantallas
únicas. Para obtener más información sobre las páginas, consulte Xamarin.Forms Pages
(Páginas de Xamarin.Forms).
2. Vistas : las vistas de Xamarin.Forms son los controles que se muestran en la interfaz de
usuario, como etiquetas, botones y cuadros de entrada de texto. En la aplicación Notes
terminada se usan las vistas ListView , Editor y Button . Para obtener más información
sobre las vistas, consulte Xamarin.Forms Views (Vistas de Xamarin.Forms).
3. Diseños : los diseños de Xamarin.Forms son contenedores que se usan para crear vistas en
estructuras lógicas. En la aplicación Notes se usa la clase StackLayout para organizar las
vistas en una pila vertical y la clase Grid para organizar los botones de forma horizontal.
Para obtener más información sobre los diseños, consulte Xamarin.Forms Layouts (Diseños de
Xamarin.Forms).
4. Celdas : las celdas de Xamarin.Forms son elementos especializados que se usan para los
elementos de una lista, y describen cómo debe dibujarse cada elemento de una lista. En la
aplicación Notes se usa TextCell para mostrar dos elementos para cada fila de la lista. Para
obtener más información sobre las celdas, consulte Xamarin.Forms Cells (Celdas de
Xamarin.Forms).
En tiempo de ejecución, cada control se asignará a su equivalente nativo, que es lo que se
representará.
Diseño
En la aplicación Notes se usa StackLayout para simplificar el desarrollo de aplicaciones
multiplataforma mediante la disposición automática de las vistas en la pantalla,
independientemente del tamaño de esta. Cada elemento secundario se coloca uno detrás del
otro, ya sea horizontal o verticalmente, en el orden en el que se ha agregado. La cantidad de
espacio que usará la clase StackLayout depende de cómo se establezcan las propiedades
HorizontalOptions y VerticalOptions , pero StackLayout intentará usar toda la pantalla de
forma predeterminada.
En el código XAML siguiente se muestra un ejemplo de uso de una clase StackLayout para
organizar el control NoteEntryPage :
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Notes.NoteEntryPage"
Title="Note Entry">
...
<StackLayout Margin="{StaticResource PageMargin}">
<Editor Placeholder="Enter your note"
Text="{Binding Text}"
HeightRequest="100" />
<Grid>
...
</Grid>
</StackLayout>
</ContentPage>
De forma predeterminada, StackLayout asume una orientación vertical. Pero se puede cambiar a
una orientación horizontal si se establece la propiedad StackLayout.Orientation en el miembro
de enumeración StackOrientation.Horizontal .
NOTE
El tamaño de las vistas se puede establecer a través de las propiedades HeightRequest y
WidthRequest .
NOTE
El archivo de código subyacente de una clase XAML puede tener acceso a un objeto que se ha definido
en XAML con el nombre asignado a él con el atributo x:Name . El valor que se ha asignado a este
atributo tiene las mismas reglas que las variables de C#, ya que debe comenzar con una letra o guion
bajo y no contener espacios incrustados.
Listas
ListView es responsable de mostrar una colección de elementos de forma vertical en una lista.
Cada elemento de ListView se incluirá en una sola celda.
En el ejemplo de código siguiente se muestra el elemento ListView de NotesPage :
<ListView x:Name="listView"
Margin="{StaticResource PageMargin}"
ItemSelected="OnListViewItemSelected">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Text}"
Detail="{Binding Date}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
El diseño de cada fila de ListView se define dentro del elemento ListView.ItemTemplate y se usa
el enlace de datos para mostrar las notas recuperadas por la aplicación. La propiedad
ListView.ItemsSource está establecida en el origen de datos, en NotesPage.xaml.cs :
Este código rellena el elemento ListView con todas las notas almacenadas en la base de datos.
Cuando se selecciona una fila en ListView , se desencadena el evento ItemSelected . Cuando se
desencadena el evento, se ejecuta un controlador de eventos denominado
OnListViewItemSelected :
Navegación
Xamarin.Forms proporciona una serie de experiencias de navegación de páginas diferente, en
función del tipo de Page que se use. Para las instancias de ContentPage , la navegación puede ser
jerárquica o modal. Para obtener información sobre la navegación modal, vea Páginas modales
de Xamarin.Forms.
NOTE
Las clases CarouselPage , MasterDetailPage y TabbedPage proporcionan experiencias de navegación
alternativas. Para obtener más información, consulte Navigation (Navegación).
En la navegación jerárquica, se usa la clase NavigationPage para navegar por una pila de objetos
ContentPage , hacia delante y atrás, como se prefiera. La clase implementa la navegación como
una pila de objetos Page en la que el último en entrar es el primero en salir (LIFO). Para pasar de
una página a otra, una aplicación insertará una nueva página en la pila de navegación, donde se
convertirá en la página activa. Para volver a la página anterior, la aplicación mostrará la página
actual de la pila de navegación y la nueva página de nivel superior se convertirá en la página
activa.
La clase NavigationPage también agregará una barra de navegación en la parte superior de la
página que muestra un título y un botón Atrás adecuado para la plataforma para volver a la
página anterior.
La primera página que se agrega a una pila de navegación se denomina página raíz de la
aplicación y, en el ejemplo de código siguiente, se muestra cómo se consigue esto en la
aplicación Notes:
public App ()
{
...
MainPage = new NavigationPage (new NotesPage ());
}
Todas las instancias ContentPage tienen una propiedad Navigation que expone métodos para
modificar la pila de la página. Solo se deberían invocar estos métodos si la aplicación incluye una
NavigationPage . Para navegar a la NoteEntryPage , es necesario invocar el método PushAsync
como se muestra en el ejemplo de código siguiente:
Esto hace que el nuevo objeto NoteEntryPage se inserte en la pila de navegación, donde se
convierte en la página activa.
La página activa se puede extraer de la pila de navegación. Para ello, pulse el botón Atrás del
dispositivo, independientemente de si se trata de un botón físico en el dispositivo o de un botón
en la pantalla. Para volver mediante programación a la página original, el objeto NoteEntryPage
debe invocar el método PopAsync , como se muestra en el ejemplo de código siguiente:
await Navigation.PopAsync();
Para obtener más información sobre la navegación jerárquica, consulte Hierarchical Navigation
(Navegación jerárquica).
Enlace de datos
El enlace de datos se usa para simplificar la forma en que una aplicación de Xamarin.Forms
muestra e interactúa con sus datos. Establece una conexión entre la interfaz de usuario y la
aplicación subyacente. La clase BindableObject contiene gran parte de la infraestructura para
admitir el enlace de datos.
El enlace de datos conecta dos objetos, denominados origen y destino. El objeto de origen
proporciona los datos. El objeto de destino usa (y, a menudo, muestra) los datos del objeto de
origen. Por ejemplo, un control Editor (objeto de destino) normalmente enlazará su propiedad
Text a una propiedad string pública en un objeto de origen. En el diagrama siguiente se
muestra la relación de enlace:
El principal beneficio del enlace de datos es que ya no tiene que preocuparse de sincronizar los
datos entre las vistas y el origen de datos. Los cambios en el objeto de origen se insertan
automáticamente en el objeto de destino en segundo plano por medio del marco de enlace,
mientras que los cambios en el objeto de destino pueden insertarse de manera opcional en el
objeto de origen.
El establecimiento del enlace de datos es un proceso de dos pasos:
La propiedad BindingContext del objeto de destino se debe establecer en el de origen.
Es necesario establecer un enlace entre el destino y el origen. En XAML, esto se consigue
mediante la extensión de marcado Binding .
En la aplicación Notes, el destino de enlace es el elemento Editor que muestra una nota,
mientras que la instancia de Note establecida como BindingContext de NoteEntryPage es el
origen de enlace.
El objeto BindingContext de NoteEntryPage se establece durante la navegación de la página,
como se muestra en el ejemplo de código siguiente:
Después, el objeto Editor de NoteEntryPage se enlaza a la propiedad Text del objeto Note :
Se establece un enlace entre la propiedad Editor.Text y la propiedad Text del objeto de origen.
Los cambios realizados en Editor se propagarán de forma automática al objeto Note . De forma
similar, si se realizan cambios en la propiedad Note.Text , el motor de enlace de Xamarin.Forms
también actualizará el contenido de Editor . Esto se conoce como enlace bidireccional.
Para obtener más información sobre el enlace de datos, vea Enlace de datos de Xamarin.Forms.
Aplicación de estilos
Las aplicaciones de Xamarin.Forms suelen contener varios elementos visuales que tienen un
aspecto idéntico. Establecer la apariencia de cada elemento visual puede ser repetitivo y
propenso a errores. En su lugar, se pueden crear estilos que definan el aspecto y, después,
aplicarlos a los elementos visuales necesarios.
La clase Style agrupa una colección de valores de propiedad en un objeto que después se
puede aplicar a varias instancias de elementos visuales. Los estilos se almacenan en un objeto
ResourceDictionary , ya sea en el nivel de la aplicación, de la página o de la vista. La elección de
dónde se puede definir un elemento Style afecta a dónde se puede usar:
Las instancias de Style definidas en el nivel de aplicación se pueden aplicar en toda la
aplicación.
Las instancias de Style definidas en el nivel de página se pueden aplicar a la página y a sus
elementos secundarios.
Las instancias de Style definidas en el nivel de vista se pueden aplicar a la vista y a sus
elementos secundarios.
IMPORTANT
Todos los estilos que se usen en la aplicación se almacenan en el diccionario de recursos de la aplicación
para evitar la duplicación. Pero el código de XAML que es específico de una página no debería incluirse en
el diccionario de recursos de la aplicación, dado que los recursos se analizarán en el inicio de la aplicación
en lugar de cuando los solicite una página.
Cada instancia de Style contiene una colección de uno o varios objetos Setter , donde cada
objeto Setter tiene un elemento Property y un elemento Value . Property es el nombre de la
propiedad enlazable del elemento al que se aplica el estilo y Value es el valor que se aplica a la
propiedad. En el ejemplo de código siguiente se muestra un estilo de NoteEntryPage :
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Notes.NoteEntryPage"
Title="Note Entry">
<ContentPage.Resources>
<!-- Implicit styles -->
<Style TargetType="{x:Type Editor}">
<Setter Property="BackgroundColor"
Value="{StaticResource AppBackgroundColor}" />
</Style>
...
</ContentPage.Resources>
...
</ContentPage>
NOTE
Normalmente, la aplicación de estilo a una aplicación Xamarin.Forms se realiza mediante estilos XAML.
Pero Xamarin.Forms también admite aplicar estilo a los elementos visuales mediante Hojas de estilo CSS
(CSS). Para más información, vea Aplicación de estilos para aplicaciones Xamarin.Forms con hojas de estilo
(CSS).
Para obtener más información sobre los estilos XAML, vea Styling Xamarin.Forms Apps using
XAML Styles (Aplicación de estilo a aplicaciones Xamarin.Forms mediante XAML).
Proporcionar estilos específicos de la plataforma
Las extensiones de marcado OnPlatform permiten personalizar la apariencia de la interfaz de
usuario para cada plataforma:
<Application xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Notes.App">
<Application.Resources>
...
<Color x:Key="iOSNavigationBarColor">WhiteSmoke</Color>
<Color x:Key="AndroidNavigationBarColor">#2196F3</Color>
<Color x:Key="iOSNavigationBarTextColor">Black</Color>
<Color x:Key="AndroidNavigationBarTextColor">White</Color>
Este elemento Style establece otros valores Color para las propiedades BarBackgroundColor y
BarTextColor de NavigationPage , en función de la plataforma que se use.
Para más información sobre las extensiones de marcado, vea Extensiones de marcado para el
lenguaje XAML. Para obtener información sobre de la extensión de marcado OnPlatform , vea
Extensión de marcado OnPlatform.
Pruebas e implementación
Tanto Visual Studio para Mac como Visual Studio ofrecen numerosas opciones para probar e
implementar una aplicación. Depurar aplicaciones es una parte común del ciclo de vida del
desarrollo de la aplicación y ayuda a diagnosticar problemas de código. Para obtener más
información, consulte Set a Breakpoint (Establecer un punto de interrupción), Step Through Code
(Recorrer el código paso a paso) y Output Information to the Log Window (Información de salida
para la ventana Registro).
Los simuladores son un buen lugar para comenzar a implementar y probar una aplicación, y
cuentan con una funcionalidad que resulta útil a la hora de probar las aplicaciones. Sin embargo,
los usuarios no usarán la aplicación final en un simulador, por lo que las aplicaciones deben
probarse en dispositivos reales desde el primer momento y con frecuencia. Para obtener más
información sobre el aprovisionamiento de dispositivos de iOS, consulte Aprovisionamiento de
dispositivos. Para obtener más información sobre el aprovisionamiento de dispositivos de
Android, consulte Configurar el dispositivo para el desarrollo.
Pasos siguientes
En este análisis detallado se han examinado los aspectos fundamentales del desarrollo de
aplicaciones con Xamarin.Forms. Se recomienda que, como paso siguiente, lea sobre las
funcionalidades que se indican a continuación:
Existen cuatro grupos de control principales que se usan para crear la interfaz de usuario de
una aplicación de Xamarin.Forms. Para obtener más información, vea Referencia de controles.
El enlace de datos es la técnica que consiste en vincular las propiedades de dos objetos para
que los cambios en una propiedad se reflejen automáticamente en la otra propiedad. Para
obtener más información, vea Enlace de datos.
Xamarin.Forms proporciona una serie de experiencias de navegación de páginas diferente, en
función del tipo de página que se use. Para obtener más información, consulte Navigation
(Navegación).
Los estilos permiten reducir el uso de marcado repetitivo y conseguir que la apariencia de las
aplicaciones pueda cambiarse con mayor facilidad. Para obtener más información, vea
Aplicación de estilos a aplicaciones de Xamarin.Forms.
Las extensiones de marcado XAML extienden las funciones avanzadas y la flexibilidad de
XAML al permitir establecer atributos de elementos desde orígenes distintos de cadenas de
texto literales. Para obtener más información, vea Extensiones de marcado XAML.
Las plantillas de datos permiten definir la presentación de los datos en las vistas admitidas.
Para obtener más información, consulte Data Templates (Plantillas de datos).
Cada página, diseño y control se representan de forma diferente en cada plataforma mediante
una clase Renderer que, a su vez, crea un control nativo, lo organiza en la pantalla y agrega el
comportamiento especificado al código compartido. Los desarrolladores pueden implementar
sus propias clases Renderer personalizadas para personalizar la apariencia o el
comportamiento de un control. Para obtener más información, consulte Custom Renderers
(Representadores personalizados).
Los efectos también permiten personalizar los controles nativos de cada plataforma. Los
efectos se crean en proyectos específicos de la plataforma mediante la creación de subclases
de la clase PlatformEffect . Para usarlos, se adjuntan a un control adecuado de
Xamarin.Forms. Para obtener más información, consulte Effects (Efectos).
El código compartido puede tener acceso a la funcionalidad nativa mediante la clase
DependencyService . Para obtener más información, consulte Accessing Native Features with
DependencyService (Acceso a características nativas con DependencyService).
También es recomendable el libro de Charles Petzold titulado Creating Mobile Apps with
Xamarin.Forms (Creación de aplicaciones móviles con Xamarin.Forms) para obtener más
información sobre Xamarin.Forms. El libro está disponible como un archivo PDF o en una
variedad de formatos de libro electrónico.
Vínculos relacionados
Lenguaje XAML (eXtensible Application Markup Language)
Enlace de datos
Controls Reference (Referencia de controles)
Extensiones de marcado XAML
Xamarin.Forms Samples (Ejemplos de Xamarin.Forms)
Getting Started Samples (Ejemplos de introducción)
Referencia de la API de Xamarin.Forms
Aprendizaje autoguiado gratuito (vídeo)
Vídeo relacionado
Esta sección contiene información para ayudar a los desarrolladores de WPF y Windows Forms a aprender el
desarrollo de aplicaciones móviles con Xamarin, mediante la referencia cruzada de los conocimientos y la
experiencia existentes a los lenguajes móviles, y proporcionando ejemplos de migración de aplicaciones de
escritorio a Mobile.
Guía de migración
Usar el analizador de portabilidad para ayudar a migrar el código de aplicación de escritorio (excluida la interfaz de
usuario) a Xamarin. Forms.
Muestras
Ejemplos de referencia que muestran la arquitectura de aplicaciones empresariales y el código de portabilidad de
WPF a Xamarin. Forms.
Si es usted es desarrollador de Java, ya tiene la posibilidad de empezar a aprovechar sus habilidades y el código
existente de Xamarin en la plataforma Xamarin, al tiempo que disfruta de los beneficios de reutilizar código de C#.
Observará que la sintaxis de C# es muy similar a la sintaxis de Java y que ambos lenguajes ofrecen características
muy similares. Además, encontrará características exclusivas de C# que facilitarán el trabajo a los desarrolladores.
Información general
En este artículo se proporciona una introducción a la programación en C# para los desarrolladores de Java y se
centra principalmente en las características del lenguaje C# con las que se encontrará al desarrollar aplicaciones
Xamarin.Android. Además, en este artículo se explican las diferencias de estas características con respecto a las de
Java y, además, se presentan características importantes de C# (relevantes para Xamarin.Android) que no se
encuentran disponibles en Java. Se incluyen vínculos a material de referencia adicional, para que pueda usar este
artículo como un punto de partida para obtener más información sobre C# y .NET.
Si está familiarizado con Java, no tardará en sentirse cómodo con la sintaxis de C#. La sintaxis de C# es muy similar
a la de Java – C# es un lenguaje "de apertura" como Java, C y C++. En muchos sentidos, la sintaxis de C# se lee
como un superconjunto de la sintaxis de Java, pero con algunas palabras clave agregadas y con el nombre
cambiado.
Muchas características clave de Java pueden encontrarse en C#:
Programación orientada a objetos basados en clases
Tipado fuerte
Compatibilidad con interfaces
Genéricos
Recolección de elementos no utilizados
Compilación en tiempo de ejecución
Java y C# se compilan en un lenguaje intermedio que se ejecuta en un entorno de ejecución administrado. C# y
Java son tipos estáticos, y ambos lenguajes tratan las cadenas como tipos inmutables. Ambos lenguajes utilizan una
jerarquía de clases de raíz única. Al igual que Java, C# solo admite una herencia única y no acepta los métodos
globales. En ambos lenguajes, los objetos se crean en el montón con la palabra clave new y se recoleccionan los
objetos no utilizados cuando ya no se utilizan. Ambos lenguajes ofrecen una compatibilidad formal con el control
de excepciones mediante la semántica try / catch . Los dos ofrecen también compatibilidad con la sincronización y
administración de subprocesos.
No obstante, existen muchas diferencias entre Java y C#. Por ejemplo:
Java (tal como se usa en Android) no admite las variables locales con tipo implícito (C# admite la palabra
clave var ).
En Java, puede pasar parámetros solo por valor, mientras que en C# puede pasarlos tanto por referencia
como por valor. (C# ofrece las palabras clave ref y out para pasar los parámetros por referencia; no hay
ningún equivalente en Java).
Java no admite las directivas de preprocesador como #define .
Java no admite los tipos de enteros sin signo, mientras que C# sí que proporciona tipos de enteros sin signo
como ulong , uint , ushort y byte .
Java no admite la sobrecarga de operador; en C# se pueden sobrecargar operadores y conversiones.
En una instrucción Java switch , el código puede pasar a la siguiente sección del modificador; en cambio, en
C#, el final de cada sección switch debe terminar el modificador (el final de cada sección debe cerrarse con
una instrucción break ).
En Java, puede especificar las excepciones generadas por un método con la palabra clave throws , pero C#
no tiene ningún concepto de excepciones comprobadas; la palabra clave throws no se admite en C#.
C# admite Language Integrated Query (LINQ), que permite usar las palabras reservadas from , select y
where para escribir consultas de colecciones de forma similar a las consultas de bases de datos.
Por supuesto, hay muchas más diferencias entre C# y Java que pueden tratarse en este artículo. Además, Java y C#
continúan evolucionando (por ejemplo, Java 8, que aún no se encuentra en la cadena de herramientas de Android,
admite expresiones lambda del estilo de C#), por lo que estas diferencias seguirán evolucionando. Aquí solo se
destacan las diferencias más importantes que han detectado los desarrolladores de Java que son nuevos en
Xamarin.Android.
En Pasar del desarrollo en Java al desarrollo en C# se ofrece una introducción a las diferencias
fundamentales entre C# y Java.
En Características de la programación orientada a objetos se explican las diferencias más importantes de la
característica orientada a objetos entre ambos lenguajes.
En Diferencias de palabras claves se ofrece una lista de equivalentes de palabras claves útiles, solo palabras
claves de C# y vínculos a las definiciones de las palabras claves de C#.
C# proporciona muchas características claves de Xamarin.Android que actualmente no están disponibles para los
desarrolladores de Java en Android. Estas características pueden ayudarle a escribir código mejor y en menos
tiempo:
Propiedades – Con el sistema de propiedades de C#, puede acceder a las variables de miembros de forma
segura y directa sin tener que escribir métodos de establecedor y captador.
Expresiones lambda – En C# puede usar métodos anónimos (también denominados lambdas) para expresar
la funcionalidad de forma más sucinta y eficaz. Puede evitar la sobrecarga de tener que escribir objetos de
un solo uso, y puede pasar el estado local a un método sin tener que agregar parámetros.
Control de eventos – C# ofrece compatibilidad a nivel de lenguaje para la programación orientada a eventos,
donde se puede registrar un objeto para recibir una notificación cuando se produzca algún evento de
interés. La palabra clave event define un mecanismo de multidifusión que una clase de publicador puede
usar para informar a los suscriptores de eventos.
Programación asincrónica – Las características de la programación asincrónica de C# ( async / await )
mantienen la capacidad de respuesta de las aplicaciones. La compatibilidad a nivel de lenguaje de esta
característica permite que la programación asincrónica resulte fácil de implementar y que sea menos
propensa a errores.
Además, Xamarin le permite aprovechar los recursos de Java existentes mediante una tecnología que se conoce
como enlaces. Puede llamar al código, los marcos de trabajo y las bibliotecas de Java existentes desde C# con el uso
de generadores de enlaces automáticos de Xamarin. Para ello, basta con crear una biblioteca estática en Java y
exponerla en C# mediante un enlace.
NOTE
La programación de Android usa una versión específica del lenguaje Java que admite todas las características de Java 7 y un
subconjunto de Java 8.
Algunas características mencionadas en esta página (como la palabra clave var en C#) están disponibles en versiones más
recientes de Java (p. ej., var en Java 10), pero siguen si estar a disposición de los desarrolladores de Android.
namespace WeatherApp
{
...
Importación de tipos
Al usar tipos definidos en los espacios de nombres externos, importe estos tipos con una instrucción using (que es
muy similar a la instrucción import de Java). En Java, puede importar un solo tipo con una instrucción similar a la
siguiente:
import javax.swing.JButton
Puede importar un paquete de Java completo con una instrucción como esta:
import javax.swing.*
La instrucción using de C# funciona de forma muy similar, pero permite importar un paquete completo sin
especificar un carácter comodín. Por ejemplo, a menudo verá una serie de instrucciones using al principio de los
archivos de origen de Xamarin.Android, como se observa en este ejemplo:
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.Net;
using System.IO;
using System.Json;
using System.Threading.Tasks;
Estas instrucciones importan la funcionalidad desde los espacios de nombres System , Android.App ,
Android.Content , etc.
Genéricos
Tanto Java como C# admiten genéricos, que son marcadores de posición que permiten conectar diferentes tipos en
tiempo de compilación. Sin embargo, los genéricos funcionan de forma algo diferente en C#. En Java, el borrado de
tipos habilita la información sobre tipos solo en tiempo de compilación, pero no en tiempo de ejecución. Por el
contrario, .NET Common Language Runtime (CLR) proporciona compatibilidad explícita para los tipos genéricos, lo
que significa que C# tiene acceso a información sobre tipos en tiempo de ejecución. En el desarrollo diario de
Xamarin.Android, la importancia de esta distinción no suele ser evidente, pero si usa la reflexión, dependerá de esta
característica para acceder a la información sobre tipos en tiempo de ejecución.
En Xamarin.Android, verá con frecuencia el método genérico FindViewById utilizado para obtener una referencia a
un control de diseño. Este método acepta un parámetro de tipo genérico que especifica el tipo de control que se
buscará. Por ejemplo:
En este ejemplo de código, FindViewById obtiene una referencia al control TextView que se define en el diseño
como etiqueta ; a continuación, se devuelve como un tipo TextView .
Para obtener más información sobre los genéricos, vea el tema Genéricos. Tenga en cuenta que existen algunas
limitaciones en la compatibilidad de Xamarin.Android con las clases genéricas de C#; para más información, vea
Limitaciones.
En este ejemplo, se leen los valores de anchura y altura del objeto rulerView mediante el acceso a sus propiedades
MeasuredWidth y MeasuredHeight . Cuando se leen estas propiedades, los valores de sus valores de campos
asociados, pero ocultos, se capturan en segundo plano y se devuelven al autor de la llamada. El objeto rulerView
puede almacenar los valores de anchura y altura en una unidad de medida (es decir, píxeles) y convertirlos sobre la
marcha en una unidad de medida distinta (por ejemplo, milímetros) al acceder a las propiedades MeasuredWidth y
MeasuredHeight .
El objeto rulerView también tiene una propiedad denominada DrawingCacheEnabled – el código de ejemplo
establece esta propiedad en true para habilitar la caché de dibujo en rulerView . En segundo plano, se actualiza
un campo oculto asociado con el nuevo valor y es posible que se modifiquen otros aspectos del estado rulerView .
Por ejemplo, cuando DrawingCacheEnabled está establecido en false , rulerView también puede borrar cualquier
información de la caché de dibujo ya acumulada en el objeto.
El acceso a las propiedades puede ser de lectura/escritura, solo lectura o solo escritura. Además, puede usar
distintos modificadores de acceso para leer y escribir. Por ejemplo, puede definir una propiedad que tenga acceso
de lectura público, pero acceso de escritura privado.
Para obtener más información sobre las propiedades de C#, vea el tema Propiedades.
Llamar a métodos de clase base
Para llamar a un constructor de clase base en C#, utilice dos puntos ( : ) seguidos de la palabra clave base y una
lista de inicializadores; esta llamada al constructor base se coloca inmediatamente después de la lista de
parámetros del constructor derivada. Se llama al constructor de clase base al introducir el constructor derivado; el
compilador inserta la llamada en el constructor base al inicio del cuerpo del método. El siguiente fragmento de
código muestra un constructor base llamado desde un constructor derivado en una aplicación de Xamarin.Android:
En este ejemplo, la clase PictureLayout se deriva de la clase ViewGroup . El constructor PictureLayout que se
muestra en este ejemplo acepta un argumento context y lo pasa al constructor ViewGroup mediante la llamada
base(context) .
Para llamar a un método de clase base en C#, use la palabra clave base . Por ejemplo, las aplicaciones de
Xamarin.Android suelen realizar llamadas a los métodos base, como se muestra aquí:
public class MainActivity : Activity
{
...
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
En este caso, el método OnCreate definido por la clase derivada ( MainActivity ) llama al método OnCreate de la
clase base ( Activity ).
Modificadores de acceso
Java y C# admiten los modificadores de acceso public , private y protected . Sin embargo, C# admite dos
modificadores de acceso adicionales:
internal – Al miembro de clase se puede acceder únicamente dentro del ensamblado actual.
protected internal – Al miembro de clase se puede acceder dentro del ensamblado de definición, de la
clase de definición y de las clases derivadas (tienen acceso las clases derivadas dentro y fuera del
ensamblado).
Para obtener más información sobre los modificadores de acceso de C#, vea el tema Modificadores de acceso.
Métodos virtuales y de invalidación
Java y C# admiten el polimorfismo, que es la capacidad de tratar objetos relacionados de la misma manera. En
ambos lenguajes, se puede usar una referencia de clase base para hacer referencia a un objeto de clases derivada, y
los métodos de una clase derivada pueden invalidar los métodos de sus clases base. Ambos lenguajes tienen el
concepto de un método virtual, que es un método de una clase base diseñado para sustituirse por un método de
una clase derivada. Al igual que Java, C# admite clases y métodos abstract .
Sin embargo, hay algunas diferencias entre Java y C# en cómo declarar métodos virtuales e invalidarlos:
En C#, los métodos son no virtuales de forma predeterminada. Las clases principales deben etiquetar de
forma explícita qué métodos deben invalidarse con el uso de la palabra clave virtual . Por el contrario,
todos los métodos de Java son virtuales de forma predeterminada.
Para evitar la invalidación de un método en C#, solo tiene que excluir la palabra clave virtual . Por el
contrario, Java usa la palabra clave final para marcar un método con "override is not allowed" (No se
permite la invalidación).
Las clases derivadas de C# deben usar la palabra clave override para indicar de forma explícita que se va a
anular un método de clase base virtual.
Para obtener más información sobre la compatibilidad de C# con el polimorfismo, vea el tema Polimorfismo.
Expresiones lambda
C# permite crear clausuras: métodos anónimos insertados que pueden acceder al estado del método en que están
incluidos. Con el uso de expresiones lambda, puede escribir menos líneas de código para implementar la misma
funcionalidad que hubiera implementado en Java con muchas más líneas de código.
Las expresiones lambda permiten omitir los pasos adicionales necesarios para crear una clase de un solo uso o una
clase anónima que debería aplicar en Java; en su lugar, solo puede escribir la lógica de negocios del código del
método insertado. Además, como las expresiones lambda tienen acceso a las variables del método adyacente, no
tiene que crear una lista larga de parámetros para pasar el estado al código del método.
En C#, las expresiones lambda se crean con el operador => , como se muestra a continuación:
(arg1, arg2, ...) => {
// implementation code
};
En Xamarin.Android, a menudo se usan expresiones lambda para definir controladores de eventos. Por ejemplo:
En este ejemplo, el código de la expresión lambda (el código encerrado entre llaves) incrementa un recuento de
clics y actualiza el texto button para mostrar el recuento de clics. Esta expresión lambda se registra con el objeto
button como un controlador de eventos de clics al que se llama cada vez que se pulsa un botón. (Los
controladores de eventos se explican con más detalle a continuación). En este ejemplo, el código de la expresión
lambda no usa los parámetros sender y args , pero sí son necesarios en la expresión lambda para satisfacer los
requisitos de firma del método para el registro del evento. En segundo plano, el compilador de C# convierte la
expresión lambda en un método anónimo al que se llama cada vez que se hace clic en un botón.
Para obtener más información sobre C# y las expresiones lambda, vea el tema Expresiones lambda.
Control de eventos
Un eventos es la forma en que un objeto notifica a los suscriptores registrados cuándo sucede algo interesante a
dicho objeto. A diferencia de Java, donde un suscriptor que suele implementar una interfaz Listener que contiene
un método de devolución de llamada, C# ofrece compatibilidad a nivel de lenguaje para el control de eventos
mediante delegados. Un delegado es similar a un puntero de función con seguridad de tipos orientado a objetos;
encapsula una referencia de objeto y un token de método. Si un objeto de cliente desea suscribirse a un evento,
crea un delegado y pasa el delegado al objeto notificador. Cuando se produce el evento, el objeto notificador invoca
el método representado por el objeto delegado, para notificar al objeto de cliente de suscripción del evento. En C#,
los controladores de eventos básicamente no son más que métodos que se invocan mediante delegados.
Para obtener más información sobre los delegados, vea el tema Delegados.
En C#, los eventos son multidifusión; esto quiere decir que se puede notificar a más de un agente de escucha
cuando se produce un evento. Esta diferencia se observa al tener en cuenta las diferencias sintácticas entre el
registro de eventos de Java y C#. En Java, se llama a SetXXXListener para registrar notificaciones de eventos; en C#,
se usa el operador += para registrar notificaciones de eventos al "agregar" el delegado a la lista de agentes de
escucha de eventos. En Java, se llama a SetXXXListener para anular el registro, mientras que en C# se utiliza -=
para "restar" el delegado de la lista de agentes de escucha.
En Xamarin.Android, los eventos se usan con frecuencia para informar a los objetos cuando un usuario realiza una
acción en un control de interfaz de usuario. Normalmente, un control de interfaz de usuario tendrá miembros que
se definen con la palabra clave event ; asocie los delegados con estos miembros para suscribirse a eventos de ese
control de interfaz de usuario.
Para suscribirse a un evento:
1. Cree un objeto delegado que haga referencia al método que quiere invocar cuando se produce el evento.
2. Use el operador += para asociar el delegado al evento al que se va a suscribir.
En el ejemplo siguiente se define un delegado (con el uso explícito de la palabra clave delegate ) para suscribirse a
los clics de botón. Este controlador de clics de botón inicia una nueva actividad:
startActivityButton.Click += delegate {
Intent intent = new Intent (this, typeof (MyActivity));
StartActivity (intent);
};
Sin embargo, también puede utilizar una expresión lambda para registrar eventos, omitiendo por completo la
palabra clave delegate . Por ejemplo:
En este ejemplo, el objeto startActivityButton tiene un evento que espera un delegado con una firma de método
determinada: uno que acepta argumentos de remitente y evento y devuelve un valor nulo. No obstante, como no
queremos ocasionar la molestia de definir de forma explícita dicho delegado o su método, declaramos la firma del
método con (sender, e) y usamos una expresión lambda para implementar el cuerpo del controlador de eventos.
Tenga en cuenta que tenemos que declarar esta lista de parámetros aunque usemos los parámetros sender y e .
Es importante recordar que se puede anular la suscripción de un delegado (con el operador -= ), pero no se puede
anular la suscripción de una expresión lambda; tratar de hacerlo puede causar fugas de memoria. Use la forma de
expresión lambda del registro de eventos solo si no se anula la suscripción del controlador al evento.
Normalmente, las expresiones lambda se usan para declarar controladores de eventos en el código de
Xamarin.Android. Esta forma abreviada de declarar controladores de eventos puede parecer críptica al principio,
pero ahorra una gran cantidad de tiempo al leer y escribir código. Cuando se familiarice más, se habituará a
reconocer este patrón, que ocurre con frecuencia en el código de Xamarin.Android, y podrá dedicar más tiempo a
pensar en la lógica de negocios de su aplicación y menos tiempo a repasar la sobrecarga sintáctica.
Programación asincrónica
La programación asincrónica es una manera de mejorar la capacidad de respuesta general de la aplicación. Las
características de la programación asincrónica permiten que el resto del código de la aplicación continúe
ejecutándose mientras que una operación larga bloquea alguna parte de la aplicación. El acceso a la Web, el
procesamiento de imágenes y la lectura y escritura de archivos son ejemplos de operaciones que pueden causar
que una aplicación parezca inmovilizada si no se escribe de forma asincrónica.
C# incluye compatibilidad a nivel de lenguaje con la programación asincrónica mediante las palabras clave async
y await . Estas características del lenguaje facilitan bastante la escritura de código que realiza tareas de ejecución
prolongada sin bloquear el subproceso principal de la aplicación. En resumen, use la palabra clave async en un
método para indicar que el código del método debe ejecutarse de forma asincrónica y no bloquear el subproceso
del autor de la llamada. Use la palabra clave await para llamar a métodos marcados como async . El compilador
interpreta await como el punto al que se va a mover la ejecución del método a un subproceso en segundo plano
(se devuelve una tarea al autor de la llamada). Una vez completada esta tarea, la ejecución del código se reanuda en
el subproceso del autor de la llamada en el punto await del punto, devolviendo los resultados de la llamada
async . Por convención, los métodos que se ejecutan de forma asincrónica llevan el sufijo Async en sus nombres.
En las aplicaciones de Xamarin.Android, async y await suelen usarse para liberar el subproceso de la interfaz de
usuario, para que pueda responder a la entrada del usuario (como pulsar un botón Cancelar ) mientras tiene lugar
una operación de ejecución prolongada en una tarea en segundo plano.
En el ejemplo siguiente, un controlador de eventos de clics de botón resulta en una operación asincrónica para
descargar una imagen de la Web:
downloadButton.Click += downloadAsync;
...
async void downloadAsync(object sender, System.EventArgs e)
{
webClient = new WebClient ();
var url = new Uri ("http://photojournal.jpl.nasa.gov/jpeg/PIA15416.jpg");
byte[] bytes = null;
En este ejemplo, cuando el usuario hace clic en el control downloadButton , el controlador de eventos downloadAsync
crea un objeto WebClient y un objeto Uri para capturar una imagen de la dirección URL especificada. A
continuación, llama al método DownloadDataTaskAsync del objeto WebClient con esta dirección URL para recuperar
la imagen.
Tenga en cuenta que la declaración del método downloadAsync va precedida de la palabra clave async para indicar
que se ejecutará de forma asincrónica y que devolverá una tarea. Tenga en cuenta también que la llamada a
DownloadDataTaskAsync va precedida de la palabra clave await . La aplicación mueve la ejecución del controlador de
eventos (a partir del punto en que await aparece) a un subproceso en segundo plano hasta que
DownloadDataTaskAsync se completa y realiza la devolución. Mientras tanto, el subproceso de la interfaz de usuario
de la aplicación puede responder aún a la entrada del usuario y activar los controladores de eventos para los otros
controles. Cuando DownloadDataTaskAsync se completa (que puede tardar varios segundos), la ejecución se reanuda
donde la variable bytes está establecida en el resultado de la llamada a DownloadDataTaskAsync , y el resto del
código del controlador de eventos muestra la imagen descargada en el subproceso del autor de la llamada (interfaz
de usuario).
Para obtener una introducción a async / await en C#, vea el tema Programación asincrónica con Async y Await.
Para más información sobre la compatibilidad de Xamarin con las características de la programación asincrónica,
vea Información general sobre la compatibilidad con Async.
Además, hay muchas palabras clave que son exclusivas de C# y que no tienen homólogo en el Java usado en
Android. El código de Xamarin.Android suele usar las siguientes palabras clave de C# (es útil hacer referencia a esta
tabla al leer código de ejemplo de Xamarin.Android):
C# DESC RIP C IÓ N
Resumen
Este artículo ofrece una introducción al entorno de programación de C# en Xamarin.Android desde la perspectiva
de los desarrolladores de Java. Se indican las similitudes entre C# y Java, además de explicar sus diferencias
prácticas. Aborda los ensamblados y los espacios de nombres, se explica cómo importar tipos externos y se ofrece
información general sobre las diferencias de los modificadores de acceso, los genéricos, la derivación de clases, la
llamada a métodos de clases base, la invalidación de métodos y el control de eventos. Se presentan características
de C# que no están disponibles en Java, como las propiedades, la programación asincrónica de async / await , las
expresiones lambda, los delegados de C# y el sistema de control de eventos de C#. Incluye tablas de palabras claves
importantes de C#, se explica cómo interoperar con bibliotecas de Java existentes y se ofrecen vínculos a
documentación relacionada realizar un estudio adicional.
Vínculos relacionados
Información general sobre la integración de Java
Guía de programación de C#
Referencia de C#
Pasar a C# y .NET Framework, para desarrolladores de Java
Xamarin para desarrolladores de Objective-C
15/04/2020 • 3 minutes to read • Edit Online
Xamarin ofrece a los desarrolladores que tienen iOS como destino una ruta trasladar su código que no es de
interfaz de usuario a C# independiente de la plataforma, de manera que se pueda utilizar en cualquier lugar en que
C# esté disponible, como Android a través de Xamarin.Android y las diferentes versiones de Windows. Sin
embargo, el mero hecho de usar C# con Xamarin no implica que pueda aprovechar sus habilidades y el código de
Objective-C. De hecho, conocer Objective-C lo convierte en un mejor desarrollador de Xamarin.iOS porque
Xamarin expone todas las API de plataforma nativas de iOS y OS X que conoce y que le encantan, como UIKit, Core
Animation, Core Foundation y Core Graphics, por nombrar algunas. Al mismo tiempo, obtiene la eficacia del
lenguaje C#, incluidas características como LINQ y Generics, así como completas bibliotecas de clase base de .NET
para usar en sus aplicaciones nativas.
Además, Xamarin le permite aprovechar los recursos de Objective-C existentes mediante una tecnología que se
conoce como "enlaces". Basta con crear una biblioteca estática en Objective C y exponerla a C# a través de un
enlace, como se muestra en el diagrama siguiente:
Esto no tiene por qué limitarse al código que no es de interfaz de usuario. Los enlaces pueden exponer también el
código de interfaz de usuario desarrollado en Objective-C.
Enlace de Objective-C
Cuando haya adquirido unas nociones generales sobre las diferencias y similitudes entre C# y Objective-C y haya
trabajando con el tutorial de enlace anterior, estará listo para la transición a la plataforma Xamarin. Si quiere
profundizar en la materia, puede encontrar más información detallada sobre las tecnologías de enlace de
Xamarin.iOS, incluida una exhaustiva referencia de enlace, en la sección Enlace de Objective-C.
Desarrollo multiplataforma
Finalmente, después de pasarse a Xamarin.iOS, seguramente querrá consultar la guía multiplataforma de que
disponemos, con estudios de caso de aplicaciones de referencia que hemos desarrollado y procedimientos
recomendados para crear código multiplataforma reutilizable, contenidos en la sección Building Cross Platform
Applications (Generación de aplicaciones multiplataforma).