Az alkalmazás beállításainak változtatása futásidőben.

Mivel a Windows 8 alkalmazásoknak a beállításai az egységesített Settings Panelen találhatóak, ezért nem közvetlenül az alkalmazásból, hanem egy “külső” felugró UserControlból lehet elérni a beállításokat.

Mivel ez közvetlen nem fér hozzá az alkalmazásunkhoz, ezért egy megoldásként készíthetünk egy publikus eseményt, mely a Settings Panelen lévő változtatáskor meghívódik, és az alkalmazásunkban pedig feliratkozunk erre az eseményre, és az új értékeknek megfelelően módosítja az alkalmazásunkat is.

Először létrehozzuk a User Control kódjában, majd például egy combobox selectionchanged eseményében meghívjuk:

public static event EventHandler SettingsChangedEvent;
public void ComboBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
 {
   //eltároljuk a változásokat
   SettingsChangedEvent(this, EventArgs.Empty);
 }

Nincs más dolgunk, mint az alkalmazásban megmondani, hogy mit csináljon ha ez az esemény megtörténik:

UserControl.SettingsChangedEvent += new EventHandler(UpdateSettingsEvent);
private void UpdateSettingsEvent(object sender, EventArgs e)
 {
 //Megcsináljuk a módosításokat
 }

Ez akkor hasznos, ha rögtön látni szeretnénk a változás eredményeit, például ha különböző színű témák közül szeretnénk választani, de az alkalmazás nyelvét is megváltoztathatjuk anélkül, hogy újra kellene indítani az alkalmazást.

Calendar event helyett ScheduledToastNotification

Mivel Windows 8 alkalmazásban még nem férünk hozzá a naptárhoz, ezért naptári események helyett, időzített emlékeztetőket vehetünk fel, amelyek a felhasználó által kiválasztott időpontban aktiválódnak. Az időpont kiválasztását a Callisto bővítmény jövőben megjelenő DatePicker és TimePicker controlok segítségével tervezem megvalósítani.

Az emlékeztető előnye, hogy akkor is felugrik, ha az alkalmazás éppen nem fut, valamint beállítható hogy bizonyos időközönként ismételve megjelenjen az emlékeztető. Továbbá részletesen testre szabható a kinézete, akár képet is megjeleníthetünk a szöveg mellett.

Hátránya, hogy nem olyan átlátható mint a naptár. Ennek megoldására a felvett emlékeztetőket hozzáadom egy listához, és megjelenítem ItemGridView controlban, így átlátható, hogy mikor és milyen emlékeztetők fognak előugrani a jövőben, és az itt lévő emlékeztetőket akár ki is törölhetem.

Az emlékeztetőkkel egyidejűleg az alkalmazás csempéjére is beállíthatóak időzített változások, ekkor a csempén jelennek meg az emlékeztető információi, melynél szintén testre szabható a kinézet, ám itt a csempe méretétől függően több kinézetet is definiálnunk kell.

Egy fontos dolog, amit sajnos az msnd oldala is figyelmen kívül hagy: Az alkalmazásunk appmanifest beállításaiban a Toast Capable tulajdonságot állítsuk “Yes”-re, mert enélkül nem jelennek meg az emlékeztetők.

Többnyelvű alkalmazás

Valószínűleg minden alkalmazás számára előny, ha a kezelőfelület a felhasználó számára automatikusan a saját nyelvén jelenik meg. Ezt például megállapíthatjuk onnan, hogy megnézzük a felhasználó gépének nyelvi beállításait, amit a CultureInfo.CurrentCulture.Name árul el nekünk, majd betöltjük az ennek a kódnak megfelelő nevű mappában lévő Resources.resw állományt amely NameValue – Comment” értékhármasokból áll. Ezekben tároljuk a különböző nyelvekhez tartozó stringek nevét és értékét.

Az automatikus betöltést a ResourceLoader végzi, melynek a GetSrting(“Name“); metódusával visszaadhatjuk a string értékét, amit mondjuk betöltünk egy TextBlock.Text attribútumába.

Ha viszont a jelenlegi nyelvi beállítások nem megfelelőek és a felhasználó más nyelven szeretné használni az alkalmazást, arra is lehetőséget kell adni, például egy egyszerű combobox segítségével, ahol az comboboxitemek “value” attribútumába írva a nyelvi kódot, átadhatjuk az kiválasztani kívánt nyelvet, és ezzel frissítjük a felhasználó felületet például a SelectionChanged eseménykezelésében. (Ha ez nem passzol az alkalmazás felületére, lehetőség van megvalósítani az alkalmazás Beállításainál a CharmBaron is.)

Ekkor a nyelvet egy kontextusba betöltve, a megfelelő elérési útvonalat megadva, annak GetValue(“Name“, context).ValueAsString; metódusával kaphatjuk meg a kívánt string értékét.

Fontos szem előtt tartani, hogy ha valaki egyéb mértékegységeket is szeretne használni, akkor nem elég csak a nyelvet meghatározni, hanem az országot/régiót is. Például “en” kódú, vagyis angolul beszélő ország több van, de nem mindegyik használ amerikai (“en-US”) mértékeket.