Vyvíjení aplikací pro Windows Phone 7.5 s kódovým označením Mango je velmi snadné. Je ale dobré znát několik oblastí, které můžou začínajícího vývojáře mást. Článek se zaměřuje zejména na úlohy na pozadí, které mají svá specifika. Ukazuje nahrávání aplikací na Marketplace a jak rychle zkontrolovat nejčastější příčiny zamítnutí aplikací. Dále si ukážeme, jak vypadá Code-First Entity Framework pro práci s místní databází.
Windows Phone 7.5 je vrstva nad Windows CE 7.0 s IE9 a CoreCLR. A protože CoreCLR využívá také Silverlight, vývoj pro WPF, Silverlight či Windows Phone se v zásadě neliší. Co se však liší podstatně, je architektura aplikace, kterou velmi ovlivňují technická specifika Windows Phone. Ty jsou dány především tím, že je zařízení napájeno elektrickým akumulátorem.
Uživatelské rozhraní
Ve WPF funguje binding se vším všudy a MVVM by měl být samozřejmostí. Pro něj je totiž WPF navržené. Windows Phone má však tyto omezení:
- V aplikačním menu (
ApplicationBar
) bindig použít nelze. - Není podpora pro DependencyPropertyDescriptor.
- Commandy chybí úplně.
- Událost DataContextChanged není implementována.
- O Style Trigger si můžete nechat jen zdát.
Dispatcher
se přesunul do Deployment.Current.Dispatcher
. Důležité je myslet na to, že když má ovládací prvek definován odebírání jeho událostí v XAML, název obslužné metody musí být unikátní v tom smyslu, že nesmí existovat metoda, která se stejně jmenuje, ale má jiné parametry. Přesněji řečeno pokud je obslužná metoda registrována v XAML, nesmí být přetížena.
Protože MVVM jde použít jen hybridně, nikoli úplně, nevyhnete se starému přístupu s povolováním či zakazováním ovládacích prvků. Nejjednodušší je vytvořit si metodu, která jednotlivé ovládací prvky nastaví a tu volat vždy, když se provedla nějaká akce, která je ovlivňuje.
Marketplace
Pokud máte ISIC, registraci na App Hub máte zdarma, pokud propojíte svůj ISIC a Windows Live ID na DreamSpark. Před nahráváním aplikace do Marketplace je dobré předejít nejčastějším chybám spuštěním testů v Marketplace Tesk Kit.
Když nahráváte soukromý beta test, tak sice aplikace projde do několika hodin, ale trvá asi den, než se zpropaguje na český Marketplace, odkud je teprve možné jí nainstalovat. Dále je dobré vědět, že beta verze nejde přepsat novější verzí. Je tedy dobré ji v názvu aplikace odlišit, protože název musí být jedinečný.
Entity Framework
Místní Entity Framework se tak podobá (Code-First) Entity Frameworku 4.3 že doufám, že Entity Framework 5 bude jak pro velký .NET, tak i pro CoreCLR. Je zde třída, která představuje databázi a její vlastnosti pak tabulky. Třídy, které představují tabulky, implementují rozhraní INotifyPropertyChanged a INotifyPropertyChanging (aby to měl EF snazší kvůli výkonu). Index se definuje atributem, kterým se odekoruje třída představující tabulku. Migrace se řeší verzováním schématu.
Naplánované úlohy
Jsou dva typy naplánovaných úloh – Periodic a Resource-Intensive. První se spouští často, je však velmi omezená na čas (25 sekund) i paměť, druhá se spouští jen když se telefon nabíjí a je v dosahu Wi-Fi (ale i tak má paměťový limit 6 MB). Na to je nutné myslet při návrhu aplikace a snažit se v úlohách na pozadí provádět jen to nejnutnější. Zbytek operací, které můžou počkat na spuštění aplikace, nechat až na aplikaci. Registrace naplánovaných úloh je záludná v tom, že po přeregistraci zmizí údaje jako LastSheduledTime a LastExitReason.
Vlákna fungují normálně a registrují se přes ThreadPool.QueueUserWorkItem
. Není však dobré registrovat více jak jedno vlákno současně, protože na odezvě uživatelského rozhraní to může být znát. K jednoduché synchronizaci vláken slouží AutoResetEvent.
Když už budete vykonávat kód v jiných vláknech, musíte se zase vrátit do STAThread a v něm provést změny uživatelského rozhraní. Když podědíte ViewModel z této třídy, budete mít už přepínání mezi vlákny implementované:
public class DispatcherControl : INotifyPropertyChanged {
protected void ExecInForeground(Action lambda) {
if (Thread.CurrentThread.IsBackground) {
Deployment.Current.Dispatcher.BeginInvoke(lambda);
} else {
lambda();
}
}
protected void ExecInBackground<T>(Func<T> lambda, Action<T> finish) {
if (!Thread.CurrentThread.IsBackground) {
ThreadPool.QueueUserWorkItem(e => {
Deployment.Current.Dispatcher.BeginInvoke(finish, lambda());
});
} else {
Deployment.Current.Dispatcher.BeginInvoke(finish, lambda());
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String propertyName) {
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler) {
ExecInForeground(() => handler(this, new PropertyChangedEventArgs(propertyName)));
}
}
}
Na pozadí vykonáte práci a jednotlivé vlastnosti ViewModelu nastavíte v STAThredu. Je to nutné, protože nastavením vlastností se vyvolává událost PropertyChanged, kterou odebírají už jednotlivé ovládací prvky uživatelského rozhraní.
Knihovny
Pokud nenajdete dostatek funkcionality v .NETu pro Windows Phone, můžete si ho rozšířit o knihovny ze Silverlightu, které naleznete v C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Libraries\Client\
. Mějte však na paměti, že hlavní důvod, proč tyto knihovny nejsou do Windows Phone zahrnuty, je jejich paměťová náročnost. Ani v Resource-Intensive tasku nejsou použitelné. Další užitečné open-source knihovny pak naleznete na App Hubu.