Scalabilità automatica (Windows Form .NET)

La scalabilità automatica consente di visualizzare in modo appropriato un modulo e i relativi controlli, progettati in un computer con una certa risoluzione o tipo di carattere di visualizzazione, in un altro computer con una risoluzione o un tipo di carattere diversi. Questa funzionalità assicura che il form e i controlli vengano ridimensionati in modo coerente con le finestre native e le altre applicazioni presenti sia sui computer degli utenti che su quelli di altri sviluppatori. La scalabilità automatica e gli stili di visualizzazione consentono alle applicazioni di Windows Form di mantenere un aspetto coerente rispetto alle applicazioni Windows native nel computer di ogni utente.

Per la maggior parte, la scalabilità automatica funziona come previsto in Windows Form. Tuttavia, le modifiche apportate allo schema dei tipi di carattere possono essere problematiche.

Importante

La documentazione di Desktop Guide per .NET 7 e .NET 6 è in fase di costruzione.

Necessità di ridimensionamento automatico

Senza ridimensionamento automatico, un'applicazione progettata per un'unica risoluzione dello schermo o tipo di carattere apparirà troppo piccola o troppo grande quando si modifica tale risoluzione o tipo di carattere. Ad esempio, se l'applicazione viene progettata con Tahoma a 9 punti come base, senza regolazione apparirà troppo piccola se eseguita su un computer in cui il tipo di carattere del sistema è Tahoma a 12 punti. Gli elementi di testo, ad esempio titoli, menu, contenuti delle caselle di testo e così via, verranno visualizzati più in piccolo che nelle altre applicazioni. Inoltre, le dimensioni degli elementi dell'interfaccia utente contenenti testo, ad esempio la barra del titolo, i menu e molti controlli, dipendono dal tipo di carattere usato. In questo esempio, tali elementi appariranno anche relativamente più piccoli.

Una situazione analoga si verifica quando un'applicazione è progettata per una determinata risoluzione dello schermo. La risoluzione dello schermo più comune è di 96 punti per pollice (DPI), che è uguale al 100% di ridimensionamento dello schermo, ma una risoluzione superiore visualizza il supporto del 125%, 150%, 200% (che rispettivamente è uguale a 120, 144 e 192 DPI) e versioni successive stanno diventando più comuni. Senza regolazione, un'applicazione, soprattutto una con molti elementi grafici, progettata per un'unica risoluzione apparirà troppo grande o troppo piccola se eseguita con un'altra risoluzione.

Il ridimensionamento automatico cerca di risolvere questi problemi ridimensionando automaticamente il modulo e i relativi controlli figlio in base alle dimensioni relative del carattere o alla risoluzione dello schermo. Per supportare il ridimensionamento automatico delle finestre di dialogo, il sistema operativo Windows usa un'unità di misura relativa, chiamata DLU. Una DLU si basa sul tipo di carattere del sistema e la relazione con i pixel può essere determinata attraverso la funzione GetDialogBaseUnits di Win32 SDK. Quando un utente cambia il tema usato da Windows, tutte le finestre di dialogo vengono automaticamente adattate di conseguenza. Inoltre, Windows Form supporta il ridimensionamento automatico in base al tipo di carattere di sistema predefinito o alla risoluzione dello schermo. Facoltativamente, il ridimensionamento automatico può essere disabilitato in un'applicazione.

Attenzione

Non sono supportate combinazioni arbitrarie di DPI e modalità di ridimensionamento dei tipi di carattere. Anche se è possibile ridimensionare un controllo utente con una sola modalità (ad esempio, DPI) e inserirlo in un form con un'altra modalità (Font) senza problemi, tuttavia, se si combinano un form di base in una modalità e un form derivato in un'altra, è possibile che si verifichino risultati imprevisti.

Scalabilità automatica in azione

Windows Form usa la logica seguente per ridimensionare automaticamente i moduli e il relativo contenuto:

  1. In fase di progettazione, ogni ContainerControl registra la modalità di ridimensionamento e la risoluzione corrente rispettivamente in AutoScaleMode e AutoScaleDimensions.

  2. In fase di esecuzione, la risoluzione effettiva viene archiviata nella proprietà CurrentAutoScaleDimensions. La proprietà AutoScaleFactor calcola in modo dinamico il rapporto tra la risoluzione di ridimensionamento in fase di esecuzione e in fase di progettazione.

  3. Quando il form viene caricato, se i valori di CurrentAutoScaleDimensions e AutoScaleDimensions sono diversi, viene chiamato il metodo PerformAutoScale per ridimensionare il controllo e gli elementi figlio. Questo metodo sospende il layout e chiama il metodo Scale per eseguire il ridimensionamento effettivo. Successivamente, il valore di AutoScaleDimensions viene aggiornato per evitare il ridimensionamento progressivo.

  4. PerformAutoScale viene richiamato automaticamente anche nelle situazioni seguenti:

    • In risposta all'evento OnFontChanged se la modalità di ridimensionamento è Font.

    • Quando il layout del controllo contenitore viene ripristinato e viene rilevata una modifica nelle proprietà AutoScaleDimensions o AutoScaleMode.

    • Come accennato in precedenza, quando è in corso il ridimensionamento di un ContainerControl padre. Ogni controllo contenitore è responsabile del ridimensionamento degli elementi figlio con i propri fattori di scala e non con quello del contenitore padre.

  5. I controlli figlio possono modificare il comportamento di ridimensionamento in più modi:

    • È possibile eseguire l'override della proprietà ScaleChildren per determinare se i controlli figlio devono essere ridimensionati.

    • È possibile eseguire l'override del metodo GetScaledBounds per regolare i limiti in base a cui il controllo viene ridimensionato, ma non la logica di ridimensionamento.

    • È possibile eseguire l'override del metodo ScaleControl per cambiare la logica di ridimensionamento per il controllo corrente.

Vedi anche