...

Dispense lezioneWP - XAML (2726627 byte)

by user

on
Category: Documents
22

views

Report

Comments

Transcript

Dispense lezioneWP - XAML (2726627 byte)
+
Componenti base: Manifest,
App e Pages
Nicolò Sordoni
+ Il file manifest
+ Il file manifest
Come avviene in Android, in ogni applicazione WP è presente
un file manifest, con estensione appxmanifest, che ci permette
di specificare informazioni, permessi e requisiti relativi alla
nostra applicazione. E’ presente un editor visuale per la sua
compilazione ed è suddiviso nelle seguenti categorie:


Application: Permette di specificare informazioni di carattere
generale, fra cui:

Il nome che verrà visualizzato sul device

Descrizione e lingua di default

Orientamenti supportati (portrait / landscape)

Gestione delle notifiche
Visual Assets: immagini e risorse relative al look&feel
dell’app, fra cui il logo, la splash screen e informazioni
relative alla tile
+ Il file manifest

Requirements: Ci permette di specificare dei vincoli ai
device che potranno eseguire la nostra applicazione. Ad
esempio possiamo impedire l’installazione dell’app in
dispositivi che non possiedono un reader NFC.

Capabilities: Indica quali permessi richiede l’applicazione al
sistema, fra cui l’accesso ad Internet, ai contatti o alla
fotocamera. Questo per far sì che l’utente sia sempre
informato riguardo ai permessi concessi alle applicazioni
che installa.

Declarations: Permette di indicare particolari feature che la
nostra applicazione utilizzerà, come ad esempio tasks in
background, accesso a particolari aree di archiviazione,
ecc...

Packaging: informazioni relative al versioning e alla
pubblicazione dell’applicazione
+ La classe App
In ogni progetto troveremo inoltre una classe, denominata App,
che rappresenta l’istanza della nostra applicazione
correntemente in esecuzione nel device.
Ci permette di ridefinire il comportamento dell’applicazione,
per gestire in maniera personalizzata alcune situazioni
particolari della vita dell’applicazione, fra cui il primo avvio, la
sospensione, ecc..
E’ un Singleton, accessibile attraverso la proprietà
App.Current. E’ il file ideale in cui inserire quelle risorse che
devono essere condivise fra tutte le pagine dell’applicazione.
+ La struttura delle Pagine
Ogni schermata dell’applicazione estende la classe base Page
e viene solitamente suddivisa in 2 file:

File di layout : Un file con di tipo XAML, denominato
NomePagina.xaml, che permette di specificare il look&feel
della nostra pagina. Visual Studio ci mette a disposizione un
editor visuale per il posizionamento degli elementi sullo
schermo, ma è anche possibile lavorare direttamente sul
codice XML.

File di codice : Un file C#, denominato NomePagina.xaml.cs,
all’interno della quale specificheremo la logica
dell’applicazione. All’interno di questo file avremo accesso
diretto ad ognuno degli elementi grafici definiti nel file
xaml.
+ XAML
L’XAML è un estensione dell’XML sviluppato da Microsoft
appositamente per la gestione delle interfacce delle proprie
applicazioni. Visual Studio, come Android Studio, ci consente
di editare le informazioni sia lavorando direttamente sul
codice XAML, che tramite un editor visuale (oltre ovviamente
alla possibilità di utilizzare il codice C#).
L’utilizzo dell’XML è molto utile nella realizzazione di
interfacce, dato che permette di sfruttare la struttura ad albero
del linguaggio, per definire in maniera semplice le relazioni
esistenti fra contenitori, che permettono di determinare come
organizzare i controlli, e contenuto, che presenterà all’utente
l’informazione vera e propria
+
L’XAML è un estensione dell’XML sviluppato da Microsoft
appositamente per la gestione delle interfacce delle proprie
applicazioni. Visual Studio, come Android Studio, ci consente
di editare le informazioni sia lavorando direttamente sul
codice XAML, che tramite un editor visuale (oltre ovviamente
alla possibilità di utilizzare il codice C#).
+ XAML : sintassi
Per inserire un controllo all’interno di una
pagina XAML è sufficiente trascinarlo dalla
Toolbox, oppure digitarlo da tastiera (è
sufficiente digitare la parentesi angolare
aperta per avviare automaticamente
l’Intellisense). Ad esempio, per inserire un
bottone, è sufficiente utilizzare il seguente
nodo.
<Button />
E’ inoltre possibile assegnare ad ogni
controllo le specifiche proprietà, ad
esempio:
<TextBlock Text=“Ciao”/>
+ XAML : sintassi
Per assegnare una proprietà ad un oggetto è possibile utilizzare
una sintassi differente che, essendo molto verbosa, è
consigliabile solamente quando è necessario.
Tale sintassi, che fa uso di nodi innestati, è molto utile in presenza
di proprietà complesse, ma controproducente per l’inserimento di
valori semplici. Lo stesso valore può essere modificato da editor,
selezionando il controllo e editando la relativa proprietà
+ XAML : pagine
E’ bene ricordare che ogni pagina XAML può contenere
solamente un root control, quindi, per inserire più controlli
nella stessa pagina, è indispensabile utilizzare degli opportuni
containers
Per inserire una nuova pagina all’interno del progetto, è
necessario aprire il Solution Explorer ed effettuare un click con
il tasto destro sul progetto. Nella finestra che appare
selezionare Add → New item. Dalla nuova finestra che
apparirà, selezionare Blank Page, inserendo in basso il nome
della nuova pagina.
+ XAML : integrazione con il codice
In ogni pagina, è indispensabile la possibilità di recuperare da
codice gli elementi visuali (controlli) in essa contenuta. Per
poterlo fare è sufficiente assegnare ad essi la proprietà x:Name.
A questo punto, in qualsiasi punto del codice sarà possibile
accedere al controllo, semplicemente utilizzando il valore appena
specificato (per accedere al file contenente il codice è possibile
utilizzare il Solution Explorer, oppure fare click con il tasto destro
su un punto qualsiasi della pagina e selezionare “View Code”):
In questo esempio ci siamo limitati a modificare il valore del
testo, utilizzando la proprietà .Text. Ad ogni proprietà che può
essere definita all’interno del file XAML, è sempre possibile
accedere da codice, utilizzando la sintassi
[NomeControllo].[NomeProprietà], sia in lettura che in
scrittura.
+
I controlli
Nicolò Sordoni
+ Controls
Windows Phone ci mette a disposizione una serie di controlli
nativi che ci permettono di organizzare il layout delle nostre
pagine.
Tali controlli possono essere suddivisi in 2 categorie principali:

Containers: Sono dei contenitori, che servono per disporre,
secondo precise logiche, gli elementi presenti al loro interno.

Controlli: sono i controlli veri e propri, cioè dei componenti
grafici che permettono di mostrare informazioni all’utente ed
interagire con esso.
+ Controls
Windows Phone ci mette a disposizione una serie di controlli
nativi che ci permettono di organizzare il layout delle nostre
pagine.
Tali conrolli possono essere suddivisi in 2 categorie principali:

Containers: Sono dei contenitori, che servono per disporre,
secondo precise logiche, gli elementi presenti al loro interno.

Controlli: sono i controlli veri e propri, cioè dei componenti
grafici che permettono di mostrare informazioni all’utente ed
interagire con esso.
+ Grid
La Grid, come indica il nome stesso, è una griglia, che permette
di organizzare gli elementi in formato tabellare. E’ necessario
specificare il numero e la dimensione di righe e colonne, come
nell’esempio seguente:
In tale esempio è stata creata una griglia 2x2, contenente due
righe e due colonne. Come si può notare sono presenti 3
differenti sintassi per specificare le dimensioni.
+ Grid
Per indicare le dimensioni di righe e colonne, abbiamo le
seguenti 3 scelte:

Auto: La dimensione dipende dagli elementi contenuti
all’interno della griglia. La dimensione effettiva
corrisponderà a quella dell’oggetto più “grande” contenuto.

Pixel: Si specifica l’esatto numero di pixel occupati. Gli
elementi più grandi saranno ritagliati.

Star notation: Permette di adattare le righe/colonne in
maniera proporzionale. Il valore non indica la dimensione in
percentuale rispetto al contenitore, ma il rapporto fra i vari
elementi contenuti. Nell’esempio, al posto di 50* e 10*
avremmo potuto scrivere 5* e 1*, mantenendo inalterato il
layout
+ Grid
Tutti gli elementi che vengono inseriti nella Grid, acquisiscono
automaticamente le proprietà Grid.Row e Grid.Column che
permettono di indicare in quale riga e colonna inserire
l’elemento, e Grid.RowSpan e Grid.ColumnSpan che permette
di indicare che una cella debba accorpare più righe o colonne.
Nell’esempio che segue abbiamo inserito un TextBlock
all’interno della cella in posizione (1,0), indicando però che la
cella in cui è contenuto occuperà lo spazio di 2 colonne.
+ RowSpan
+ StackPanel
Questo container è molto semplice, dato che si limita a
visualizzare gli elementi allineati, orizzontalmente o
verticalmente (analogo al LinearLayout).
Per allineare gli elementi è sufficiente inserirli al suo interno. DI
default essi saranno allineati verticalmente, ma è possibile
modificare tale impostazione tramite la proprietà Orientation.
L’esempio che segue mostra l’organizzazione di alcuni testi
attraverso l’utilizzo di 2 StackPanel, innestati all’interno di un
altro
+ StackPanel
+ Canvas
Container che permette di disporre gli elementi tramite
l’assegnamento di coordinate assolute. Ad ogni elemento è
necessario assegnare le proprietà Canvas.Top e Canvas.Left,
per posizionarli in base alla distanza rispetto ai margini
superiore e sinistro del container.
E’ inoltre possibile impostare la proprietà Canvas.ZIndex per
determinare quali elementi dovranno essere visualizzati al di
sopra. Nell’esempio che segue, il rettangolo ha uno ZIndex
maggiore rispetto al textBlock, quindi viene mostrato al di
sopra di quest’ultimo. Il testo è comunque visibile, dato che il
colore del rettangolo è leggermente trasparente (Alpha
channel = D0).
+ Canvas
+ ScrollViewer
Tale contenitore serve esclusivamente per far si che contenuti
di dimensione maggiore rispetto allo schermo possano essere
comunque visualizzati nella loro interezza, abilitando lo
scorrimento.
+ Text Block
Il Text Block è un componente che permette la visualizzazione
di contenuti testuali all’interno delle pagine XAML. Possiede
una serie di proprietà per l’impostazione del testo da
visualizzare. Le più frequenti sono:

Text: Definisce il testo che sarà mostrato all’utente.

Foreground: Specifica il colore del testo.

FontSize, FontWeight, FontFamily: Impostano il font da
utilizzare.
+ Text Block
Oltre alla modalità vista in precedenza, che è il caso di utilizzo
più comune, è possibile suddividere in parti il testo, per
ottenere effetti di visualizzazione differenti all’interno del
medesimo controllo. Tale modalità prevede l’utilizzo dei nodi
<Run /> e <LineBreak/>. Il secondo non è altro che un ritorno a
capo, mentre il primo consente di definire una porzione di testo
a cui assegnare particolari stili.
+ TextBox
Nella quasi totalità delle applicazioni è necessario che l’utente
inserisca delle informazioni testuali. Per farlo, nei sistemi Microsoft
il controllo predisposto a tale scopo è la TextBox, una casella di
testo che consente l’immissione di informazioni da tastiera. Le
principali proprietà del controllo sono:

PlaceholderText : Informazione testuale utilizzata per indicare
all’utente quale informazione dovrà essere inserita nell’area.

Text: Testo del controllo. Può essere utilizzato in scrittura per
precaricare del testo o in lettura per recuperare la stringa
inserita dall’utente.

InputScope: Tipo di informazione richiesta (numero di telefono,
email, ecc). Utile al sistema per presentare all’utente una
versione della tastiera ottimizzata per il tipo specifico.
Esiste inoltre un ulteriore controllo, denominato PasswordBox,
identico alla TextBox, ma mantiene nascosti i caratteri inseriti.
+ TextBox : InputScope
Default
EmailSmtpAddress
TelephoneNumber
Url
+ CheckBox
La CheckBox è una casella di selezione che permette all’utente
di impostare un valore booleano. Nell’esempio in figura l’utente
deve selezionare se è sposato oppure no.
Attraverso la proprietà Content è possibile impostare il testo da
mostrare a fianco della casella o, in alternativa, è possibile
impostare un layout custom.
La proprietà isChecked permette da un lato di impostare lo
stato iniziale che dovrà avere la casella, e dall’altro di leggere il
valore selezionato dall’utente.
+ CheckBox
La CheckBox è una casella di selezione che permette all’utente
di impostare un valore booleano. Nell’esempio in figura l’utente
deve selezionare se è sposato oppure no.
Attraverso la proprietà Content è possibile impostare il testo da
mostrare a fianco della casella o, in alternativa, è possibile
impostare un layout custom.
La proprietà isChecked permette da un lato di impostare lo
stato iniziale che dovrà avere la casella, e dall’altro di leggere il
valore selezionato dall’utente.
+ RadioButton
Il RadioButton è utilizzato per permettere all’utente di
selezionare un valore all’interno di un elenco di elementi
mutuamente esclusivi (uno solo può essere selezionato
all’interno dell’elenco).
Oltre alle proprietà Content e IsChecked, analoghe a quanto
visto per le CheckBox, il RadioButton aggiunge una proprietà
importante, cioè il GroupName. Tale proprietà consente di
indicare al sistema le CheckBox appartenenti allo stesso
gruppo, in maniera che sia Windows a prendersi in carico la
gestione della mutua esclusione.
+ Button
Il Button è il classico bottone che permette all’utente di
effettuare una determinata azione.
Tramite la proprietà Content è possibile indicare l’aspetto
visuale del bottone. Inserendo semplicemente un testo viene
visualizzato il bottone di default del sistema, mentre utilizzando
un XAML, anche complesso, possiamo definire uno stile
completamente personalizzato.
La caratteristica più utilizzata di tale controllo è l’evento Click,
che viene lanciato nel momento in cui l’utente effettua un tap
sul controllo. Per poter intercettare e gestire tale evento, è
necessario approfondire come utilizzare gli eventi in Visual
Studio.
+ Gestione degli eventi
Ogni tipo di controllo, oltre ad avere proprietà specifiche, è in
grado di generare un determinato insieme di eventi. Per
ognuno di essi possiamo definire un metodo specifico, che
verrà invocato nel momento in cui sarà scatenato l’evento.
Per accedere alle proprietà di un
determinato controllo, è necessario
selezionarlo e, all’interno della
finestra delle proprietà, premere il
tasto in alto a destra a forma di
saetta.
A questo punto, una volta
individuato l’evento, è sufficiente
digitare il nome del metodo
corrispondente e premere invio.
+ Gestione degli eventi
A questo punto il sistema aprirà il file C# corrispondente alla
pagina corrente, e potremo notare al suo interno la presenza
del metodo appena definito.
Tale metodo accetta in input due parametri:

object sender : l’oggetto che ha scatenato l’evento; in questo
caso il Button.

RoutedEventArgs e : Un oggetto che contiene una serie di
informazioni specifiche riguardo all’evento che è stato
scatenato.
+ Proprietà comuni
Oltre alle proprietà viste in precedenza per i singoli controlli,
ne esistono altre, condivise fra tutti i Controls, che possono
tornare utili in varie situazioni:

Margin : permette di impostare la distanza fra il controllo e gli
altri a cui è adiacente(o la distanza dal container). Sintassi
ammesse:




Margin=“20” : il Control sarà distanziato di 20 pixel da tutti gli altri
controlli
Margin=“10,30” : i margini orizzontali varranno entrambi 10,
mentre quelli verticali 30.
Margin=“1,2,3,4” : rispettivamente margini sinistro, superiore,
destro ed inferiore.
HorizontalAligment, VerticalAligment : permettono di
impostare il posizionamento del controllo relativamente al
contenitore.
+ Windows Phone Toolkit
Negli esempi visti finora, mancano molti dei controlli tipici
delle applicazioni Windows Phone, come ad esempio il
DatePicker, o gli Switch classici di tale sistema operativo.
Questo perchè Microsoft ha scelto di non includere
direttamente tali Controls all’interno dell’ambiente, ma di
distribuirli in maniera separata tramite un appositio toolkit
opensource.
Per poter utilizzare tali controlli è pertanto indispensabile
scaricare ed installare tale estensione:
https://www.nuget.org/packages/WPtoolkit/
+
Colori, stili e risorse
Nicolò Sordoni
+ La gestione dei colori : i brush
In Windows Phone, per disegnare o riempire determinate aree,
solitamente si fa uso dei cosiddetti brush (pennelli) che sono
degli oggetti in grado di svolgere esattamente tale scopo. I
brush possono essere utilizzati ad esempio per impostare il
colore di sfondo di un determinato pulsante o il colore di un
testo.
Nell’esempio è stato impostato il colore di riempimento di un
rettangolo.
+ La gestione dei colori : i brush
Esistono vari tipo di brush che ci permettono di ottenere vari
effetti:

SolidColorBrush: Il brush più semplice; l’area viene riempita
con il colore specificato.

LinearGradientBrush: Permette di definire un colore sfumato
in maniera lineare.

ImageBrush: Disegna un’immagine

VideoBrush: Viene utilizzato un controllo in grado di
riprodurre un video
+ Le risorse
In ogni applicazione capita innumerevoli volte di avere
determinate risorse (stringhe, brush, valori, ecc...) che si
ripetono più volte all’interno della stessa pagina o all’interno
dell’intera App. In tali situazioni, è estremamente sconsigliato
reinserire manualmente, di volta in volta, la risorsa. Per venirci
incontro sotto questo punto di vista, Windows Phone ci offre un
apposita proprietà, Resources. Essa può essere definita a livello
di:

Applicazione: le risorse definite in tale punto saranno
accessibili a qualsiasi componente dell’app.

Pagina: solo i controlli della pagina potranno accedere a tali
risorse.

Container: La soluzione meno utilizzata. Tutti i controlli (non
solamente i figli diretti) all’interno di tale container avranno
accesso alle risorse.
+ Le risorse
Come detto, per definire una o più risorse, è necessario far
riferimento alla proprietà Resources. Ad esempio, nell’esempio
che segue, si definisce una risorsa di tipo brush ed una di tipo
stringa a livello di singola pagina.
In questo caso è indispensabile definire la proprietà x:Key, affinchè
sia possibile identificare univocamente la risorsa a cui vogliamo
accedere.
Per utilizzare tali risorse all’interno della pagina, è necessario
utilizzare le cosiddette markup extensions, che sono delle
estensioni del linguaggio XAML, che ci permettono di inserire
particolari direttive all’interno delle pagine. Esse vanno racchiuse
fra parentesi graffe. Ad esempio, possiamo notare come, per
identificare una risorsa, sia necessario utilizzare la keyword
StaticResource, seguita dalla Key della risorsa.
+ Gli stili
Gli stili sono l’equivalente dei CSS nelle pagine HTML.
Permettono di impostare determinare proprietà relative ad un
determinato tipo di controllo; tutti i controlli su cui lo stile sarà
applicato assumeranno tali valori.
Nel momento in cui impostiamo uno stile, abbiamo bisogno di
specificare il tipo di controllo su cui andremo ad agire, in
maniera da individuare quali sono le proprietà su cui potremo
agire (ad esempio non è possibile modificare la proprietà Text
di una CheckBox). Per definire il tipo di controllo, useremo la
proprietà TargetType, mentre per impostare le proprietà del
controllo, è necessario far ricorso al tag Setter.
La proprietà x:Key è indispensabile per referenziare
esplicitamente lo stile, ma non è obbligatoria. Nel caso non fosse
presente, lo stile sarà applicato in automatico a tutti i controlli di
quel tipo.
+ Definire risorse in file separati
Al fine di rendere il codice dell’applicazione semplice da
mantenere, è consigliabile definire le risorse all’interno di file
separati. Per farlo è necessario aggiungere al progetto un
nuovo file di tipo ResourceDictionary ( click con il tasto destro
> Add > new Item... > ResourceDictionary.
In tal modo sarà aggiunto un nuovo file al progetto, al cui
interno potremo inserire le nostre risorse. Per poterlo rendere
accessibile all’interno dell’applicazione, la sintassi è la
seguente:
Fly UP