Windows Phone 8 Succinctly: Brukergrensesnittet
27
Del
Del
Del
Dette Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie som heter Windows Phone 8 Succinctly.Windows Phone 8 Succinctly. IntroductionWindows Phone 8 Succinctly: sentrale begreper
Hva er XAML?
XAML er akronym for Extensible Application Markup Language. Det er et kodespråk basert på XML, og dens formål og filosofi er svært lik HTML. Hver kontroll som kan plasseres på en side, enten på en knapp, tekstboks, eller egendefinerte kontroller, er identifisert av en bestemt XML-kode. Som XML, er strukturen hierarkisk; du kan plassere tags inni andre koder. For eksempel er dette hierarkisk struktur hvordan du kan definere oppsettet til en side, takket være noen kontroller som fungerer som en beholder for andre kontroller, som Grid eller StackPanel.
Det følgende er et eksempel på XAML som definerer en Windows Phone side:
< telefon: PhoneApplicationPage x: Class = "FirstApp.MainPage" xmlns = "http: //skjemaer. microsoft.com/winfx/2006/xaml/presentation~~number=plural "xmlns: x =" http://schemas.microsoft.com/winfx/2006/xaml~~number=plural "xmlns: telefon =" CLR-kl Microsoft.Phone.Controls, montering = Microsoft.Phone "xmlns: shell =" CLR-navnerom: Microsoft.Phone.Shell, montering = Microsoft.Phone "xmlns: d =" http://schemas.microsoft.com/expression/blend/2008~~number=plural "xmlns: mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" mc: Ignorerbar = "d" fontfamily = "{StaticResource PhoneFontFamilyNormal}" skrift = "{StaticResource PhoneFontSizeNormal}" Forgrunn = "{StaticResource PhoneForegroundBrush}" SupportedOrientations = "Portrett" Orientation = "Portrett" shell: SystemTray.IsVisible = "Riktig" > < Grid x: Name = "LayoutRoot" Bakgrunn = "Transparent" > < Grid.RowDefinitions > < RowDefinition Høyde = "Auto" /> < RowDefinition Høyde = "*" /> < /Grid.RowDefinitions> < Grid x: Name = "ContentPanel" Grid.Row = "1" Margin = "12,0,12,0" > < StackPanel > < TextBlock Text = "Dette er en side" /> < /StackPanel > < /Grid > < /Grid > < /telefon: PhoneApplicationPage >
PhoneApplicationPage er base klassen av en Windows Phone-side. Som du kan se, er annenhver kontroll plassert inni den. Legg også merke til de x: Klasse attributt; den identifiserer som er den kode bak klasse som er knyttet til denne siden. I dette utvalget vil koden som er i stand til å samhandle med siden lagres i en klasse kalt Main som er en del av FirstApp navnerom. Vi kan se denne klassen ved å klikke på den svarte pilen nær XAML fil i Solution Explorer. Du vil se en annen fil med samme navn av XAML én pluss .cs forlengelse.
La oss begynne å analysere denne enkle XAML å introdusere noen sentrale begreper, som navnerom og ressurser.
Navnerom
Du bør allerede være kjent med navnerom; de er en måte å strukturere koden ved å tildele en logisk vei til klassen.
Som standard tildeler Visual Studio navnerom bruker samme mappestruktur for prosjektet. Dette betyr at hvis du for eksempel har en klasse kalt MyClass lagret inne i en fil i Classes mappen, vil standard fulle navnerom av klassen være Classes.MyClass.
Navnerom i XAML fungerer nøyaktig på samme måte . XAML kontrollene er, til slutt, klasser som inngår i prosjektet, slik at du har å fortelle siden der den kan finne dem. I standard siden kan du se mange eksempler på navne declarations:
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
Every navne starter med xmlns prefiks, som er en standard XML navnerom, etterfulgt av en tilpasset prefiks (i dette eksemplet er det telefon). Dette prefikset er svært viktig, fordi det er den som vi kommer til å bruke i resten av siden for å legge til kontrollene. Deretter definerer vi den fulle navnerommet som inneholder kontrollene. Hvis klassen er en del av vårt prosjekt, er det nok å angi bare navne; ellers må vi også definere hvilke enheten (som er det DLL navn) inneholder klassen.
I forrige eksempel, ønsker vi å inkludere kontroller og ressurser i vår side som er definert inne i Microsoft.Phone. kontroller navnerom, som er inkludert i Microsoft.Phone.dll biblioteket.
PhoneApplicationPage klassen gir deg et eksempel på hvordan du bruker en navnerom. Siden PhoneApplicationPage klassen er en del av Microsoft.Phone.Controls navnerom, må vi legge til prefikset telefonen til tag å bruke det:
< telefon: PhoneApplicationPage />
Det er veldig viktig å forstå hvordan navnerom i XAML arbeid, fordi vi må erklære dem hver gang vi bruker tredjepartskontroller (som vi laget på vår egen eller er en del av et eksternt bibliotek) eller ressurser, som omformere.
Egenskaper og arrangementer
Hver kontroll kan tilpasses på to måter: ved å sette egenskaper og handlinger. Begge er identifisert av attributter for XAML lappen, men de har to ulike formål.
Egenskaper brukes til å endre utseendet eller oppførselen til kontroll. Vanligvis er en eiendom rett og slett satt ved å tilordne en verdi til den spesifikke attributtet. For eksempel, hvis vi ønsker å tildele en verdi til tekst tilhører en TextBlock kontroll, kan vi gjøre det på følgende måte:
< TextBlock Text = "Dette er en tekstblokk" /> < p> Det er også et utvidet syntaks som kan brukes i tilfelle av en kompleks egenskap som ikke kan defineres med en vanlig snor. For eksempel, hvis vi trenger å angi et bilde som bakgrunn en kontrollens, må vi bruke følgende kode:
< Grid > < Grid.Background > < ImageBrush ImageSource = "/Eiendeler /Background.png" /> < /Grid.Background> < /Grid >
Komplekse eiendommene er satt ved hjelp av en nestet tag med navnet på kontroll pluss navnet på eiendommen, atskilt med et punktum (for å sette bakgrunns eiendommen av Grid kontroll, bruker vi Grid.Background syntaks)
En viktig egenskap som deles av alle kontroll er x. Navn, som er en streng som entydig identifiserer kontrollen på siden. Du kan ikke ha to kontroller med samme navn i en enkelt side. Innstilling denne egenskapen er veldig viktig hvis du trenger å samhandle med kontrollen i koden bak-vil du være i stand til å referere til den ved hjelp av navnet.
Arrangementer er en måte å håndtere brukerinteraksjoner med kontrollen . En av de mest brukte er Tap, som utløses når brukere trykker på kontroll
. ≪ Button Tap = "OnButtonClicked" />
Når du definerer en handling, Visual Studio vil automatisk be deg om å opprette en hendelse handler, som er den metoden (deklarert i koden bak) som kjøres når hendelsen utløses
private void OnButtonClicked (objekt avsenderen, GestureEventArgs e). {MessageBox.Show ("Hello world");}
I forrige eksempel, viser vi den klassiske "Hello world" melding til brukere når du trykker på knappen.
Resources
Som i HTML, er vi i stand til å definere CSS-stiler som kan gjenbrukes i ulike deler av nettstedet eller siden. XAML har innført begrepet ressurser som kan brukes til forskjellige kontroller i et program
I utgangspunktet hver XAML kontroll støtter Resources tag:. Takket være hierarki struktur, vil alle andre nøstet kontroll kunne bruke den. I den virkelige verden, er det to vanligste stedene å definere en ressurs:. På side og applikasjonsnivå
Page ressurser er definert i en enkelt side, og er tilgjengelig for alle kontrollene som er en del av den siden. De er plassert i en bestemt egenskap kalt Resources av PhoneApplicationPage klassen
< telefon:. PhoneApplicationPage.Resources > ! < - du kan plassere ressurser her - > < /telefon: PhoneApplicationPage.Resources >
Applikasjons ressurser, i stedet, er globalt tilgjengelig, og de kan brukes inne en side av søknaden. De er definert i App.xaml filen, og standard mal inneholder allerede den nødvendige definisjonen
. ≪ Application.Resources > < - her kan du plassere globale ressurser - > < /Application.Resources>
Hver ressurs er entydig identifisert ved et navn som tilordnes med x: Key eiendom. Hvis du vil bruke en ressurs til en kontroll, trenger vi å introdusere begrepet markerings utvidelser. Dette er spesielle utvidelser som tillater oss å bruke ulike atferd som ellers ville trenge noen kode du skal jobbe. Det er mange markup utvidelser i XAML verden, og man trengte å bruke en ressurs kalles StaticResource. Her er et eksempel på hvordan du bruker det:
< TextBlock Text = "MIN SØKNAD" style = "{StaticResource PhoneTextNormalStyle}" />
I dette utvalget, ressurs påføres stil eiendom ved å inkludere StaticResource søkeord inni bukseseler, etterfulgt av ressursnavnet som er verdien av x. Key eiendom
Ressurser kan også defineres i en ekstern fil som heter ResourceDictionary hvis du ønsker å bedre organisere prosjektet . For å gjøre dette, høyreklikk på prosjektet i Visual Studio, klikk på Legg til > Nytt element, og velg XML-fil. Gi filen et navn som slutter med .xaml forlengelse og inkluderer følgende definisjon:
< ResourceDictionary xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation~~number=plural" xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml" > <! - put ressurser her - > < /ResourceDictionary >
Nå kan du legge det til prosjektet ved å erklære den i App.xaml:
< Application.Resources > < ResourceDictionary > < ResourceDictionary.MergedDictionaries > < ResourceDictionary Source = "Assets /Resources /Styles.xaml" /> < /ResourceDictionary.MergedDictionaries> < /ResourceDictionary > < /Application.Resources>
Legg merke til MergedDictionaries eiendommen: alle eksterne ressurs filene skal bli erklært her. På denne måten vil de automatisk bli slått sammen og hver ressurs erklærte i hver ekstern fil vil være tilgjengelig for hver side, som om de ble erklært inline.
La oss se nå, i detalj, som er den viktigste formen for tilgjengelige ressurser
Styles
XAML stiler fungerer på samme måte som CSS-stiler. du kan definere verdiene av forskjellige egenskaper sammen i en enkel stil som kan brukes på flere kontroller, slik at de alle bruke samme layout. Her er hvordan en stil definisjon ser ut:
< Stil x: Key = "CustomText" TargetType = "TextBlock" > < Setter Eiendom = "skrift" Value = "24" /> < Setter Eiendom = "FontWeight" Value = "Bold" /> < /Stil >
En stil er definert av en stil tag, som har to viktige egenskaper: x: Key, navnet på stilen, og TargetType, type kontroller som vil være egnet for denne stilen.
Inside the Style tag du kan plassere så mange Setter koder som du vil. Hver og en identifiserer en kontroll eiendom du ønsker å endre. Hver Setter tag trenger to attributter: Eiendom er kontrollen eiendom du ønsker å endre, og verdi er verdien du vil tildele til eiendommen
Stilen definert i forrige eksempel kan brukes på alle TextBlock kontroll. . Dens formål er å endre skriftstørrelsen til 24 og å bruke en fet stil på teksten.
Det finnes også spesielle typer stiler kalt implisitte stiler. De er definert på samme måte som stilene i det tidligere eksempelet, bortsett fra at x: Tast egenskap mangler. I dette tilfellet er den stilen automatisk på hver kontroll som er kompatibel med verdien av TargetType eiendom, i henhold til omfanget hvor stilen er definert. Hvis stilen er satt som en side ressurs, vil det kun bli brukt til kontrollene på siden; hvis stilen er satt som en søknad ressurs, vil den bli brukt til hver kontroll i søknaden.
Data Maler
Data maler er en spesiell type ressurs som kan brukes på en kontroll å definere sitt utseende. . Datamaler brukes ofte sammen med kontroller som er i stand til å vise samlinger av elementer, som Liste- eller LongListSelector
Eksemplet nedenfor viser data mal:
< DataTemplate x: Key = "PeopleTemplate" > < StackPanel > < TextBlock Text = "Navn" /> < TextBlock Text = "{Binding Sti = navn}" /> < TextBlock Text = "Etternavn" /> < TextBlock Text = "{Binding Sti = etternavn}" /> < /StackPanel > < /DataTemplate >
En data mal bare inneholder XAML som skal brukes til å gjengi bestemt element. Hvis, for eksempel, bruker vi denne informasjonen malen til ItemTemplate tilhører en ListBox kontroll, vil resultatet bli at den definerte XAML vil bli gjentatt for hvert element i samlingen (for øyeblikket, bare ignorere Binding markup forlengelse, vi ' ll takle det senere når vi snakker om databinding)
Som for alle andre ressurs, kan datamaler bli tildelt en eiendom ved hjelp av StaticResource markup forlengelse
. <. ListBox ItemTemplate = "{StaticResource PeopleTemplate}" />
Animasjoner
XAML er et kraftig språk fordi det tillater oss å gjøre mer enn bare å lage layout av applikasjoner. En av de mest interessante funksjonene er animasjonen funksjonen, som kan bli laget med storyboardet kontroll
The Storyboard kontrollen kan brukes til å definere ulike typer animasjoner.
ColorAnimation, som kan brukes til å samhandle med egenskaper som definerer en farge (som inne i en SolidColorBrush).
PointAnimation, som kan brukes på eiendommer som definerer et punkt koordinere
Følgende eksempelkode definerer en animasjon:
< Storyboard x: Name = "Animasjon "> < DoubleAnimation Storyboard.TargetName = "RectangleElement" Storyboard.TargetProperty = "bredde" From = "200" Å = "400" Varighet = "0:00:04" /> < /Storyboard >
De to første egenskaper er arvet fra Storyboard kontroll: Storyboard.TargetName brukes til å sette navnet på kontroll vi kommer til å animere, mens Storyboard.TargetProperty er eiendommen der verdien vi kommer til å endre seg i løpet animasjonen
<. p> Deretter definerer vi animasjonen atferd: den opprinnelige verdien (Fra eiendommen), sluttverdien (Til-eiendom) og (Varighet eiendom) varigheten. Oppførselen definert i forrige prøven animerer et rektangel kontroll ved å øke sin bredde fra 200 til 400 over 4 sekunder
Vi kan også styre animasjonen dypere ved å bruke UsingKeyFrames variant tilgjengelig for alle animasjonstype.
< Storyboard x: Name = "Animasjon" > < DoubleAnimationUsingKeyFrames Storyboard.TargetName = "RectangleElement" Storyboard.TargetProperty = "bredde" > < LinearDoubleKeyFrame KeyTime = "0:00:00" Value = "200" /> < LinearDoubleKeyFrame KeyTime = "0:00:02" Value = "250" /> < LinearDoubleKeyFrame KeyTime = "0:00:04" Value = "500" /> < /DoubleAnimationUsingKeyFrames > < /Storyboard >
Denne måten du klarer å styre animasjonen er timing. I forrige prøven, er animasjonen type det samme (det er en DoubleAnimation), men vi er i stand til å stille, for en bestemt tid, som er verdien til å søke hjelp av LinearDoubleKeyFrame lappen.
I forrige prøven, bredde rektangulære kontrollen er satt til 200 ved begynnelsen. Så, etter to sekunder, det øker til 250 og etter fire sekunder, er det satt til 500.
Lettelser Animasjoner
En annen måte å lage animasjoner er å bruke matematiske formler som er i stand til å anvende en realistisk oppførsel til et objekt, som spretter, eller akselerasjon og retardasjon. Du kan oppnå samme resultat ved å bruke nøkkelbilder, men det vil kreve mye arbeid. Av denne grunn tilbyr animasjonsrammeverk et sett med forhåndsdefinerte lettelser funksjoner som enkelt kan brukes på en animasjon.
For å legge til en lettere funksjon, du trenger bare å sette EasingFunction tilhører en animasjon, som vist i følgende eksempel:
< Storyboard x: Name = "EasingAnimation" > < PointAnimation Fra = "0.0" Å = "0, 200" Varighet = "00: 00: 3" Storyboard.TargetName = "Circle" Storyboard.TargetProperty = "Center" > < PointAnimation.EasingFunction > < BounceEase Avvisninger = "2" EasingMode = "EaseOut" /> < /PointAnimation.EasingFunction> < /PointAnimation > < /Storyboard >
Etter at du har definert en vanlig animasjon (i eksempelet er det en PointAnimation som beveger en ellipse objekt fra koordinater (0, 0) til (0, 200)), du kan stille EasingFunction eiendom med en av de tilgjengelige lettelser funksjoner. Dette eksemplet viser hvordan du bruker BounceEase funksjonen, som kan brukes til å søke en sprettende effekt til objektet (antall avvisninger utført er spesifisert med Avvisninger eiendom)
Andre tilgjengelige lettelser funksjoner er:.
BackEase, som trekker bevegelse av animasjonen litt før den starter.
CircleEase, som gjelder en sirkulær funksjon til akselerasjon animasjon.
ElasticEase, noe som skaper en animasjon som ligner en oscillerende våren.
Den offisielle MSDN dokumentasjon har en komplett liste over tilgjengelige lettelser funksjoner.
Slik styrer Animasjoner
Animasjoner blir behandlet som ressurser. De kan defineres som lokale ressurser, side ressurser, eller programressurser. I motsetning til tradisjonelle ressurser, Storyboard kontroller identifisert av x: Navn eiendom, som en vanlig kontroll
Eksemplet nedenfor viser en animasjon som er angitt som en side ressurs:
< telefon.: PhoneApplicationPage.Resources > < Storyboard x: Name = "Animasjon" > < DoubleAnimation Storyboard.TargetName = "RectangleElement" Storyboard.TargetProperty = "bredde" From = "200" Å = "400" Varighet = "0:00:04" /> < /Storyboard > < /telefon: PhoneApplicationPage.Resources >
Takket være den unike identifikator, vil du være i stand til å kontrollere animasjon i koden bak. Hver Storyboard objekt tilbyr mange metoder for å kontrollere det, som Begin (), Stop () eller Fortsett (). I følgende kode kan du se hendelsesbehandlinger tildelt to knapper som brukes til å starte og stoppe animasjonen:
private void OnStartClicked (objekt avsenderen, GestureEventArgs e) {Animation.Begin ();} private void OnStopClicked (objekt avsenderen, GestureEventArgs e) {Animation.Stop ();}
Data Binding
Data binding er en av de kraftigste funksjonene som tilbys av XAML. Med data bindende, vil du være i stand til å skape en kommunikasjonskanal mellom en UI element og ulike datakilder, noe som kan være en annen kontroll eller en eiendom i en av klassene. Videre er databinding tungt koblet til XAML varslingssystemet (som vi vil detalj senere) slik at hver gang du endrer noe i objektet, kontroll viser det vil bli automatisk oppdatert for å gjenspeile endringene og vise den nye verdien.
Når du oppretter en kommunikasjonskanal ved hjelp av data bindende, definerer du en kilde (som inneholder data å vise) og et mål (som tar seg av visning av verdi). Som standard er den bindende kanalen satt til OneWay modus. Dette betyr at når kilden endrer seg, blir målet oppdateres for å vise den nye verdien, men ikke omvendt. Hvis vi trenger for å lage en toveis kommunikasjonskanal (for eksempel fordi målet er en tekstboks kontroll og vi trenger å fange en ny verdi satt av brukeren), kan vi sette modus eiendommen av binding til toveis.
< TextBox Text = "{Binding Sti = Navn, Mode = toveis}" />
Nesten hver kontroll i XAML kan delta i databinding. De fleste av de egenskapene som er tilgjengelige for en kontroll, faktisk er avhengighets egenskaper. Utover å tilby grunnleggende lese- og skriveegenskapene, disse er spesielle egenskaper som støtter varsler, slik at de kan varsle den andre siden av kanalen at noe har endret seg.
Følgende eksempel viser hvordan data binding kan brukes til å lage en kanal mellom to XAML kontroller:
< StackPanel > < Slider x: Name = "Volume" /> < TextBlock x: Name = "SliderValue" Text = "{Binding ElementName = Volume, Sti = Verdi}" /> < /StackPanel >
Det første man legger merke til er at for å søke bindende, må vi bruke en annen markering forlengelse, heter Binding. Med dette uttrykket, kobler vi Tekst tilhører en TextBlock kontroll (målet) til verdi tilhører en Slider kontroll heter Volume (kilde).
Siden både tekst og Verdi er avhengige egenskaper, hver gang du flytter glidebryteren, vil den valgte verdien vises automatisk på skjermen i TextBlock kontroll.
Data Binding med objekter
En av de kraftigste databinding funksjonene er muligheten til å koble kontroller med objekter som er en del av koden din. Men først må vi innføre Context konseptet. Context er en egenskap som er tilgjengelig for nesten alle kontroll og kan bli brukt til å definere dens binding sammenheng, som også er automatisk arves av hver nestet styre. Når du definerer et objekt som Context, kontroll og alle barn vil ha tilgang til alle sine eiendommer.
La oss se et eksempel som vil hjelpe deg å bedre forstå hvordan det fungerer. La oss si at du har en klasse som representerer en person:
public class Person {public string Name {får; sett; } Public string etternavn {får; sett; }}
Vårt mål er å vise informasjon om en person som bruker denne klassen. Her er hvordan vi kan gjøre det ved hjelp av databinding. Først, la oss ta en titt på koden bak:
offentlig Mainpage () {InitializeComponent (); Person person = new Person (); person.Name = "Matteo"; person.Surname = "Pagani"; Author.DataContext = person;}
Når siden er initialisert, skaper vi en ny Person objekt og sette en verdi for navn og etternavn egenskaper. Deretter setter vi dette nye objektet som Context av forfatteren kontroll. La oss se på XAML siden forfatteren kontroll og hvordan navn og etternavn egenskaper vises:
< StackPanel x: Name = "forfatter" > < TextBlock Text = "Navn" /> < TextBlock Text = "{Binding Sti = navn}" /> < TextBlock Text = "Etternavn" /> < TextBlock Text = "{Binding Sti = etternavn}" /> < /StackPanel >
Forfatter er navnet som er tilordnet en StackPanel kontroll, som er den beholder vi har plassert inne forskjellige TextBlock kontroller. I forrige prøve kan vi se Binding markup forlengelse i aksjon igjen, denne gangen med en annen egenskap: Path. Vi bruker den til å fortelle XAML som tilhører den aktuelle Context å vise. Siden Context er arvet fra StackPanel kontroll, har hver TextBlock tilgang til egenskapene til den Person objekt vi har laget i koden bak. Legg merke til at Bane attributten er valgfri. De to følgende utsagn er nøyaktig det samme:
< TextBlock Text = "{Binding Sti = navn}" /> < TextBlock Text = "{Binding navn}" />
Den INotifyPropertyChanged grensesnitt
Den forrige koden har en feil. Alt fungerer fint, men hvis du vil endre verdien til en av navn eller etternavn eiendommer under utførelsen, vil brukergrensesnittet ikke oppdateres for å vise den nye verdien. Årsaken er at Navn og etternavn er enkle egenskaper, slik at de ikke er i stand til å varsle brukergrensesnittet at noe har endret seg, i motsetning til avhengighet egenskaper. For dette scenariet har XAML rammeverket introduserte INotifyPropertyChanged grensesnitt som kan implementeres av objekter som har behov for å tilfredsstille dette meldeplikt. Her er hvordan personen klassen kan endres for å implementere dette grensesnittet:
public class Person: INotifyPropertyChanged {private string snitt; private string _surname; offentlig string Name {få {return snitt; } Satt {snitt = verdi; OnPropertyChanged (); }} Public string etternavn {få {return _surname; } Satt {_surname = verdi; OnPropertyChanged (); }} Public event PropertyChangedEventHandler PropertyChanged; beskyttet virtuelle void OnPropertyChanged ([CallerMemberName] string property = null) {PropertyChangedEventHandler handler = PropertyChanged; if (! behandleren = null) handler (Dette nye PropertyChangedEventArgs (property)); }}
Klassen implementerer nå INotifyPropertyChanged grensesnitt, slik at vi kan støtte en hendelseshåndterer (kalt PropertyChangedEventHandler) som utløses hver gang en eiendommens verdiendringer. Klassen implementerer også en metode som kalles OnPropertyChanged () som fungerer som en wrapper av hendelseshåndterer og må startes når en eiendom endringer
Vi trenger. Også en endring i våre eiendommer. Hver gang settet av eiendommen kalles (som betyr at en ny verdi er blitt tildelt) vi heve OnPropertyChanged () -metoden. Resultatet vil være at hver kontroll bundet med eiendommen vil bli varslet om endringen, og vil oppdatere sin visuelle status tilsvarende.
Data Binding og samlinger
Data binding er spesielt nyttig når du må avtale med samlinger av gjenstander som arrays eller lister (i utgangspunktet, hver rammeinnsamlings typer som implementerer IEnumerable grensesnittet). Nesten hver kontroll som støtter samlinger, som arver fra ItemsControl klasse (som Liste- eller LongListSelector), har en egenskap som kalles ItemsSource, som kan direkte tilordnes en liste.
Du kan kontrollere hvordan hver gjenstand av samlingen vil bli gjort ved hjelp av ItemTemplate eiendommen. Som vi har sett når vi snakket om data maler, gjør denne eiendommen oss å sette som XAML til å bruke for å vise objektet.
Nå som vi har snakket om data bindende, det er en annen viktig brikke for å legge til. I eksempelkoden vi brukt til å vise data maler, inkluderte vi noen bindende uttrykk for å vise navn og etternavn på en person
< DataTemplate x. Key = "PeopleTemplate" > < StackPanel > < TextBlock Text = "Navn" /> < TextBlock Text = "{Binding Sti = navn}" /> < TextBlock Text = "Etternavn" /> < TextBlock Text = "{Binding Sti = etternavn}" /> < /StackPanel > < /DataTemplate >
Når du setter en samling som ItemSource, hvert objekt som er en del av det blir Context av ItemTemplate. Hvis du for eksempel er ItemsSource tilhører en ListBox koblet til en samling som type er List < Person >, vil kontrollene inngår i ItemTemplate kunne få tilgang til alle egenskapene til personen klassen
Dette. er den virkelige betydningen av forrige eksempelkode: For hver person objekt som er en del av samlingen, kommer vi til å vise verdiene av navn og etternavn egenskaper
En annen viktig brikke i puslespillet når deg. håndtere samlinger er ObservableCollection < T > klasse. Det fungerer som en vanlig samling, slik at du enkelt kan legge til, fjerne og flytte objekter. Under panseret, implementerer det INotifyPropertyChanged grensesnitt, slik at hver gang innsamling endres, mottar UI et varsel. På denne måten hver gang vi manipulere samlingen (for eksempel, legger vi til et nytt element), kontrollen som er koblet til den vil automatisk bli oppdatert for å gjenspeile endringene.
omformere
Omformere spille en viktig rolle i databinding. Noen ganger, faktisk, må du endre kildedataene før den sendes til målet. Et vanlig eksempel er når du har å forholde seg til Datetime egenskaper. Datetime klassen inneholder en full representasjon av en dato, inkludert timer, minutter, sekunder og millisekunder. Mesteparten av tiden, men du trenger ikke å vise full representasjon-ofte datoen er akkurat nok.
Det er der omformere komme til nytte. Du er i stand til å endre dataene (eller, som vist i følgende eksempel gjelde annen formatering) før du sender den til kontrollen som kommer til å vise det ved hjelp av databinding.
For å opprette en konverter, trenger du å legge til en ny klasse i prosjektet (høyreklikk i Visual Studio, velger du Legg til > Class), og det må arve fra IValueConverter grensesnittet. Det følgende er en omformer prøve:
public class DateTimeConverter: IValueConverter {public objekt Convert (objekt verdi, Type targetType, objekt parameter, Culture kultur) {if (! Value = null) {Datetime date = (Datetime) verdi; returnere date.ToShortDateString (); } Returnere string.Empty; } Public objekt ConvertBack (objekt verdi, Type targetType, objekt parameter, Culture kultur) {if (verdi = null) {Datetime date = DateTime.Parse (value.ToString ()); returdato; } Returnere DateTime.Now; }}
Når du støtter IValueConverter grensesnittet, er du tvunget til å gjennomføre to metoder:.
Convert () er den metoden påberopes når data fra kilden sendes til målet
ConvertBack () gjør det motsatte-den startes når data fra målet blir sendt tilbake til kilden.
Mesteparten av tiden er det nok til å gjennomføre Convert () metode som støttes av hver binding. Den ConvertBack () metoden, i stedet, støttes bare når du har toveis bindende
Begge metodene motta viktig informasjon som inngangsparametere.
Eiendommen at bindingen har blitt brukt til.
En valgfri parameter som kan settes i XAML bruker ConverterParameter eiendommen. Denne parameteren kan brukes til å bruke en annen atferd i konverteren logikk.
Den forrige kodeeksemplet viser Datetime eksempel nevnt før. I Convert () -metoden får vi den opprinnelige verdien, og etter at vi har konvertert den til en Datetime objekt, returnerer vi en streng med kort formatering.
I ConvertBack () metoden, får vi streng returnert fra kontroll og konvertere den til en Datetime objekt før du sender den tilbake til koden.
omformere blir behandlet som ressurser-du trenger å erklære dem og inkludere dem i forpliktende uttrykk ved hjelp av StaticResource søkeord.
< telefon: PhoneApplicationPage.Resources > < omformere: DateTimeConverter x: Key = "DateConverter" /></phone:PhoneApplicationPage.Resources><TextBlock Text = "{Binding Sti = fødselsdato, Converter = {StaticResource DateConverter}}" />
Det er viktig å understreke at omformere kan ha en negativ innvirkning på ytelsen hvis du bruker dem også tungt, siden bindingen operasjonen må gjøres på nytt hver gang dataene endres. I dette tilfellet er det bedre å finne en måte å direkte endre kildedataene eller for å legge til en ny eiendom i klassen med den endrede verdien.
Controls
Windows Phone 8 SDK inneholder mange innebygde kontroller som kan brukes til å definere brukergrensesnittet til applikasjonen. namespace:
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
Pivot
The < shell: ApplicationBar.MenuItems > sett; sett; sett; sett; </toolkit:NavigationInTransition></toolkit:TransitionService.NavigationInTransition><toolkit:TransitionService.NavigationOutTransition> </toolkit:NavigationOutTransition></toolkit:TransitionService.NavigationOutTransition>
Transitions </toolkit:NavigationInTransition></toolkit:TransitionService.NavigationInTransition><toolkit:TransitionService.NavigationOutTransition> </toolkit:NavigationOutTransition></toolkit:TransitionService.NavigationOutTransition>
Then,