Oppretting av First Universal Windows App

Creating ditt første Universal Windows App
45
Del
6
Del

Dette Cyber ​​mandag Envato Tuts + Kursene vil bli redusert til bare $ 3. Ikke gå glipp av.

Universal Windows apps gjøre deg i stand til å målrette hver Windows-enhet i én løsning. Du utvikler en gang, dele det meste av koden din, og distribuere på Windows, Windows Phone, eller Xbox.

Målet er å maksimere gjenbruk av kode. Du kan dele kode, brukerkontroller, stiler, strykere, og andre eiendeler mellom Windows Phone og Windows 8 prosjekter i Visual Studio. Dette reduserer innsatsen som trengs for å bygge og vedlikeholde en app for hver type enhet.

Innledning

Fra en utviklers perspektiv, en universell Windows app er ikke en eneste binær som kjører på flere plattformer. Snarere, det tar form av en Visual Studio løsning som inneholder flere prosjekter, ett prosjekt for hver målrettet plattform i tillegg til et felles prosjekt som inneholder kode og ressurser deles mellom plattformer. Mye av koden kan deles mellom de prosjektene som Windows Phone 8.1 implementerer de fleste av WinRT APIer som Windows 8.1 redskaper.

Du kan opprette en Windows Phone program som bruker Silverlight runtime (versjon 8.0 eller 8.1) eller den WinRT runtime (en fra universelle windows apps). Den WinRT runtime lar deg lage ett program som kan kjøres på Windows, Windows Phone, og selv Xbox One.

Vi bruker XAML rammeverk for å utvikle en app for flere plattformer. I den nåværende versjonen er det en API konvergens av 90%, men det er fremdeles et lite sett ikke konvergert ennå. Windows Phone funksjoner kun tilgjengelig i Silverlight rammeverket er:

Objektiver støtte

VoIP støtte

Kamera fangst oppgave

utklippstavlen APIer Anmeldelser
Lås tapet skjermen API

I denne opplæringen, vil jeg bruke en universal Windows app mal for å lage en Hex Clock app, en presis heksadesimale farge klokke. Det går gjennom hele 24 timer fargespekter, fra # 000000 til # 235959. Med hver tick av døgnet, appens bakgrunns endringer i fargen tilsvarende dagens tid konverteres til heksadesimal. Den bruker samme gjennomføring som Hex Color JS Clock å generere heksadesimalkoden av gjeldende tid.

Designen er inspirert av en Windows Phone 7 klokke app tutorial på Tuts +. Mens klokken app bare er rettet mot Windows Phone, vil vi bruke sin design for å gjøre en lignende app for Windows Phone 8.1 og Windows 8.1. Skjermbildet under viser hva vi skal bygge

I denne opplæringen, vil jeg diskutere følgende emner som er relevante for utvikling av universell Windows apps.

  • strukturen av universell Windows apps

    bytte oppstartsprosjekter i Visual Studio

    sammenheng switcher for universell Windows apps i Visual Studio redaktør

    hvordan å skrive cross-platform koden i felles prosjekt

    hvordan å legge til støtte for Windows eller Windows Phone til et eksisterende prosjekt

    bygge en universell Windows app fra bunnen

    1. Oppbygging av Universal Windows Apps

    En universell Windows app er en samling av tre prosjekter som står i en valgfri løsning mappe. Windows og Windows Phone prosjekter er plattform prosjekter og er ansvarlig for å skape de programpakker (.appx), rettet mot de respektive plattformer. Disse prosjektene inneholder eiendeler som er bestemt til plattformen blir målrettet.

    Fellesprosjektet er en beholder for kode som kjøres på begge plattformer. De har ikke en binær utgang, men innholdet blir importert av plattformprosjekter og brukes som en del av byggeprosessen for å generere app pakker (.appx).

    Bildet nedenfor viser den løsningen som Visual Studio oppretter når du velger prosjektet mal for en Blank App (Universal Apps).

    Visual Studio 2 013 Update 2 introduserer den nye funksjonen som er universelle Windows apps. Last ned og installer oppdateringen, før du begynner å bygge universelle Windows apps.

    2. Bytte Oppstart Prosjekter

    Når du kjører løsningen, prosjektet som kjører er den som er valgt som oppstartsprosjektet. Hvis du vil angi oppstartsprosjektet, høyreklikk på prosjektet node i Solution Explorer og velg alternativet Angi som Startup Project. Du kan raskt bytte oppstarts prosjektet fra Debug målet drop-down som nå nummerer alle mulige prosjekter i løsningen.

    Prosjektet som du velger er vist i fet skrift i Solution Explorer. De tilgjengelige debug målene endres når du bytter oppstartsprosjekter.

  • Når Windows prosjektet er oppstart prosjekt, debug target rulle viser alternativer for Windows Simulator eller Local Machine.
  • Når Windows Phone prosjektet er oppstart prosjekt, rulle viser alternativer for Device samt ulike emulatorer.

    3. Kontekst Switcher i Kode Editor

    Når du skriver koden i et felles prosjekt, kan du bruke prosjektet sammenheng switcher i navigasjonslinjen for å velge den plattformen du er aktivt målgruppe, som igjen tilpasser IntelliSense erfaring i koden editor .

    Hvis du bruker en API i delt kode som ikke støttes på begge plattformer, vil en feilmelding identifisere denne APIen når du bygger prosjektet. Du trenger ikke å bygge prosjektet for å bekrefte at du bruker plattformer APIer.

    Følgende skjermbilde viser et eksempel på varselikoner og IntelliSense for en type som støttes bare i Windows Phone-apps .

    4. Cross-Platform Kode i Delt Prosjekt

    I den delte prosjektet, du vanligvis skrive kode som er felles for begge plattformer. For å isolere deler av koden som er plattformspesifikke, bruk # ifdef direktivet. Konstantene WINDOWS_APP og WINDOWS_PHONE_APP er forhåndsdefinert for deg.

    Følgende er betinget kompilering konstanter som du kan bruke til å skrive plattformspesifikke code:
    C#WINDOWS_APP
    WINDOWS_PHONE_APP
    C++
    WINAPI_FAMILY_PC_APP
    WINAPI_FAMILY_PHONE_APP

    When du skriver koden i felles prosjekt, bruker Visual Studio kode editor en kontekst som er rettet mot en plattform eller den andre. I C #, det IntelliSense at du ser når du skriver koden er spesifikk sammenheng med kode editor, som er spesifikk for Windows eller Windows Phone.

    5. Legge til støtte for Windows /Windows Phone

    Hvis du allerede har en eksisterende Windows 8.1 programmet, kan du bruke programmet Legg til Windows Phone 8.1-kommandoen for å legge til en ny Windows Phone 8.1-prosjektet og et felles prosjekt til løsningen. En tilsvarende alternativ er også tilgjengelig hvis du har en Windows Phone 8.1-programmet og du ønsker å legge til støtte for Windows 8.1.

    For å legge til støtte for en type enhet eller en annen, i Solution Explorer, høyreklikk på prosjektet og velg Legg til Windows Phone 8.1 eller Legg til Windows 8.1.

    Her legger Visual Studio en ny Windows Phone eller Windows prosjekt til løsningen. Et felles prosjekt er også automatisk opprettet for deg.

    Følgende skjermbilde viser en løsning etter å ha lagt en Windows Phone-prosjektet til en eksisterende Windows-prosjekt. Den delte prosjekt som er satt til løsningen er i utgangspunktet tom.

    Vær oppmerksom på at hvis du oppretter en app ved hjelp av en universell Windows app mal, inneholder den delte prosjektet allerede App.xaml filen.

    Trinn 1: flytte filer til Shared Prosjekt

    Du kan flytte noen kode som du ønsker å dele mellom apps til den delte prosjektet. For eksempel kan du flytte Common, datamodel, og strykere mapper i den delte prosjektet. Du kan til og med flytte App.xaml til felles prosjekt.

    Du kan likevel få noen kompilator feil om koden du flytter inn i felles prosjekt. Du kan løse disse feilene ved å konfigurere din nye app prosjekt for å ha samme sett av referanser som din første prosjekt.

    Følgende skjermbilde viser den samme forsamlingen referansen lagt til begge prosjektene.

    Hvis delt kode bruker APIer som er spesifikke for Windows, bruk # ifdef direktivet med WINDOWS_APP konstant å isolere den delen av koden. Bruk WINDOWS_PHONE_APP konstant å isolere deler av koden som er spesifikke for Windows Phone 8.1

    Trinn 2:. Share App.xaml

    Når du oppretter en ny løsning for en universell Windows app, Visual Studio steder App .xaml i felles prosjekt. Hvis du konverterer et eksisterende prosjekt til en universell Windows app, kan du flytte App.xaml til felles prosjekt manuelt. Du må sette oppbygging handling eiendom på siden for å ApplicationDefinition etter flytting filen. Her er fremgangsmåten involvert:

    I Solution Explorer, i felles prosjekt, velg App.xaml filen

    Velg Vis >. Egenskaper-vinduet.

  • I vinduet Egenskaper, i Build Handling nedtrekkslisten velger ApplicationDefinition.

    Du må også bestemme hvordan du vil åpne den første siden av app. Hvis du deler App.xaml fil og ønsker å bruke en annen startside for hver app, må du legge til # ifdef direktiver som vist nedenfor.
    #if WINDOWS_APPif (! RootFrame.Navigate (typeof (hubpage))) # endif # hvis WINDOWS_PHONE_APPif # endif (rootFrame.Navigate (typeof (WindowsPhoneStartPage))) {kaster nytt unntak ("Klarte ikke å opprette første siden");}
    6. Kom i gang Skrive en Universal Windows App

    Trinn 1: Prosjektoppsett

    Først plukke et prosjekt mal for en universell Windows app i dialogboksen Nytt prosjekt. Følgende skjermbilde viser de universelle Windows app prosjektmaler som er tilgjengelige for C #.

    Gi prosjektet et navn. Jeg vil bruke Hex Clock Pro
    for prosjektet mitt

    Trinn 2:. Bygging av brukergrensesnitt

    For det meste, tar brukergrensesnittet arbeidsplassen i plattform- konkrete prosjekter, slik at du kan lage et brukergrensesnitt som ser flott ut på PC, nettbrett og telefon, men som deler felles data, ressurser, komponenter, og til og med vise-modeller.

    I stedet for å bygge egne brukergrensesnitt for Windows Phone 8.1 og Windows 8.1 versjoner av Hex Clock Pro, jeg definere en felles design i felles prosjekt. Jeg må bare gjøre noen endringer i XAML av klokken app på Tuts + for å gjøre den jobben for begge plattformer
    < Canvas x. Name = "ContentPanel" Margin = "12,0,620,0" HorizontalAlignment = " Center "Grid.Row =" 1 "RenderTransformOrigin =" 0.5,0.5 "> < Canvas.RenderTransform > < CompositeTransform Rotasjon = "- 30" /> < /Canvas.RenderTransform> < Canvas x: Name = "TimeText" height = "315" Canvas.Left = "- 18" Canvas.Top = "288" width = "496" RenderTransformOrigin = "0.5,0.5" Opacity = "0" &​​gt; < Canvas.RenderTransform > < CompositeTransform /> < /Canvas.RenderTransform> < TextBlock x: Name = "TimeHours" TextWrapping = "Wrap" Text = "12" Canvas.Top = "24" Style = "{StaticResource TimeTextStyle}" Canvas.Left = "- 67" width = "267" TextAlignment = "Right" /> < TextBlock x: name = "TimeDots" Canvas.Left = "204" TextWrapping = "Wrap" Text = ":" Style = "{StaticResource TimeTextStyle}" /> < TextBlock x: name = "TimeMinutes" Canvas.Left = "263" TextWrapping = "Wrap" Text = "59" Canvas.Top = "24" Style = "{StaticResource TimeTextStyle}" width = "257" /> < /Canvas > < rektangel x: Name = "HorizontalSeparator" height = "4" Canvas.Left = "- 400" Canvas.Top = "295" width = "1020" Fyll = "White" /> < rektangel x: Name = "VerticalSeparator" Fyll = "White" height = "469" Canvas.Left = "213" Canvas.Top = "489" width = "4" /​​> < TextBlock x: Name = "ApplicationTitle" TextWrapping = "Wrap" Text = "HEX Clock Pro" Canvas.Top = "271" Forgrunn = "White" skrift = "16" Canvas.Left = "18" /> < TextBlock x: Name = "SecondsLabel" height = "36" Canvas.Left = "23" TextWrapping = "Wrap" text = "sekunder" Canvas.Top = "475" width = "166" TextAlignment = "Right" Style = "{StaticResource SmallTextStyle}" Margin = "0" /> < TextBlock x: Name = "TimeSeconds" height = "205" Canvas.Left = "3" TextWrapping = "Wrap" Text = "59" Canvas.Top = "505" width = "210" skrift = "186,667" RenderTransformOrigin = "0.5,0.5" Opacity = "0" &​​gt; < TextBlock.RenderTransform > < CompositeTransform /> < /TextBlock.RenderTransform> < /TextBlock > < TextBlock x: Name = "DateText" height = "39" Canvas.Left = "208" TextWrapping = "Wrap" Text = "2012/12/31" Canvas.Top = "258" width = "143" skrift = "29,333" Opacity = "0" /> < /Canvas >
    Trinn 3: Deling Kode

    Som omtalt tidligere, kode som er felles for begge plattformer kan settes i felles prosjekt. Kode som bruker plattformspesifikke API må plasseres i en av plattformspesifikke prosjekter. Du kan også bruke # ifdef direktiver å inkludere plattformspesifikk kode i en delt fil.

    Som Hex Clock Pro app ikke bruker noen APIer som er plattformspesifikke, kan jeg legge all koden i felles prosjekt.

    skjule statuslinjen

    I MainPage.xaml.cs i den delte prosjektet har vi brukt # ifdef direktivet å isolere kode er spesifikke for Windows Phone. Koden omsluttet # ifdef skjuler statuslinjen på Windows Phone
    offentlig Mainpage () {this.InitializeComponent (.); #if WINDOWS_PHONE_APP ApplicationView.GetForCurrentView () SetDesiredBoundsMode (ApplicationViewBoundsMode.UseCoreWindow.); #endif}

    Viser gjeldende klokkeslett

    Jeg har brukt DispatcherTimer klassen til å kalle en innledende tick når LayoutRoot rutenettet er lastet. Timeren objekt kaller timer_Tick funksjonen på hvert tick av døgnet.
    try {DispatcherTimer timer = new DispatcherTimer (); timer.Tick + = timer_Tick; timer.Interval = new Timespan (0, 0, 0, 1); timer.Start (); timer_Tick (null, null); //Ring en innledende tick} catch {}

    timer_Tick funksjonen oppdaterer tiden som vises i app, og på samme tid, den oppdaterer bakgrunnsfargen.

    Oppdatering av bakgrunnsfarge
    < p> Bakgrunnsfargen er satt til en heksadesimale farge som tilsvarer det nåværende tidspunkt.
    HexColour color = ny HexColour (hexTime); SolidColorBrush bgBrush = new SolidColorBrush (Color.FromArgb (color.A, color.R, color.G, color.B)); LayoutRoot.Background = bgBrush;

    En Hensikten med HexColour klassen er initialisert med gjeldende klokkeslett, returnerer de tilsvarende RGB-verdier. Konstruktøren av HexColour klassen setter A, R, G, B-verdier for den angitte fargen
    offentlig HexColour (string hexCode) {if (hexCode == null) {kaste nytt ArgumentNullException ("hexCode."); } If {kaste nytt ArgumentException ("Format må være # 000000 eller # FF000000 (uten ekstra mellomrom)", "hexCode") (Regex.IsMatch (hexCode, HEX_PATTERN)!); } //Barbere av # -symbol hexCode = hexCode.TrimStart ('#'); //Hvis ingen alfaverdien spesifisert, antar ingen gjennomsiktighet (0xFF) if (! HexCode.Length = LENGTH_WITH_ALPHA) hexCode = String.Format ("FF {0}", hexCode); _color = ny farge (); _color.A = byte.Parse (hexCode.Substring (0, 2), NumberStyles.AllowHexSpecifier); if (_color.A < 50) _color.A = 50; _color.R = byte.Parse (hexCode.Substring (2, 2), NumberStyles.AllowHexSpecifier); _color.G = byte.Parse (hexCode.Substring (4, 2), NumberStyles.AllowHexSpecifier); _color.B = byte.Parse (hexCode.Substring (6, 2), NumberStyles.AllowHexSpecifier);}

    Legge animasjoner og effekter

    Jeg har etterlignet den første animasjon brukt i forrige klokke app på Tuts + og det er initialisert når LayoutRoot er lastet
    Storyboard sb = (Storyboard) this.Resources ["IntialAnimation"];. sb.BeginTime = TimeSpan.FromSeconds (0,1); sb.Begin ();

    Dette er alt vi trenger for å bygge Hex Clock Pro app. Appen bruker 100% felles kode. Du trenger bare å generere egen app pakker for begge plattformer. Programmet ser veldig lik på Windows Phone og bruker samme XAML-kode for brukergrensesnittet.

    Merk at jeg har lagt all XAML og C # -kode i felles prosjekt, men når jeg distribuere enten Windows app eller Windows Phone app, er koden i felles prosjekt sammen internt med plattformspesifikke prosjekter.

    Konklusjon

    De fleste av koden for Windows app og Windows Phone app er delt, og mens brukergrensesnitt er separate, de er like nok at å bygge både er mindre arbeid enn å bygge to brukergrensesnitt fra scratch.

    Hvis jeg hadde bygget en Windows Phone-versjon av Hex Clock Pro for Windows Phone 7 eller 8, det ville ha vært mye mer arbeid siden Windows Phone 7 inneholder ingen WinRT API-er og Windows Phone 8 inneholder kun en liten del.

    Med Windows 10, vil vi se mer konvergens, som betyr at man API-the WinRT API -For flere plattformer, og en høy grad av troskap mellom elementene i brukergrensesnittet for hver plattform som ikke hindrer utviklere fra å bruke plattformspesifikke elementer for å presentere en best mulig opplevelse på hver enhet. Føl deg fri til å laste ned opplæringen er kildefilene til å bruke som referanse. Hex Clock Pro er også tilgjengelig i markedet for Windows Phone 8.1 og Windows 8.1.