Guida introduttiva a Xamarin.Forms Opzioni di layout

1. Opzioni di layout

Quando si tratta di progettare e disporre le schermate della tua applicazione, hai due opzioni principali: scrivere codice o usare XAML. Se hai mai fatto uno sviluppo WPF (Windows Presentation Foundation) o Silverlight, probabilmente hai già familiarità con XAML. XAML è il Linguaggio di markup dell'applicazione eXtensible che è stato creato per aiutare a definire l'aspetto di un'applicazione senza doverlo gestire tutto in codice. Xamarin.Forms funziona con entrambe le opzioni. Alla fine spetterà a te decidere quale opzione preferisci.

È importante notare che XAML utilizzato per Xamarin.Forms non è compatibile con altre forme di strumenti XAML e XAML.

Opzione 1: utilizzo del codice

Se sei il tipo di persona che ama essere nel codice e non vuole nulla a che fare con qualsiasi tipo di markup, o un designer, allora probabilmente sarai molto a tuo agio con questa opzione. Si istanziano a livello di codice diversi tipi di vista oggetti e aggiungerli direttamente a Pagina o ad a disposizione a Pagina. Ecco un semplice esempio di creazione di un SimplePage classe, istanziando alcuni vista oggetti e aggiungendoli al Pagina attraverso a stackLayout oggetto.

public class SamplePage: ContentPage public SamplePage () Padding = new Thickness (20); var label = new Label Text = "I am a simple page", BackgroundColor = Color.Blue, Font = Font.SystemFontOfSize (30), WidthRequest = 150, HeightRequest = 40; var button = new Button Text = "Ho un pulsante", BackgroundColor = Color.Red, Font = Font.SystemFontOfSize (20), WidthRequest = 200, HeightRequest = 200; var entry = new Entry Placeholder = "I have a entry box", BackgroundColor = Color.Green, WidthRequest = 200, HeightRequest = 150; Content = new StackLayout Spacing = 10, Children = button, entry, label; 

Come puoi vedere, il vista gli oggetti hanno un numero di proprietà in comune, che puoi usare per impostare il testo, i colori, la spaziatura, l'altezza, la larghezza, ecc. Tutto quello che devi fare ora è modificare il GetMainPage metodo nel App classe per restituire una nuova istanza di Pagina di esempio classe, e via vai.

Nessuno mi ha mai accusato di essere un designer, ma è facile creare pagine di base nel codice.

Opzione 2: utilizzo di XAML

Se preferisci separare l'aspetto della tua applicazione dalla logica e dall'implementazione, XAML potrebbe essere la soluzione giusta. XAML ti consente di creare l'intero layout della tua applicazione in un formato XML specializzato che Xamarin può tradurre nelle pagine, nei layout, nelle viste e nelle celle e visualizzarle all'utente. Se non hai mai usato XAML prima, ci vuole un po 'per abituarsi. Tuttavia, una volta capito, può essere abbastanza carino.

Per utilizzare XAML in combinazione con Xamarin.Forms, dovrai creare il tuo progetto usando il App vuota (Xamarin.Forms Portable) modello in modo che tutto il codice Xamarin.Forms possa essere separato nella propria dll.

Nell'esempio di codice della sezione precedente, hai creato un modo molto semplice Pagina dei contenuti classe nel codice. Per creare lo stesso Pagina dei contenuti utilizzando XAML, fare clic con il tasto destro del mouse sul progetto PCL e selezionare Aggiungi> Nuovo elemento. Dal Aggiungi un nuovo elemento finestra di dialogo, selezionare il Forma pagina Xaml modello e sostituire i contenuti predefiniti con il seguente:

   

Se esegui la tua applicazione, dovresti vedere la stessa schermata dell'esempio di codice. Il Paginadisposizione, e vista i tipi si associano agli elementi XML e le proprietà sono gli attributi dell'elemento. Sei libero di utilizzare entrambe le opzioni per creare interfacce utente completamente personalizzabili e multipiattaforma.

2. Flessibilità attraverso l'associazione dei dati

È possibile creare app in cui creare il vista oggetti per il tuo Pagina oggetti e impostano esplicitamente le loro proprietà, ma questo diventa rapidamente ingombrante. Quando imposti esplicitamente le proprietà nel codice XAML, non puoi più riutilizzare tale XAML Pagina per qualsiasi altra cosa In altre parole, devi creare nuove pagine XAML per ogni variazione di cui hai bisogno. Chi ha tempo per questo?

Non sarebbe bello se tu potessi creare pagine XAML riutilizzabili senza codice di interfaccia utente personalizzato e tenere tutto separato logicamente? Ovviamente. Benvenuto in MVVM.

4. Model-View-ViewModel

Model-View-ViewModel è un modello architettonico creato pensando a XAML. Al centro, condivide il concetto di base di altri modelli architettonici come MVP e MVC. È stato progettato per separare i dati, il livello del modello, dalla presentazione, dal livello di vista. Il condotto tra i due è il ViewModel. Il modello di vista è una classe che facilita la comunicazione tra il modello e i livelli di vista attraverso un meccanismo noto come associazione dati. L'associazione dei dati è al centro del modello MVVM e viene effettuata tramite XAML stesso. Diamo un'occhiata a un esempio.

5. Creazione di un'applicazione di esempio

Inizia creando una nuova applicazione Xamarin.Forms selezionando App vuota (Xamarin.Forms Portable) modello di progetto e dandogli il nome di MyRecipeBox.

Come probabilmente hai intuito, questa sarà la base per un'app di base in grado di memorizzare le ricette. Iniziamo creando un modello base dell'app, una ricetta.

Nel MyRecipeBox progetto, creare una nuova cartella e nominarla Modelli. Questo non è un requisito, ma aggiunge semplicemente un'organizzazione al progetto che aiuta sempre man mano che aumenta. Nel Modelli cartella, aggiungere una nuova classe e nominarla Ricetta. Sostituisci l'implementazione predefinita con quanto segue:

classe pubblica Recipe stringa pubblica Nome get; impostato;  stringa pubblica Descrizione get; impostato;  public TimeSpan PrepTime get; impostato;  public TimeSpan CookingTime get; impostato;  Elenco pubblico Indicazioni get; impostato; 

Ora che hai una classe modello di base, puoi creare un modello di visualizzazione per esso. Pensa a un modello di vista come una classe che contiene le parti di un modello che devono essere mostrate e interagite con uno schermo. Per semplificare le cose, ci concentreremo sulle quattro proprietà principali.

Crea una nuova cartella nel MyRecipeBox progetto e chiamarlo ViewModels. Nel ViewModels cartella, creare una nuova classe e nominarla RecipeViewModel. Quando si adotta lo schema MVVM in .NET, i ViewModels sono in genere caratterizzati dal fatto che implementano il INotifyPropertyChanged interfaccia. Questa interfaccia è ciò che viene utilizzato per consentire ad altre parti del codice di sottoscrivere eventi e abilitare l'associazione dei dati. Sostituire l'implementazione predefinita di RecipeViewModel classe con il seguente:

public class RecipeViewModel: INotifyPropertyChanged Ricetta privata _recipe; evento pubblico PropertyChangedEventHandler PropertyChanged; RecipeViewModel pubblico (ricetta ricetta) _recipe = ricetta; Indicazioni = nuova ObservableCollection(_recipe.Directions);  ObservableCollection pubblica Indicazioni get; impostato;  public string Nome get return _recipe! = null? _recipe.Name: null;  set if (_recipe! = null) _recipe.Name = valore; if (PropertyChanged! = null) PropertyChanged (this, new PropertyChangedEventArgs ("Name"));  public stringa Descrizione get return _recipe! = null? _recipe.Description: null;  set if (_recipe! = null) _recipe.Description = value; if (PropertyChanged! = null) PropertyChanged (this, new PropertyChangedEventArgs ("Description"));  public string PrepTime get return _recipe! = null? _recipe.PrepTime.ToString (): "Nessuno";  set if (_recipe! = null) _recipe.PrepTime = TimeSpan.Parse (valore); if (PropertyChanged! = null) PropertyChanged (this, new PropertyChangedEventArgs ("PrepTime"));  public stringa CookingTime get return _recipe! = null? _recipe.CookingTime.ToString (): "Nessuno";  set if (_recipe! = null) _recipe.CookingTime = TimeSpan.Parse (valore); if (PropertyChanged! = null) PropertyChanged (this, new PropertyChangedEventArgs ("CookingTime")); 

Potresti aver notato che il RecipeViewModel implementa il INotifyPropertyChanged interfaccia. Se approfondisci questa interfaccia, vedrai che contiene una proprietà che deve essere implementata.

interfaccia pubblica INotifyPropertyChanged event PropertyChangedEventHandler PropertyChanged; 

Il RecipleViewModel la classe prende in un'istanza del Ricetta classe e quindi espone solo quattro delle sue proprietà. I getter associati a tali proprietà restituiscono semplicemente i dati nel file Ricetta istanza stessa. Gli incastonatori, d'altra parte, controllano per vedere se PropertyChanged non è nulloPropertyChanged sarà nullo se non ci sono abbonati a questo evento. In tal caso, non succede nulla. Se PropertyChanged non è nullo, quindi l'evento viene chiamato e ogni sottoscrittore dell'evento riceve l'informazione che questo modello di vista è cambiato.

Nel pattern MVVM, il sottoscrittore di questi eventi è in genere la vista descritta da XAML che consente l'aggiornamento dell'interfaccia utente se i modelli sottostanti sono cambiati.

È ora di creare una pagina che mostri all'utente i dati della ricetta e sfrutti l'associazione dati per aggiornare l'interfaccia utente. Inizia creando un Visualizzazioni cartella nel MyRecipeBox progetto. Nel Visualizzazioni cartella, aggiungi un nuovo Forma pagina Xaml e nominalo RecipeSummaryPage.

Sostituisci il file XAML predefinito nel file con il seguente:

    

Come puoi vedere, il legame viene creato posizionando del testo formattato nel punto in cui desideri visualizzare i dati associati. La sintassi per raggiungere questo è "Binding xxxxx", dove xxxxx è il nome della proprietà a cui si desidera associare. Infine, potresti chiederti come leghi il modello di vista che hai creato a questa vista.

Se fai clic sulla piccola freccia accanto al RecipeSummaryPage.xaml file, dovresti vedere apparire un altro file, RecipleSummaryPage.xaml.cs. Questo è il codice dietro il file che contiene il codice C # per eseguire questa pagina. È necessario modificare il costruttore di questa classe per assomigliare a questo:

public RecipeSummaryPage (RecipeViewModel recipeViewModel) InitializeComponent (); this.BindingContext = recipeViewModel; 

Il BindingContext proprietà è dove è necessario assegnare il modello di vista per creare il legame di cui sopra. Per farlo, passa un'istanza del tuo RecipeViewModel nel costruttore.

Per vedere i frutti del nostro lavoro apparire sullo schermo, è necessario apportare una piccola modifica per farlo funzionare. Nel App.cs file, nel MyRecipeBox progetto, aggiorna il GetMainPage metodo come mostrato di seguito.

public static Pagina GetMainPage () var recipe = new Recipe Name = "Toast", Descrizione = "È brindisi, stai scherzando?", PrepTime = new TimeSpan (0, 0, 15), CookingTime = new TimeSpan (0, 2, 0), indicazioni = nuova lista"Afferra il pane", "Metti il ​​pane nel tostapane", "Mangia brindisi"; restituire nuova RecipeSummaryPage (nuovo RecipeViewModel (ricetta)); 

Il risultato dovrebbe essere simile ai seguenti screenshot.

Nel passaggio successivo e finale, creeremo e mostreremo un elenco di Ricetta oggetti che l'utente può fare clic per portarli in una pagina di dettaglio. Iniziamo creando un nuovo modello di vista che contiene un elenco di Ricetta oggetti. Aggiungi una nuova classe al ViewModels cartella e chiamarlo RecipeListViewModel. La sua implementazione è la seguente:

public class RecipeListViewModel public ObservableCollection Ricette get; impostato;  public RecipeListViewModel () Recipes = new ObservableCollection(); Recipes.Add (new Recipe Name = "Toast", Description = "Stai scherzando? Si tratta di toast.", CookingTime = new TimeSpan (0, 2, 0), PrepTime = new TimeSpan (0, 0, 15), Directions = nuova lista "Pick up bread", "Put break in toaster", "Eat Toast"); Recipes.Add (new Recipe Name = "Cereal", Description = "Sai, le cose per la colazione.", CookingTime = TimeSpan.Zero, PrepTime = new TimeSpan (0, 1, 0), Directions = new List "Metti i cereali nella ciotola", "Metti il ​​latte nella ciotola", "Metti il ​​cucchiaio nella ciotola", "Metti il ​​cucchiaio nella bocca"); Recipes.Add (new Recipe Name = "Sandwich", Description = "Bread and stuff. YUM!", CookingTime = TimeSpan.Zero, PrepTime = new TimeSpan (0, 5, 0), Directions = new List "Prendi 2 fette di pane", "Metti il ​​formaggio tra le fette di rottura", "Metti il ​​prosciutto tra le fette di rottura", "Goditi"); 

Potresti aver notato che abbiamo codificato le ricette nel codice RecipeListViewModel classe. In un'applicazione reale, le ricette verrebbero recuperate da un servizio Web o da un database.

Crea una nuova pagina per visualizzare l'elenco di ricette. Nel Visualizzazioni cartella, creane una nuova Forma pagina Xaml e chiama questo RecipleListPage. Sostituisci il suo contenuto con quanto segue:

         

Questo XAML è abbastanza simile all'esempio precedente. Questa volta, tuttavia, hai solo una visualizzazione elenco sulla pagina. Quando si utilizza l'associazione dati in a Visualizzazione elenco, è necessario scavare un po 'più in profondità per eseguire il binding effettivo. Innanzitutto, si lega l'elenco completo al ItemsSource proprietà delVisualizzazione elenco e quindi è necessario definire il Modello e DataTemplate del Visualizzazione elenco essere un TextCell e legalo TextCell alla proprietà individuale del Ricetta istanza che si desidera visualizzare. Questo è ciò che rende i nomi delle ricette sullo schermo.

Puoi anche vedere che c'è un Nome associato al Visualizzazione elencorecipeList, che tornerà utile un po 'più tardi, così come un gestore di eventi. In questo caso, quando un utente tocca un oggetto nel Visualizzazione elenco, il ItemTapped l'evento è licenziato. Ora sei iscritto a quell'evento e userai un metodo chiamato OnItemSelected per gestirlo.

Nel prossimo passo, dovremo fare un po 'di cablaggio nel RecipeListPage.xaml.cs file per impostare ilBindingContext della nostra nuova pagina così come implementare il OnItemSelected gestore di eventi.

public partial class RecipeListPage public RecipeListPage () InitializeComponent (); this.BindingContext = new RecipeListViewModel ();  public void OnItemSelected (mittente dell'oggetto, ItemTappedEventArgs args) var recipe = args.Item as Recipe; se (ricetta == null) ritorno; Navigation.PushAsync (nuova RecipeSummaryPage (nuova RecipeViewModel (ricetta))); // Reimposta l'oggetto selezionato recipeList.SelectedItem = null; 

Il BindingContext la proprietà sarà semplicemente impostata su una nuova istanza di RecipleListViewModel che hai creato prima. Il metodo del gestore di eventi è leggermente diverso. Innanzitutto, è necessario verificare che l'elemento selezionato sia una ricetta, che viene eseguita nelle seguenti righe:

var recipe = args.Item as Recipe; se (ricetta == null) ritorno;

Se l'elemento selezionato è a Ricetta oggetto, quindi usi il Navigazione proprietà per aggiungere una nuova istanza di RecipleSummaryPage alla corrente NavigationView. Infine, è necessario assicurarsi che nessun elemento nell'elenco sia attualmente selezionato.

Navigation.PushAsync (nuova RecipeSummaryPage (nuova RecipeViewModel (ricetta))); // Reimposta l'oggetto selezionato recipeList.SelectedItem = null;

Accedere al Visualizzazione elenco è fatto attraverso il Nome che è stato assegnato ad esso in precedenza. Puoi accedere a qualsiasi vista sulla pagina assegnando a Nome alvista e riferendosi ad esso per nome nel codice.

Il cambiamento finale che dobbiamo fare è aggiornare il GetMainPage metodo nel App.cs file. come mostrato di seguito:

Pagina statica pubblica GetMainPage () return new NavigationPage (new RecipeListPage ()); 

Si restituisce una nuova istanza di NavigationPage classificare come pagina principale e impostare la sua pagina radice su una nuova istanza di RecipleListPage classe. Ora che tutto è cablato, puoi eseguire la tua app su tutte e tre le piattaforme e vedere qualcosa di simile al seguente:

Toccando una delle righe nell'elenco, si accede alla pagina di riepilogo della ricetta corrispondente, come si è visto prima.

Conclusione

Ora hai visto le diverse opzioni per disporre la tua applicazione usando Xamarin.Forms. Dovresti sentirti a tuo agio nella creazione di applicazioni di base che possono essere eseguite sulle principali piattaforme mobili utilizzando una singola base di codice sia per la business logic che per l'interfaccia utente dell'applicazione. Quando hai trascorso un po 'di tempo a lavorare con Xamarin.Forms, il prossimo passo sarà imparare come personalizzare l'interfaccia utente dell'applicazione e aggiungere nuovi controlli. Ma questo è per un altro giorno.

Passaggio successivo: guarda il corso

Se desideri ulteriori informazioni su Xamarin, consulta il nostro corso Creazione di app multipiattaforma con C # in Xamarin. 

Nel corso, imparerai come creare un'applicazione multipiattaforma da un singolo codice base che verrà eseguito su tre piattaforme distinte: iOS, Android e Windows Phone 8. Pensa che non può essere fatto? Tra poco lo farai tu stesso. Andiamo a lavorare.

Puoi prendere subito il completamente gratis Prova di 14 giorni di un abbonamento a Tuts +. Dai un'occhiata alle nostre opzioni di abbonamento per iniziare o, se sei interessato a questo corso, puoi acquistarlo singolarmente per $ 15! Ecco un'anteprima per iniziare: