Nekonzistentní chování Resources v ItemTemplate pro Anniversary Update

Zdá se, že Windows 10 Anniversary Update obsahuje skrytou chybu ve zpracování Resources unvitř ItemTemplate pro položky seznamů. Narazil jsem na ni při práci na UWP aplikaci a popíšu problém samotný spolu s řešením, kterým můžete zajistit, že se vaše aplikace bude chovat správně na všech verzích Windows 10. Pokračovat ve čtení “Nekonzistentní chování Resources v ItemTemplate pro Anniversary Update”

Resource behavior inconsistency for ItemTemplates of list controls in Anniversary Update

It appears that the Anniversary Update has a hidden buggy behavior concerning Resources in ItemTemplates of list controls. I have hit this problem while working on an UWP app and I will describe the problem along with a workaround, which you can use to make sure your app will behave correctly on all versions of Windows 10. Pokračovat ve čtení “Resource behavior inconsistency for ItemTemplates of list controls in Anniversary Update”

WinRT chyták – “one shot” Timer BackgroundTask se neodregistruje po jeho “one shot”

Nejprve – omlouvám všem fanouškům Jacka Reachera, tento článek není o jedné z knih této série, leč jeho název ji obsahuje rovnou dvakrát 🙂 .

V mé poslední vydané Windows 10 aplikaci Event Countdowns jsem udělal nešťastnou chybu. Při registraci Background Tasku který měl aktualizovat dlaždice aplikace každých 30 minut jsem použil následující kód:

Na první pohled nic neobvyklého. Nebo – to jsem si alespoň myslel. Den po vydání aplikace jsem se podíval na připnutou dlaždici odpočítávající čas do premiéry filmu Captain America: Civil War a s velkým překvapením zjistil, že zobrazený zbývající čas je byl o den posunutý! Okamžitě jsem zkontroloval zdrojový kód a po několika minutách zběsilého debugování jsem objevil skryté zlo – druhý parametr konstruktoru třídy TimeTrigger.

Druhý parametr, oneShot, určuje, zda task bude spuštěn pouze jednou (hodnota true) nebo periodicky (hodnota false).

Moje naivní řešení tedy spočívalo ve výměně true za false a protože na počítači aplikace fungovala bez problémů, publikoval jsem aktualizovanou verzi na Store.

Když nová verze aplikace dorazila na můj telefon, s radostí jsem ji nainstaloval, spustil a čekal, až dlaždice znovu oživnou. A čekal jsem. A čekal jsem. A… nic.

Byl jsem zmaten a nechápal jsem, kde může být rozdíl mezi počítačem a telefonem. Tak jsem se znovu vrátil ke zdrojovému kódu a znovu jej promyslel. A pak – jsem to uviděl.

Přirozeně jsem předpokládal, že jakmile oneShot Background Task je jednou spuštěn, systém jej automaticky odregistruje. Ve skutečnosti tomu tak ale není.

I poté co oneShot trigger spustí Background Task, task stejně zůstane zaregistrován!

To znamená, že po instalaci aktualizované verze aplikace na můj telefon a jejím spuštění se při pokusu o registraci tasku kód zastavil na kontrole podmínky  task != null  která se vyhodnotila jako true, protože task byl stále zaregistrován, přestože již proběhl!

Finální řešení tedy vyžadovalo vynutit odregistrování Background Tasku a jeho znovuzaregistrování s oneShot nastaveným na false.

Bug je odchycen a dlaždice znovu žijí!