Introducci贸n a Xamarin

1

Todo lo que aprender谩s sobre Xamarin Forms

2

驴Qu茅 es Xamarin?

Instalaci贸n y configuraci贸n

3

Requerimientos de hardware y software

4

Introducci贸n a Instalaci贸n de Visual Studio .NET y Herramientas

5

Instalaci贸n de Visual Studio .NET en Windows

6

Instalaci贸n de Visual Studio .NET for Mac

7

Configuraci贸n de Xamarin para iOS

Fundamentos de Xamarin.Forms

8

Mi primera app con Xamarin.Forms

9

Xamarin.Forms vs. Xamarin cl谩sico

10

Estrategias para compartir c贸digo

Arquitectura de Xamarin.Forms

11

Anatom铆a de una aplicaci贸n

12

Arquitectura de Xamarin.Forms

Sistema de Propiedades Enlazables

13

Sistema de Propiedades Enlazables

14

Usando y creando Propiedades Enlazables

15

Propiedades Adjuntas

Manejo de Eventos

16

Manejo de eventos

17

Ciclo de vida

El Lenguaje XAML

18

驴Qu茅 es XAML?

19

Espacios de Nombres XML

20

Sintaxis de subelementos y de contenido

21

Extensiones de Marcado

22

Recursos

23

XAML compilado

Interfaz de Usuario

24

Contenedores

25

Controles comunes

26

Creaci贸n de controles personalizados

27

Estilos

28

Triggers en Estilos

29

Diccionarios Mezclados

30

Transformaciones y Animaciones

31

Navegaci贸n

32

DisplayAlert y DisplayActionSheet

33

MessagingCenter

Enlace de Datos

34

Enlace de Datos

35

Interfaces de notificaci贸n

36

La clase ObservableCollection<t>

37

Contexto de Enlace de Datos

38

Enlace entre elementos

39

Propiedad StringFormat

40

Plantillas de Datos

41

Convertidores de Valor

Comandos

42

驴Qu茅 son los Comandos?

43

Implementaci贸n b谩sica e implementaciones existentes

El Patr贸n de Dise帽o Model-View-ViewModel (MVVM)

44

Introducci贸n al patr贸n de dise帽o MVVM

45

驴Qu茅 es MVVM?

46

Componentes del Patr贸n

47

Proyecto: Pomodoro

48

App Pomodoro

49

Continuando con la app Pomodoro

50

Concluyendo nuestra app Pomodoro

A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Curso de Xamarin.Forms

Curso de Xamarin.Forms

Rodrigo D铆az Concha

Rodrigo D铆az Concha

App Pomodoro

48/50
Recursos

Continuaci贸n de la codificaci贸n del proyecto de Pomodoro:

  • Cragamos las listas de opciones de duraci贸n que usamos en la p谩gina de configuraciones
  • Creamos el messagingCenter y suscribimos la p谩gina de activaci贸n a los mensajes de la p谩gina de configuraci贸n
  • Guardamos y cargamos las duraciones desde el estado de la aplicaci贸n
  • Creamos la interfaz de la Vista de la p谩gina de activaci贸n de los Pomodoros
  • Implementamos el Timer para la actualizaci贸n de los ciclos en base a las configuraciones guardadas
  • Creamos y enlazamos los comandos para iniciar y detener el timer

Aportes 3

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Obtengo esta molesta Excepcion corriendo el codigo que escribo a medida que avanza el curso como corriendo el codigo en el repo de GitHub, el error pone:
"Unhandled Exception:

System.ArgumentException: <Timeout exceeded getting exception details> ocurri贸"
En la linea que pone:
"timer.Elapsed += Timer_Elapsed;"
En PomodoroPageViewModel.
Espero el profesor o alguien que lea esto me pueda ayudar a resolverlo.

Ayuda, luego de navegar al page de Configuracion puedo ver los tiempos de 鈥淒uracion del pomodoro鈥 pero no de 鈥淒uracion de la pausa鈥 Dejo mi c贸digo para ver si me pueden ayudar. Por lo menos de las clases en las que creo que est谩 mi error.

ConfigurationPageViewModel.cs

using System;
using System.Collections.ObjectModel;
using System.Windows.Input;
using Xamarin.Forms;

namespace Pomodoro.ViewModels
{
    public class ConfigurationPageViewModel : NotificationObject
    {
        private ObservableCollection<int> pomodoroDurations;

        public ObservableCollection<int> PomodoroDurations
        {
            get => pomodoroDurations;
            set
            {
                pomodoroDurations = value;
                OnPropertyChanged();
            }
        }

        private ObservableCollection<int> breakDurations;

        public ObservableCollection<int> BreakDurations
        {
            get => breakDurations;
            set
            {
                breakDurations = value;
                OnPropertyChanged();
            }
        }
        //------------------------- End ObservableCollections ----------------------------//


        private int selectedPomodoroDuration;

        public int SelectedPomodoroDuration
        {
            get => selectedPomodoroDuration;
            set
            {
                selectedPomodoroDuration = value;
                OnPropertyChanged();
            }
        }

        private int selectedBreakDuration;

        public int SelectedBreakDuration
        {
            get => selectedBreakDuration;
            set
            {
                selectedBreakDuration = value;
                OnPropertyChanged();
            }
        }

        public ICommand SaveCommand { get; set; }

        public ConfigurationPageViewModel()
        {
            LoadPomodoroDurations();
            LoadBreakDurations();
            SaveCommand = new Command(SaveCommandExecute);

        }

        private void LoadBreakDurations()
        {
            BreakDurations = new ObservableCollection<int>();
            BreakDurations.Add(1);
            BreakDurations.Add(5);
            BreakDurations.Add(10);
            BreakDurations.Add(25);
        }

        private void LoadPomodoroDurations()
        {
            PomodoroDurations = new ObservableCollection<int>
            {
                1,
                5,
                10,
                25
            };
        }

        private async void SaveCommandExecute()
        {
            Application.Current.Properties["PomodoroDurations"] = SelectedPomodoroDuration;
            Application.Current.Properties["BreakDurations"] = SelectedBreakDuration;

            await Application.Current.SavePropertiesAsync();
        }
    }
}

RootPage.xaml.cs

namespace Pomodoro
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class RootPage : MasterDetailPage
    {
        public RootPage()
        {
            InitializeComponent();
            //MasterPage.ListView.ItemSelected += ListView_ItemSelected;
            MessagingCenter.Subscribe<RootPageViewModel>(this,"GoToConfiguration", (a) => 
            {
                //La pagina a la que deseamos navegar. 
                Detail = new NavigationPage(new ConfigurationPage());
                //No opcion seleccionada, usuario puede volver a escojer. 
                IsPresented = false;
            });
        }

        //private void ListView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
        //{
            //var item = e.SelectedItem as RootPageMenuItem;
            //if (item == null)
            //    return;

            //var page = (Page)Activator.CreateInstance(item.TargetType);
            //page.Title = item.Title;

            //Detail = new NavigationPage(page);
            //IsPresented = false;

            //MasterPage.ListView.SelectedItem = null;
        //}
    }
}

Si ah铆 no est谩 mi error agradezco que me lo digan para seguir buscando

Que buena manera de manejar el MessagingCenter, muchas gracias!!