Sledování změn systémových barev v UWP aplikacích

Uživatelé milují personalizaci a očekávají, že se aplikace adaptují jejich volbám. Za tímto účelem můžeme ve svých aplikacích používat barvu motivu (accent color).  Ale co když uživatel změní nastavení barev za běhu aplikace?

ThemeResource

XAML obsahuje ThemeResource markup extension . To nám umožňuje se dynamicky odkazovat na zdroje dle aktuálně vybraného systémového motivu. Kdykoliv uživatel změní barvu motivu nebo přepne mezi tmavým a světlým tématem, zdroj je aktualizován.

Pro přístup k aktuální barvě motivu, můžete použít klíč SystemAccentColor .

Pro pohodlí je také možné přímo odkazovat na  SolidColorBrush  s barvou motivu pomocí ne-přímo intuitivního klíče SystemControlHighlightAccentBrush .

Sledování změn

Přestože  ThemeResource  je ve většině případů dostačující, někdy potřebujeme být notifikování o změnách barev i mimo XAML. V takových situacích se vyplatí použít třídu UISettings.

V kontrastu s podobnými Windows Runtime API nenabízí UISettings  ani singleton vlastnost Current  ani factory metodu  GetForCurrentView , ale má pouze jednoduchý konstruktor.

Kromě mnoha vlastností které nám dávají přístup k různým informacím o uživatelském rozhraní ( CaretBlinkRate , CursorSize  nebo dokonce  HandPreference ) má třída i dvě užitečné události: TextScaleFactorChanged  a ColorValuesChanged . Zatímco první z nich zpracovává změny ve škálování textu, druhá je volána kdykoliv se změní barevná nastavení systému.

Při zpracování události můžeme barvu motivu získat buď přímo přes slovník Resources  nebo pomocí metody GetColorValue:

Přístup k nastavení světlého/tmavého motivu není tak přímý.  Musíme se podívat na barvu pozadí –   UIColorType.Background – a zkontrolovat zda je černá nebo bílá:

Varování: událost není vždy spolehlivá. Často je zavolána několikrát pro každou změnu barvy, ale někdy není zavolána vůbec. Zřejmě jde o bug.

Ukázkový kód

Připravil jsem testovací projekt, který demonstruje použití události UISettings.ColorValuesChanged  s barvou motivu a se světlým a tmavým vzhledem systému. Řešení je dostupné na mém GitHubu.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

*