I designer, generalmente, hanno l'arduo compito di dover realizzare un'interfaccia grafica ed una user experience che si adatti al contesto, come ad esempio Windows che supporta migliaia di risoluzioni e DPI differenti, ma anche al gusto dell'utente, per dare quel tocco di personalizzazione in più che non fa mai male.
Una delle cose più semplici da realizzare per personalizzare l'interfaccia grafica, è quella di sfruttare l'accent color (ovvero il colore predominante, usato anche per il menù start, TitleView delle varie applicazioni etc.) come colore di sfondo, come sottolineatura di parti importanti (come ad esempio la sezione di una NavigationView), come colore per i bordi dei pulsanti. Purtroppo, nonostante ci sia a disposizione la ThemeResource SystemAccentColor, non è detto che questa sia bindabile o utilizzabile ovunque, come ad esempio all'interno di una libreria di controlli.
Per fortuna, il namespace Windows.UI.ViewManagement contiene la classe UISettings, che ci espone diverse proprietà, metodi ed eventi per recuperare tutto il necessario, come dimostrato nell'esempio seguente:
public MainPage() { this.InitializeComponent(); var uiSettings = new UISettings(); uiSettings.ColorValuesChanged += OnColorChanged; } private void OnColorChanged(UISettings sender, object args) { var accentColor = sender.GetColorValue(UIColorType.Accent); Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => MyBackgroundGrid.Background = new SolidColorBrush(accentColor)); }
Come si può notare dall'esempio, infatti, ci siamo andati a registrare all'evento di ColorValuesChanged che viene invocato ogni qualvolta dalle impostazioni di Windows viene cambiato l'accent color o altre tipologie di colori, esposte dall'enum UIColorType. Quindi, una volta recuperato il colore tramite il metodo GetColorValue, lo siamo andati ad impostare come Background sulla Grid da renderizzare a schermo. Da notare che l'operazione è stata eseguita sfruttando il dispatcher di WinRT, necessario affinché non ci siano problemi di marshalling dovuti al fatto che l'evento viene scatenato in un thread differente da quello della UI sulla quale andremo ad eseguire l'operazione di update del colore di sfondo.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Blazor + .NET 6 = .NET ovunque
Calcolare automaticamente un numero di versione di un repository in una GitHub Action
Taggare automaticamente un repository con una pipeline di Azure DevOps
Forzare la lingua dell'interfaccia di Azure Active Directory B2C
Recuperare i dispositivi connessi in tethering con la Universal Windows Platform
Dependency injection nei componenti di Blazor
Reagire alle modifiche della configurazione di ASP.NET Core
Le novità di .NET 6 e C# 10
Migrare da Azure DevOps a GitHub
Utilizzare azurite come simulatore di Azure Storage
Ottimizzare le performance di serializzazione e deserializzazione JSON con System.Text.Json e i source generators