Contenuti
Nell’applicazione POS è possibile aprire qualsiasi numero di viste in modalità diverse (vista di base, modale o messaggio), ma solo una di ogni gruppo può essere attiva in un dato momento. Le altre viste aperte sono definite come inattive. In ogni momento, quando è aperta qualsiasi vista di base, è possibile chiamare la finestra di navigazione tra le viste di base (menu di navigazione) per attivare un’altra vista attivata che è stata aperta prima e non chiusa (è diventata inattiva). Il menu di navigazione non può essere chiamato nella vista modale né nella vista di messaggio.
Il menu di navigazione può essere chiamato con l’utilizzo della combinazione di tasti CTRL+TAB o con l’utilizzo del pulsante disponibile nella sezione dello stato, accanto all’orologio. In questa finestra, le viste aperte vengono presentate sotto forma di piastrelle colorate con il titolo, l’icona e/o la descrizione addizionale. Il titolo della piastrella può essere impostato tramite la proprietà Header nella classe View o tramite la proprietà SwitchHeader sul viewmodel (quando vogliamo che sia diverso dalla testata della vista). L’icona e il colore vengono impostati con l’utilizzo degli stili che si trovano nel file ModernUI.xaml. L’impostazione del colore e delle icone avviene esattamente nello stesso modo che la definizione del colore e dell’icona per la piastrella registrata nel menu principale. Per questo motivo, se la vista è già registrata nel menu principale, la piastrella nel menu di navigazione assumerà il colore e la piastrella uguali a quelli che si trovano sulla piastrella nel menu principale, a patto che il valore della chiave delle risorse (il primo argomento) utilizzata nel metodo RegisterMenuTile sia uguale al valore della proprietà HeaderLayoutId nel code-behind della vista. Nel nostro caso i nomi sono diversi perciò bisogna aggiungere inserzioni addizionali in ModernUI.xaml.
Definizione in ModerUI.xaml del colore e della icona della piastrella nella finestra del menu di navigazione per la vista di esempio OrdersView:
<SolidColorBrush x:Key="OrdersViewId.Default.Background" Color="Red" /> <models:ImageKey x:Key="OrdersViewId.Default.ImageKey" SvgValue="ListIcon" />
Bisogna ricordare che nel suddetto caso OrdersViewId è il valore assegnato a HeaderLayoutId nella classe della vista.
In aggiunta, esiste la possibilità di aggiungere la descrizione addizionale nella piastrella (così come si può vedere nella piastrella Nuovo ordine nella schermata presentata sopra). Per questo testo è responsabile la proprietà SwitchHeader2 nella classe del view-model.
Creazione delle viste
Le viste possono essere in più modalità (come vista di base, vista modale oppure visa del messaggio). Possiamo decidere se una vista deve essere aperta come vista indipendente da altre viste (voce separata nella finestra del menu di navigazione) o deve essere il figlio della vista attualmente attiva (mancanza di una nuova voce nel menu di navigazione). Aprendo la vista possiamo impostare il parametro IsPreviewMode (apre la vista nella modalità di sola lettura, la maggioranza dei campi di controllo è automaticamente bloccata per la modifica) e qualsiasi numero dei parametri propri.
Le viste possono essere aperte con l’utilizzo dei metodi disponibili nella classe ViewModelBase e nel servizio IViewManager. Il metodo più semplice per aprire la vista di base consiste nel chiamare il metodo OpenView<TView>(), dove TView è il nome della classe della vista che vogliamo aprire o attivare se è già aperta. Parametri aggiuntivi:
- isChild (bool): parametro che indica se la vista aperta deve essere il figlio della vista attualmente aperta,
- parameters (NavigationParameters): parametro che consente di trasferire qualsiasi numero del parametri propri al viewmodel aperto nella vista,
- isPreviewMode (bool): parametro disponibile già nel costruttore del viewmodel della vista aperta (contrariamente a parameters che è disponibile soltanto nei metodi di inizializzazione del viewmodel descritti nel capitolo Ordine di chiamata dei metodi del ViewModel durante la navigazione). Il parametro serve per aprire la vista nella modalità di anteprima (con funzionamento limitato). L’impostazione di questo parametro su true causerà l’impostazione della proprietà per sola lettura IsPreviewMode nella casse ViewModelBase. In aggiunta, i campi di controllo extBox, SwitchBox, RadioButton, NumericTextBox, ComboBox, CheckBox dell’area Comarch.POS.Presentation.Core passano alla modalità di sola lettura, se almeno una di loro si troverà in questa vista.
Per aprire la vista in modalità di vista modale bisogna utilizzare il metodo:
OpenModalView<TView>(), dove TView è il nome della classe della vista che vogliamo aprire o attivare se è già aperta. Parametri aggiuntivi:
- parameters (NavigationParameters): analogici come per OpenView
- isPreviewMode (bool): analogici come per OpenView
Il metodo non possiede il parametro isChild perché tutte le viste modali vengono aperte in modalità gerarchica (sono figli delle viste che li hanno aperte). L’eccezione è costituita dalla mancanza di relazioni tra diversi tipi di viste. Per esempio, dopo l’apertura di una vista modale da una vista di base attiva non viene creata la dipendenza del tipo parent-child.
Per aprire la vista nella modalità di vista del messaggio bisogna eseguire due passi. Prima di loro consiste nell’impostare in xaml la vista di allineamento orizzontale:
<core:View x:Class="Comarch.POS.Presentation.Sales.Views.OrdersView" HorizontalAlignment="Stretch" …
Invece il secondo è il chiamo del metodo:
OpenModalView<TView>(), dove TView è il nome della classe della vista che vogliamo aprire o attivare se è già aperta. Analogicamente come per la vista modale, la relazione parent-child occorre sempre senza la relazione tra diversi tipi di viste. Parametri aggiuntivi:
- parameters (NavigationParameters): analogici come per OpenView e OpenModalView,
- isPreviewMode (bool): analogici come per OpenView e OpenModalView
Se vogliamo visualizzare soltanto un messaggio semplice o una domanda con pulsanti qualsiasi, basta utilizzare il servizio MonitService. Ci sono disponibili metodi come:
- ShowInformation: metodo che visualizza la vista di messaggio con qualsiasi contenuto e il pulsante OK,
- ShowError: metodo che visualizza la vista di messaggio con il contenuto di un’eccezione e il pulsante OK,
- ShowQuestion: metodo che visualizza la vista di messaggio con qualsiasi contenuto e i pulsanti SI e NO,
- Show: metodo che visualizza la vista di messaggio con qualsiasi contenuto e pulsanti qualsiasi delle azioni predefinite (OK, SI/NO) o qualsiasi numero di pulsanti propri.
Più informazioni sui messaggi sono disponibili nell’articolo <<Messaggi>>.
Chiusura delle viste
Per quanto riguarda la chiusura delle viste, abbiamo a disposizione dei metodi che consentono di chiudere la vista attualmente aperta, il metodo che serve a chiudere una vista selezionata (con l’opzione di chiuderla assieme a tutti i suoi figli). Chiudendo una vista possiamo, analogicamente come in caso di apertura, aggiungere parametri propri che verranno trasferiti alla vista che sarà aperta dopo la chiusura della vista attuale.
Dopo la chiusura della vista attiva viene sempre aperta la vista da cui la vista chiusa è stata aperta. Nel caso in cui le viste siano in relazione parent-child (durante l’apertura della vista IsChild=true), durante la chiusura della vista-figlio si ritorna alla vista-padre.
Per chiudere la vista attiva bisogna utilizzare il metodo:
Essendo sul viewmodel bisogna chiamare il metodo Close() che chiama direttamente il metodo CloseView nel ViewManager e trasferisce la sua vista come parametro. Il metodo Close sempre chiude la vista associata al viewmodel attuale. Parametri aggiuntivi:
- parameters (NavigationParameters): parametro che consente di trasferire le informazioni dalla vista chiusa alla vista che verrà attivata
Per chiudere una vista selezionata (attiva o inattiva) bisogna utilizzare il metodo:
CloseView() che si trova nel servizio IViewManager. Parametri aggiuntivi del metodo:
- view (IView): parametro che specifica la vista che deve essere chiusa,
- closeParents (bool): parametro che indica se bisogna chiudere anche tutte le viste dipendenti nella relazione child-parent (viste aperte con il parametro IsChild=true). Per impostazione predefinita, il valore è impostato su
Ordine di chiamata dei metodi di navigazione
Durante la navigazione te le viste (apertura, chiusura, commutazione della vista attiva) vengono chiamati i metodi speciali i view-models che partecipano nella navigazione. Questi metodi permettono di eseguire azioni appropriate, a seconda che la vista venga aperta per la prima volta, venga attivata di nuovo, venga disattivata o chiusa. I view-models forniscono anche i parametri che noi inviamo durante il chiamo dei metodi di apertura e di chiusura.
I metodi di navigazione vengono forniti dalla classe di base di ogni viewmodel, cioè ViewModelBase. Questi sono i metodi OnInitialization, OnActivation, OnActivated, OnDeactivated, Dispose and IsTarget. I metodi automatici adeguati sono chiamati durante il processo di apertura sia sulla vista da cui viene aperta la nuova vista, che sulla vista di destinazione. Nel caso del processo di chiusura i metodi specifici vengono chiamati sulla vista chiusa e sulla vista che verrà attivata dopo la chiusura della vista attuale. La stessa regola riguarda la navigazione tra le finestre aperte. Un’altra questione importante è quello quali metodi vengono chiamati durante la navigazione specifica e il loro ordine.
Il processo di apertura, chiusura e la navigazione tra le finestre viene presentato sul seguente diagramma:
Descrizione dei metodi:
- IsTarget (ViewModelBase)
Viene chiamato durante l’apertura della vista, prima del costruttore della vista, su tutte le istanze dei viewmodel delle viste conformi al tipo aperto. Se non esiste alcun’istanza della vista del tipo aperto, viene creata una nuova vista. Se esistono già viste aperte di tale tipo, il metodo sarà chiamato su ogni viewmodel della vista e nell’ordine della loro apertura. Se uno di essi torna a true, verrà attivato. Se invece nessuna delle viste esistenti di questo tipo torna a true, viene creata una nuova istanza.
- OnInitialization (ViewModelBase)
viene chiamato in ViewModel solo durante l’apertura di una nuova vista (nuova istanza, nuova scheda). Mancanza di accesso al parente (la chiamata di ViewManager.GetParentViewModel(this) restituirà null).
Attenzione: in questo metodo non si deve aprire o chiudere le viste!
- OnActivation (ViewModelBase)
viene chiamato durante ogni apertura della vista o sola attivazione. Mancanza di accesso al parente (la chiamata di ViewManager.GetParentViewModel(this) restituirà null).
Attenzione: in questo metodo non si deve aprire o chiudere le viste!
- OnActivated (ViewModelBase)
viene chiamato durante ogni apertura della vista o sola attivazione.
- OnDeactivated (ViewModelBase)
viene chiamato durante la disattivazione o la chiusura della vista.
- Dispose (ViewModelBase)
viene chiamato soltanto durante la chiusura della vista. Consente di rilasciare le risorse che non possono essere gestite da Garbage Collector o fermare i thread figli.
- OnApplyViewTemplate (View)
Viene chiamato nel code-behind della classe della vista una sola volta, dopo la creazione dell’istanza della vista e caricamento di tutti i componenti (campi di controllo) della vista.