Min første Windows 8-applikasjon

Forrige uke tok jeg deg med på en omvisning i Visual Studio 11, installerte Team Foundation Server 11 og startet en grunnleggende Windows 8 Metro / WinRT-applikasjon fra en mal. I dag vil jeg bytte ut datakildene i applikasjonen med tilkoblinger til Microsoft Research OData-kilden.

En unnlatelse fra forrige uke var at jeg ikke viste fullskjermvisning av Visual Studio 2011. Figur A har den visningen. Som du kan se, er noen av bekymringene som kommer til uttrykk i kommentarene om at UI er "flate" og vanskelige å skille ting godt. Dette er en vanlig klage fra en rekke prominente nettsteder og forfattere, og forhåpentligvis vil Microsoft bestemme seg for å legge form over funksjon her, spesielt siden Visual Studio 11 ikke er et Metro-program og ikke trenger å dele Metro-utseendet. Figur A

Visual Studio 11 ser ut som et bilde av månen ... alt grått med kraterlignende ikoner. (Klikk på bildet for å forstørre.)

Etter at jeg brukte malen til å lage de grunnleggende tarmene til applikasjonen, er det på tide å få den til å hente data fra Microsoft Research. Jeg prøvde å følge Samidip Basus opplæring for dette formålet, men det er ikke nøyaktig, siden det oppretter klasser som er avhengig av System.Data, som ikke er tilgjengelig fra WinRT. Visual Studio 11s Service Reference wizard vil heller ikke opprette proxy-klasser for OData.

La oss få dette rett ut: Microsoft legger ned massevis av arbeid i Azure Data Market (ved å bruke OData), får folk som bruker OData ut av LightSwitch og Entity Framework, etc., skyver alle slags andre OData-relaterte teknologier, og leverer da ikke kompetent OData-støtte i Visual Studio 11 for Metro / WinRT-applikasjoner? Kom igjen Microsoft, hvordan forventer du at vi tar OData på alvor når du ikke gjør det? Når vi snakker om "ikke støttet", har WinRT foreløpig ikke en innebygd HtmlDecode-funksjon.

Så det er på tide å prøve ruten bak og gjøre det for hånd. Jeg tar SampleDataSource.cs-filen, og gir nytt navn til den og klassene innenfor til mer passende navn (jeg bytter ut "Sample" med "MicrosoftResearch"). Deretter tar jeg klassen MicrosoftResearchDataItem og legger til en Uri-egenskap for å lagre URI til den faktiske varen. Alle klassene mine er nå forberedt på et grunnleggende nivå.

MicrosoftResearchDataSource (nee SampleDataSource) -klassen har hardkodede data. Den bruker et enkelt dataelement som den legger til et par ganger til hver gruppe. Det er enkelt å trekke gruppeinformasjon dynamisk. Endepunktet for OData-tjenesten er http://odata.research.microsoft.com/odata.svc, og når du drar det opp, får du en liste over hver tilgjengelige gruppe. Jeg bruker en WebClient-samtale for å laste ned dataene. Husk at med WinRT (omtrent som Windows Phone 7), må potensielt langvarig operasjon utføres asynkront. Jeg har allerede skrevet denne koden i min Airport Status Checker WP7-applikasjon, men det er nok forskjeller mellom WP7-klasser og WinRT-er at en direkte oversettelse ikke skjer. For eksempel har WP7 objektet "WebClient", som asynkron fremsetter en forespørsel og returnerer enten byte-matrise eller en streng og avfyrer en hendelsesbehandler når det er gjort. WinRT har "HttpClient", som bruker det nye "async" -systemet for å lage forespørselen, så du bruker "venter" for å lytte etter resultater. Dette krever også en liten endring i strukturen på grunn av kravene til async / avvente.

Å skrive koden for å bruke dataene er en fryktelig opplevelse. Fra topp til bunn er dette den typen ting datamaskiner ble oppfunnet for å håndtere automatisk. I stedet betyr mangelen på en skikkelig proxy-klasseoppretter at jeg må skrive og feilsøke alt for hånd, finne ut hvilke felt som er valgfrie og obligatoriske, vanlige og ikke, og koding for det. Ærlig talt, det å gjøre dette arbeidet for hånd er helt brutalt, elendig og meningsløst, og det tok meg en time eller to å gå fra å innse at jeg trengte å skrive det for hånd til å ha data på skjermen. Her er koden jeg skrev:

 offentlig forseglet klasse MicrosoftResearchDataSource 

{

private ObservableCollection _itemGroups = new ObservableCollection ();

public ObservableCollection ItemGroups

{

få {return this._itemGrupper; }

}
 privat async ugyldig GetGroups () 

{

{

var nedlasting = ny HttpClient ();

downloader.MaxResponseContentBufferSize = int.MaxValue;

var groupXml = avvente nedlastning.GetStringAsync ("http://odata.research.microsoft.com/odata.svc/");

var groupData = XDocument.Parse (groupXml);

var workspaceName = XName.Get ("arbeidsområde", "http://www.w3.org/2007/app");

var titleName = XName.Get ("title", "http://www.w3.org/2005/Atom");

var collectionName = XName.Get ("samling", "http://www.w3.org/2007/app");

var entryName = XName.Get ("entry", "http://www.w3.org/2005/Atom");

var contentName = XName.Get ("innhold", "http://www.w3.org/2005/Atom");

var egenskaperName = XName.Get ("egenskaper", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata");

var idName = XName.Get ("id", "http://www.w3.org/2005/Atom");

var sammendragName = XName.Get ("sammendrag", "http://www.w3.org/2005/Atom");

var nameName = XName.Get ("Navn", "http://schemas.microsoft.com/ado/2007/08/dataservices");

var descriptionName = XName.Get ("Beskrivelse", "http://schemas.microsoft.com/ado/2007/08/dataservices");

var urlName = XName.Get ("URL", "http://schemas.microsoft.com/ado/2007/08/dataservices");

XElement sammendragElement;

XElement nameElement;

XElement beskrivelseElement;

XElement urlElement;
 foreach (var samling i groupData.Root.Element (arbeidsområdenavn) .Elements ()) 

{

prøve

{

if (collection.Name == collectionName)

{

var groupName = collection.Element (titleName) .Value;

var group = new MicrosoftResearchDataGroup (groupName, groupName, "", "", "");
 var itemsXmlStream = avvente nedlasting.GetStreamAsync ("http://odata.research.microsoft.com/odata.svc/" + collection.Attribute ("href"). Verdi); var itemData = XDocument.Load (itemsXmlStream); 
 foreach (var item in itemData.Root.Elements ()) { 
 if (item.Name == entryName) 

{

var egenskaper = item.Element (contentName) .Element (PropertiesName);

prøve

{

SummaryElement = item.Element (SummaryName) ?? nye XElement ("sammendrag");

nameElement = egenskaper.Element (nameName) ?? nye XElement ("navn");

descriptionElement = egenskaper.Element (beskrivelseName) ?? nye XElement ("dekryptering");

urlElement = egenskaper.Element (urlName) ?? nye XElement ("URL");

var dataItem = new MicrosoftResearchDataItem (item.Element (idName) .Value, item.Element (titleName) .Value, summaryElement.Value, "", nameElement.Value, descriptionElement.Value, urlElement.Value, group);

group.Items.Add (dataItem);

}

fangst (unntak eks)

{
 } 

}

}
 this._itemGroups.Add (gruppe); 

}

}

fangst (XmlException eks)

{
 }} 

Når jeg har fått det til å fungere, finjusterer jeg XAML litt, først og fremst for å bli kvitt bildet (siden det ikke er bilder å bruke i dataene) og legge til nettadressene til elementene. Jeg oppdager også at XAML inneholdt referanser til den opprinnelige SampleDataSource-klassen (selv om "Rename" visstnok sjekker alle filene for den) for designtidstid. Jeg prøver å endre den til min nye datakildeklasse, men dette var en absolutt elendig prosess fordi den kontinuerlig forsøkte å innlede min datakildeklasse; denne datakilden må trekke massevis av data fra nettverket og analysere den. Som et resultat velger jeg å lage en "SampleMicrosoftResearchDataSource" som håner opp MicrosoftResearchDataSource (og får den til å bruke noe hardkodet innhold) og bruke den til designtidens visning. Forresten, samtalen som instantiserer / binder dataene til applikasjonen under kjøretid, er i App.xaml.cs; det oppretter MicrosoftResearchDataSource-objektet og overfører det til navigasjonsmetoden i rotrammen. Det er ganske stygt, det er ikke veldig intuitivt, og det er vanskelig å oppdage hvor nøyaktig data kommer fra, noe som kompliserer et grep jeg har hatt om XAML og binding i lang tid.

Søknaden fungerer fint. Figur B viser for eksempel en av varevisningene (jeg trenger å fjerne HTML-filen ut av teksten). Jeg liker at kontrollene til høyre og venstre for å tillate personsøking, men for en berøringsenhet, med å ha "Tilbake" og "Neste" på hver side som sideknappene på en Kindle, vil sannsynligvis være bedre for bruk (men mindre intuitivt). Jeg føler virkelig at jeg fikk "noe for nesten ingenting" med applikasjonsmalen, som er sjelden; Jeg føler typisk at å starte fra bunnen av er den beste måten å lage applikasjoner fordi malene aldri virker nyttige. Figur B

Elementvisning (Klikk på bildet for å forstørre.)

Det største problemet med denne applikasjonen i sin nåværende tilstand er ytelse. Det er en absolutt hund, og grunnen er klar: Kildedataene var mange, mange megabyte XML som er blitt omgjort til en datastruktur i minnet for å bli navigert, og til tider kastet på en side på en gang.

Løsningen er åpenbar: Den trenger å kunne laste inn bare en håndfull varer om gangen, muligens til og med noen hundre eller så. Vi ser dette på mobile enheter hele tiden for å spare båndbredde på bekostning av tid. Å gjøre en forhåndshenting eller en hente på forespørsel av de neste 100 varene kan være fornuftig, men på overflaten er det en ganske komplisert teknikk. Det er mulig at jeg savnet båten på et nyttig alternativ av kontrollene som muliggjør dette; Jeg vil gjøre mer graving og forhåpentligvis komme med et godt alternativ for dette. Alternativt, kanskje jeg bare trenger å gjøre noe veldig enkelt, som å koble til "avkastningen" -atferden til samlingsklassene for dataene, og bare laste inn elementer hvis de ikke er lastet inn, og deretter laste dem i batch fra en hurtigbufret kopi filen. Jeg mistenker at det å fjerne URL-banen helt fra dataobjektene og redigere UI-malene for ikke å prøve å vise bilder, vil være til stor hjelp (tenk på alle disse forekomstene av de tomme, standardbildene som lastes!). Det vil ta litt tid for meg å finne ut hvordan jeg skal ta tak i dette ytelsesspørsmålet.

Mitt neste mål for dette prosjektet er å implementere søk og bruke kontraktene for å eksponere applikasjonen som søkeleverandør for Windows 8. Etter det vil jeg jobbe med å finpusse UI mer, siden den ikke tilfredsstiller applikasjonens behov akkurat nå. .

J.Ja

Hold dine tekniske ferdigheter oppdatert ved å registrere deg på TechRepublics gratis nyhetsbrev om Software Engineer, levert hver tirsdag.

© Copyright 2021 | pepebotifarra.com