Vývoj pro Windows Phone 7.5

Václav Dajbych       10. 2. 2012       Windows Phone       6039 zobrazení

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.

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 úlohPeriodic 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.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

 

 

Nový příspěvek

 

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback