Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 5 - Programujeme pro Windows 8 - Zachování stavu aplikace

V minulé lekci, Programujeme pro Windows 8 - Navigace mezi stránkami, jsme si ukázali jednoduchou navigaci mezi stránkami.

Dnes se pustíme do obsluhy stavu aplikace a zkusíme si ukládat nějaká data.

Na konci minulé lekce jsme si ukázali jednu neplechu. Při navigaci na jinou stránku a zpět nám zmizí veškerá data ze stránky. Daty myslím vyplněné textboxy,dále to mohou být vybrané položky v Listboxu apod. Proč se to děje ?

Navigace a její neplechy

Možná to můžeme nazvat neplechou, já bych to nazval spíše výhodou. Každá stránka se při zobrazení zakládá zcela znovu, proto nám mizí vyplněné položky apod. Při založení stránky se vždy volá metoda LoadState, kterou má každá stránka. Naopak při opuštění stránky se volá metoda SaveState. A v čem že je ta výhoda? Aplikace nám zabírá méně paměti. Sice v našem případě nám to zabírá málo místa i kdybychom měli 100 stránek s jedním textboxem, ale zkuste si představit stránku s 1000 daty a potom přesně 1000 stránek s podrobným popisem dat.

Jelikož jsme v prostředí Modern UI ve Windows 8, nemůžeme argumentovat, že "Dnešní PC mají obrovský výkon, není tohle potřeba řešit." Odpověď zní "Musíme!". Nezapomínejme na různé tablety, které mají mnohonásobně nižší výkon. A tablety s procesory ARM už vůbec. Sice můžeme aplikaci vytvořit pouze pro určitý druh procesorů a na Windows Store stejně aplikaci nabídnout, tj. vypnout podporu pro ARM, ale to předbíhám. Jednou si o tom povíme víc.

Jak tedy řešit ukládání rozepsaných textboxů? Pojďme se na to podívat.

Obsluha stavů aplikace

Jak jsme si řekli v prvním díle aplikace přecházejí do různých stavů. Aplikace mohou přejít do spánku (suspend režim) nebo můžou být zcela vypnuty (terminate). Pokud byla aplikace v suspend režimu, je vhodné, aby se při probuzení zobrazila ve stavu, v jakém ji uživatel opustil. Dnes si toto ukážeme. Než se pustíme do samotného ukládání, pojďme si vlastně říct, jakým způsobem můžeme ukládat data. Windows 8, resp. WinRT nám nabízí několik možností, jak uložit data aplikací. Můžeme je ukládat pouze pro aktuální použití (lze to přirovnat k session v PHP) nebo ukládat na disk uživatele. Ovšem pozor! V prvním díle jsme si neřekli uzavřenost systému. Aplikace pro Modern UI (Metro) nemohou ukládat, kam se jim zachce. Mají pouze speciálně určené místo, které lze přirovnat k Appdata. Celý systém je stejný jako na Windows Phone. Představte si bublinu okolo aplikace. Do této bubliny můžeme data ukládat, mimo bublinu ne.

Uložení stavu aplikace

Máme tedy dvě hlavní možnosti uložení dat a to Appdata pro trvalé uložení a Session pro aktuální uložení, tedy po vypnutí aplikace data ze Session zmizí. My si zkusíme uložit data oběma způsoby. Z textboxu jméno (txName) si uložíme text natrvalo. Z druhého texboxu uložíme text pouze jako session.

Možnosti Appdata ukládání

  • Local settings - lokální nastavení aplikace (klíč <-> hodnota)
  • Local Folder - lokální složka pro soubory aplikace (libovolné soubory)
  • Roaming settings - roaming nastavení aplikace (klíč <-> hodnota)
  • Roaming Folder - roaming složka pro soubory aplikace (libovolné soubory)
  • Temporary folder - temp aplikace

Roaming je speciální složkou/nastavením, které se samo synchronizuje přes SkyDrive. Tímto způsobem zajistíme pohodlné přesunutí dat z jednoho zařízení do druhého. Příkladem může být úkolníček. Napíšete si úkolníček na tabletu a na stolním počítači si je přečtete. Jednoduché, že? :-)

Použití Session (pageState)

Než se pustíme do uložení, trochu si srovnáme termín Sessions. Ačkoliv jsem napsal, že se dá přirovnat k sessions v PHP, není tomu tak. Sessions zde máme představováno slovníky Dictionary<Strin­g,Object>. Každá stránka má vlastní slovník. Tímto můžeme snadno uložit a načítat data každé stránky zvlášť. Předávání data mezi stránkami můžeme udělat přes Navigaci anebo samozřejmě využít různých návrhových vzorů (Singleton,...). Konec povídání jdeme na věc. Máme dvě řešení, jak data uložit. Prvním řešením je zapnutí cachování aplikace stránek. Není to žádná věda. Následující kód dejte do konstruktoru stránky,kde chcete zapnout Cache.

this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;

Nyní se všechny vyplněné textboxy, vybrané položky apod. uloží a při znovuotevření se nám zobrazí ve stavu, v jakém jsme je nechali. Tento způsob my nevyužijeme a ne vždy se používá. Cachování stránek vlastně využívá také Session. My si ukážeme vlastní práci s ukládáním.

Každá stránka obsahuje dvě metody LoadState a SaveState. Co metody dělají je víc než jasné. První načítá data, druhá ukládá :). Zrychlíme trochu tempo a časem si následující řádky vysvětlíme podrobněji. Přesuňte se na App.xaml.cs. Metody OnLaunched a OnSuspending označte jako asynchronní, slovíčko async. Bude to vypadat tedy ve stylu

protected async override void OnLaunched(LaunchActivatedEventArgs args)

V metodě OnLaunched v podmínce if(rootframe==nu­ll) přidejte pod založení Frame následující řádek. Zajistí nám zaregistrování hlavní stránky pro SuspensionManager, který nám zajišťuje ukládání. Podobně musíme registrovat i další stránky.

SuspensionManager.RegisterFrame(rootFrame, "mainPage");

Do podmínky if (args.Previou­sExecutionSta­te == ApplicationExe­cutionState.Ter­minated) přidejte zavolání RestoreAsync(), zajistí zavolání LoadState na všech registrovaných Framech. Bystřejší z vás pochopili, že jej voláme tehdy, kdy se aplikace zcela zapnula. Slovíčko await nám zajistí oddělené vlákno.

await SuspensionManager.RestoreAsync();

V metodě OnSuspending přidejte hned pod první řádek. Tím jsme zajistili zavolání metody SaveState() na všech zaregistrovaných Framech.

await SuspensionManager.SaveAsync();

Přesuňte se do MainPage.xaml.cs. V metodě SaveState si uložíme do LocalSettings jméno a do session vypsaný věk. Sessions je zde představováno slovníkem (klíč <-> hodnota) nazvaném pageState.

// Appdata - stálá data - nastavení aplikace
ApplicationDataContainer localSet =  ApplicationData.Current.LocalSettings;
localSet.Values["name"] = txName.Text;
// session data - akutální data - po terminate stavu data zmizí
pageState["vek"] = txVek.Text;

Do složky LocalSettings jsme si uložili hodnotu textboxu txJmeno a to pouze text. Do sessions (pageState) jsme si uložili věk a opět pouze text. Není potřeba ukládat celý objekt TextBox. Pojďme ještě data načíst a máme hotovo. Následující řádky vložte do metody LoadState().

//načte session
//Podmínka - pagestate nesmí být null a obsahuje klíč "vek" ?
if (pageState != null && pageState.ContainsKey("vek"))
{
         txVek.Text = pageState["vek"].ToString(); //načteme věk z pagestate a uložíme do textu textboxu txVek
 }

//app data - localsetting - nastavení aplikace
ApplicationDataContainer localSet = ApplicationData.Current.LocalSettings;

//Podmínka -  obsahuje klíč "name" ?
if(localSet.Values.ContainsKey("name"))
{
    txName.Text = localSet.Values["name"].ToString(); // načteme klíč
}
Funkční ukládání

Funkční ukládání

A máme hotovo. Zkuste vyplnit textboxy a přejít na druhou stránku. Vraťte se zpět a vidíte, že máme oba textboxy vyplněné. Aplikaci vypněte a zkuste ji zpět zapnout. Pozor, pokud aplikaci spouštíte přes Debug režim, nechte až se Visual Studio přepne zpět do "normálního stavu", tedy vypne se Debug. Bude to trvat právě 10 sekund, aneb Suspend režim v praxi :). Pokud ukončíte debug přes Stop Debuging, není zaručené že se Suspend a veškeré uložení povede. Mluvím z vlastní zkušenosti. Samozřejmě toto platí pouze pro Debug režim. Při normální běhu aplikace, uživatel ani nepozná, že aplikace ještě 10 sekund běží.

Opět jsme u konce. V příští lekci, Programujeme pro Windows 8 - Práce se soubory, se podíváme podrobněji na ukládání do Appdata. Zkusíme si udělat aplikaci na jednoduchou správu uživatelů, která bude umět ukládat a načítat data. Není to žádná věda, jenom si ukážeme potřebné třídy :).

Pokud se vám dnešní lekce líbila, budu velmi rád za zpětnou vazbu. Pokud máte nějaké dotazy určitě se nebojte zeptat. Vždy se pokusím poradit. Jako vždy je přiložen zdrojový kód aplikace.

U další lekce se na vás těším!

V příští lekci, Programujeme pro Windows 8 - Práce se soubory, si ukážeme jakými způsoby ukládat data aplikace.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 231x (283.92 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

Předchozí článek
Programujeme pro Windows 8 - Navigace mezi stránkami
Všechny články v sekci
Windows 10 aplikace v C# .NET
Přeskočit článek
(nedoporučujeme)
Programujeme pro Windows 8 - Práce se soubory
Článek pro vás napsal Petr Nymsa
Avatar
Uživatelské hodnocení:
5 hlasů
Autor se věnuje programování v C# a celkově se zajímá o .NET technologie. Působí jako Microsoft Student Partner.
Aktivity