[UWP] Gestire dimensione e posizione delle finestre in un’app Windows 10
In questi giorni sto indagando pesantemente sulle modalità di funzionamento delle finestre del mondo di Universal Windows Platform, ed ho notato che ci sono ovviamente delle pesanti differenze con WPF. Mi sono schiarito un po’ le idee, ed ho deciso di scrivere questo post per riassumere un po’ le cose.
Windows Presentation Foundation
- Mondo a finestre, che possono girare sia come finestre sia a pieno schermo (com’è tradizione del caro buon vecchio mondo Windows, insomma)
- Possiamo impostare la dimensione e la posizione di ciascuna finestra, sia attraverso lo XAML che attraverso il codice
- Le applicazioni WPF per loro natura non ricordano la loro posizione e la loro dimensione: se vogliamo che un’app ricordi posizione & dimensione è tutto a carico del dev dell’applicazione stessa
Universal Windows Platform
Da notare che le linee di codice che vedrete qui sotto si riferiscono alla Release Candidate di Visual Studio 2015, ed alla Build 10240 di Windows 10. Le cose potrebbero cambiare quando il tutto sarà rilasciato in versione finale il 29 Luglio.
- Le app UWP possono girare in finestra, esattamente come una finestra WPF
- Le app UWP possono girare massimizzate, esattamente come una finestra WPF
- Possiamo impostare Windows 10 per girare in modalità Tablet, che “costringe” tutto il desktop a funzionare a pieno schermo. Le app in questo caso si comportano come in Windows 8.1
- Non posso mai impostare la posizione di una finestra (nè con XAML nè con codice): lieto di essere smentito
- Non posso mai impostare la dimensione di una finestra attraverso lo XAML, mentre da codice sì: lieto di essere smentito
- Le app UWP nativamente ricordano la loro ultima dimensione e posizione. Va da sè che quando l’utente riapre l’app XYZ la finestra si riaprirà nello stesso posto
- Posso evitare che un’app UWP ricordi la propria dimensione/posizione giocando con la proprietà ApplicationView.PreferredLaunchWindowingMode (che può valere Auto, FullScreen oppure PreferredLaunchViewSize)
Il tutto passa attraverso l’utilizzo della classe ApplicationView.
Chiedere ad un’app UWP di andare a pieno schermo
var view = ApplicationView.GetForCurrentView();
bool result = view.TryEnterFullScreenMode();
All’interno del codice di un’app UWP possiamo chiedere al sistema operativo di andare a pieno schermo. L’operazione può riuscire oppure no: ecco il motivo per cui restituisce bool. Evitate di impostare un breakpoint in corrispondenza della chiamata a TryEnterFullScreenMode(): l’esecuzione non va come dovrebbe.
Ovviamente possiamo uscire dalla modalità full-screen nel modo seguente:
view.ExitFullScreenMode();
In questo caso non abbiamo alcun valore di ritorno.
Possiamo controllare se la nostra app sta girando in full-screen con la proprietà:
view.IsFullScreenMode
Si tratta di una proprietà in sola lettura: l’unico modo che abbiamo per switchare da una modalità all’altra è quella di passare attraverso i metodi descritti precedentemente,
Chiedere ad un’app UWP se sta girando in tablet mode
La proprietà IsFullScreenMode – come abbiamo appena detto – ci dice se l’app sta girando in pieno schermo. Se vogliamo capire se Windows 10 sta girando in tablet mode possiamo interrogare la proprietà:
view.IsFullScreen
Anche in questo caso si tratta di una proprietà in sola lettura.
Chiedere ad un’app UWP di ridimensionarsi ad una certa dimensione
Dimenticatevi di impostare le proprietà ActualWidth e ActualHeight nello XAML.
Dimenticatevi di impostare le stesse proprietà da codice.
Se in un’app UWP volete modificare la dimensione di una finestra il codice è il seguente:
var view = ApplicationView.GetForCurrentView(); Size size = new Size(640, 480); bool result = view.TryResizeView(size);
Anche in questo caso, possiamo capire se l’operazione è andata a buon fine oppure no controllando il valore di ritorno del metodo TryResizeView. Da notare che la dimensione minima di un’app UWP è 500 x 320: lieto di essere smentito. Se tentiamo di ridimensionare la finestra a, per esempio, 499 x 320, l’operazione fallisce, e TryResizeView ci restituisce false.
Ottenere le dimensioni correnti della finestra
In questo caso le cose sono più semplici, perchè è sufficiente leggere il valore delle proprietà ActualWidth e ActualHeight, esattamente come accadeva con le tecnologie precedenti.
Capire se la finestra è dockata a destra o a sinistra
Come in Windows 8.1, anche con Windows 10 posso agganciare una finestra al lato sinistro o destro del desktop. Per farlo, devo prima attivare la modalità tablet: l’app viene di conseguenza massimizzata sullo schermo, ed a questo punto la posso trascinare a destra o a sinistra, e posso anche ridimensionarla per la sua larghezza. Da codice posso scrivere quanto segue:
var view = ApplicationView.GetForCurrentView(); bool leftSide = view.AdjacentToLeftDisplayEdge; bool rightSide = view.AdjacentToRightDisplayEdge;
Grazie alle proprietà AdjacentToLeftDisplayEdge e AdjacentToRightDisplayEdge (entrambe in sola lettura) posso eventualmente capire in quale situazione mi trovo. Ovviamente possono valere entrambe false in caso di finestra (normale o massimizzata), mentre non potrà mai accadere che entrambe valgano true.
Ottenere o modificare il titolo della nostra applicazione
var view = ApplicationView.GetForCurrentView();
view.Title = "mio titolo";
Le righe di codice qui sopra modificano il titolo dell’app in esecuzione. C’è una particolarità: la stringa che impostiamo viene sempre messa come prefisso rispetto al titolo stabilito nel file di manifest. Non so dire se è un comportamento voluto, oppure se è un qualche problema dovuto a Visual Studio 2015 RC o alla versione corrente di Windows 10.
prova commento 🙂