Il presente articolo è stato tradotto automaticamente.

Windows Phone 8.1

Aggiunta di dati applicazione al controllo mappa di Windows Phone 8.1

Keith Pijanowski

Scaricare il codice di esempio

Nel mio articolo di novembre alle funzionalità di mapping di Windows Phone 8.1, ho introdotto il controllo di Windows Phone 8.1 mappa e le API dei servizi di Mapping. Ho illustrato come utilizzare il controllo mappa per aggiungere funzionalità di mapping per un'applicazione telefonica, ad esempio, aggiunta di immagini per contrassegnare una posizione specificata, calcolare le coordinate geografico di un indirizzo specificato (geocoding), determinare l'indirizzo di un geo coordinata specificata (geocoding inverso) e fornendo Guida e scorrere le direzioni.

In questo articolo verrà illustrato come ottenere i dati dell'applicazione nel controllo mappa aggiungendo controlli al controllo mappa utilizzando XAML e associazione dati di applicazione a tali controlli. Se l'applicazione verrà utilizzato, anche i dati sottostanti viene utilizzati dal controllo mappa possono essere inoltre scaricati per l'utilizzo offline. In questo modo il controllo mappa accogliere la funzionalità non in linea dell'applicazione. Si illustrerà inoltre come utilizzare il controllo mappa non in linea e mantenere aggiornati i dati non in linea.

Aggiunta di controlli per il controllo mappa utilizzando XAML

Nel mio articolo precedente, ho utilizzato il codice per aggiungere un controllo di ellisse a una mappa per cerchiare una posizione specifica sulla mappa. Che è un buon approccio se è necessario il controllo completo. Tuttavia, se si desidera essere creativi e annotare una mappa con molti tipi diversi di controlli, utilizzando il codice può essere inefficace. Aggiunta di controlli per la mappa utilizzando XAML risulta più efficiente. Inoltre, l'approccio XAML è molto più semplice quando è necessario eseguire il mapping di un insieme di posizioni all'interno di una mappa utilizzando l'associazione dati.

Innanzitutto verrà illustrato come aggiungere controlli mediante XAML e come associare i dati dell'applicazione a questi controlli. Quindi indagherò ulteriormente sui dati di associazione e Mostra come associare ai dati un insieme di posizioni per il controllo della mappa.

Aggiunta di controlli di XAML di base in due modi per aggiungere controlli al controllo mappa per aggiungere i dati dell'applicazione a una mappa: È possibile aggiungere i controlli come elementi figlio del controllo mappa oppure è possibile utilizzare il MapItemsControl per contenere i controlli.

Figura 1 viene illustrato come aggiungere controlli come elementi figlio del controllo mappa. Essendo elementi figlio la proprietà di contenuto predefinito del controllo mappa, non è necessario specificare in modo esplicito nel markup XAML. Figura 2 viene illustrato un approccio alternativo per l'aggiunta di controlli per il controllo mappa, che utilizza il MapItemControl per contenere i controlli aggiunti.

Figura 1 l'aggiunta di controlli come elementi figlio del controllo mappa

<Maps:MapControl
  x:Name="myMapControl" Grid.Row="1"
  MapServiceToken="{StaticResource MapServiceTokenString}" >
  <!-- Progress bar which is used while the page is loading. -->
  <ProgressBar Name="pbProgressBar" IsIndeterminate="True" Height="560"
    Width="350" />
  <TextBlock Name="tbMessage" Text="{Binding Message}"
    Maps:MapControl.Location="{Binding Location}"  
    Maps:MapControl.NormalizedAnchorPoint="1.0,1.0"
    FontSize="15" Foreground="Black" FontWeight="SemiBold"
    Padding="4,4,4,4"
    Visibility="Collapsed"
    />
  <Image Name="imgMyLocation" Source="Assets/PinkPushPin.png"
    Maps:MapControl.Location="{Binding Location}"
    Maps:MapControl.NormalizedAnchorPoint="0.25, 0.9"
    Height="30" Width="30"
    Visibility="Collapsed" />
</Maps:MapControl>

Figura 2 contenente controlli all'interno di un MapItemControl

<Maps:MapControl
  x:Name="myMapControl"
  MapServiceToken="{StaticResource MapServiceTokenString}">
  <Maps:MapItemsControl>
    <TextBlock Name="tbAddress" Text="{Binding Message}"
      Maps:MapControl.Location="{Binding Location}"
      Maps:MapControl.NormalizedAnchorPoint="1.0,1.0"
      Visibility="Collapsed" />
    <Image Name="imgMyLocation" Source="Assets/PinkPushPin.png"
      Maps:MapControl.Location="{Binding Location}"
      Maps:MapControl.NormalizedAnchorPoint="0.25, 0.9"
      Height="30" Width="30"
      Visibility="Collapsed"/>
  </Maps:MapItemsControl>
</Maps:MapControl>

Se si utilizza la tecnica MapItemControl illustrata in Figura 2, tenere presente, non sarà possibile accedere ai controlli nel codice il sottostante. IntelliSense riconosce i nomi di controllo come variabili valide, ma in fase di esecuzione queste variabili sarà sempre null e se si fa riferimento a essi, si otterrà un'eccezione NullReferenceException. Il MapItemControl in genere viene utilizzato per contenere i modelli di dati che vengono utilizzati per l'associazione di un insieme di oggetti per il controllo della mappa. (Questo punto verrà descritto più avanti in questo articolo.)  Pertanto, se non è associato a un insieme di oggetti, è consigliabile aggiungere i controlli come elementi figlio del controllo mappa, come illustrato nella Figura 1.

Associazione dati il codice in Figura 1 utilizza l'associazione dati per impostare la proprietà Location del controllo immagine e il blocco di testo. La proprietà Text di TextBlock utilizza anche l'associazione dati. Per rivedere velocemente, la proprietà Location è una proprietà associata di tipo Geopoint. Consente di specificare dove nella mappa del controllo verrà inserito. La proprietà NormalizedAnchorPoint associata consente la posizione del controllo necessario perfezionare. Ad esempio, si può utilizzare la proprietà NormalizedAnchorPoint per un controllo su una posizione del centro o inserire un controllo in alto a sinistra di una posizione. Entrambe queste proprietà sono state discusse in dettaglio nel mio primo articolo (msdn.microsoft.com/magazine/dn818495).

Associazione dati consente ai controlli XAML ottenere i valori da oggetti sottostanti. Un oggetto creato dalla classe seguente verrà utilizzato per contenere i valori necessari per i controlli XAML illustrati nella Figura 1:

public class LocationEntity
{
  public Geopoint Location { get; set; }
  public string Message { get; set; }
}

Figura 3 viene illustrato l'evento OnNavigatedTo complete per una pagina che contiene i controlli in Figura 1. (Se una pagina o una visualizzazione all'interno di un'applicazione richiede una notevole quantità di installazione, provare a inserire questo codice per la creazione di un modello di visualizzazione e in esecuzione asincrona.) Questo codice imposta la posizione corrente del dispositivo in un'istanza della classe LocationEntity con un breve messaggio. Si noti che l'oggetto LocationEntity è impostato nella proprietà DataContext di controllo mappa.

Figura 3 l'evento OnNavigatedTo creazione di oggetti necessari per l'associazione dati

protected async override void OnNavigatedTo(NavigationEventArgs e)
{
  // Call the navigation helper base function.
  this.navigationHelper.OnNavigatedTo(e);
  // Get the user's current location so that it can be
  // used as the center point of the map control.
  Geolocator geolocator = new Geolocator();
  // Set the desired accuracy.
  geolocator.DesiredAccuracyInMeters = 200;
  // The maximum acceptable age of cached location data.
  TimeSpan maxAge = new TimeSpan(0, 2, 0);
  // Timeout used for the call to GetGeopositionAsync.
  TimeSpan timeout = new TimeSpan(0, 0, 5);
  Geoposition geoposition = null;
  try
  {
    geoposition = await geolocator.GetGeopositionAsync(maxAge, timeout);
  }
  catch (Exception)
  {
    // Add exception logic.
  }
  // Set up the LocationEntity object.
  LocationEntity locationEntity = new LocationEntity();
  locationEntity.Location = geoposition.Coordinate.Point;
  locationEntity.Message = "You are here";
  // Specify the location that will be at the center of the map.
  myMapControl.Center = locationEntity.Location;
  // Set the map controls data context so data binding will work.
  myMapControl.DataContext = locationEntity;
  // Zoom level.
  myMapControl.ZoomLevel = 15;
  // The map control has done most of its work. Make the controls visible.
  imgMyLocation.Visibility = Windows.UI.Xaml.Visibility.Visible;
  tbMessage.Visibility = Windows.UI.Xaml.Visibility.Visible;
  // Collapse the progress bar.
  pbProgressBar.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
}

Alcuni suggerimenti

Il codice visualizzato nel Figura 3, l'evento OnNavigatedTo esegue operazioni che richiedono molto tempo. In particolare, questo evento viene chiamata la funzione GetGeopositionAsync di un oggetto Geolocator. Questa funzione Ottiene la posizione corrente del dispositivo, che è necessaria prima che il controllo immagine e il controllo TextBlock può essere posizionati correttamente sulla mappa. In tali situazioni, i controlli aggiunti alla mappa come elementi figlio tramite XAML vengono visualizzati inizialmente nell'angolo superiore sinistro della mappa fino a quando non possono essere posizionati sulla mappa. Questo crea una scarsa UX. Per risolvere il problema, impostare semplicemente le eventuali controlli aggiunti come Collapsed in XAML. I controlli aggiunti possono essere resi visibili una volta che vengono calcolati i percorsi di controllo e l'oggetto in cui sono associati i controlli è impostato. (Fare riferimento a Figura 1 e le ultime righe di codice in nella figura 3.)

È possibile utilizzare la proprietà DesiredAccuracyInMeters dell'oggetto Geolocator. Impostazione di questa proprietà o inferiore a 100 metri, otterrà i dati più accurati disponibili. Se il dispositivo dispone di funzionalità GPS, il GPS quindi verrà utilizzato per determinare la posizione corrente del dispositivo. Se questo valore è maggiore di 100 metri, l'oggetto Geolocator verrà Ottimizza per il risparmio di energia e utilizzare dati GPS non, ad esempio segnali Wi-Fi. La soglia di 100 metri Impossibile modifica evolversi di dispositivi, quindi impostare questa proprietà in base alle esigenze dell'applicazione e non la soglia sottostante, che genera un comportamento differente. Infine, la proprietà DesiredAccuracyInMeters esegue l'override di qualsiasi elemento impostato nella proprietà DesiredAccuracy del Geolocator.

È inoltre opportuno utilizzare l'overload del GetGeopositionAsync, che accetta un parametro maximumAge e un parametro di timeout. Il parametro di durata massima è TimeSpan che specifica la durata massima accettabile dei dati memorizzati nella cache del percorso. Il parametro timeout è anche un TimeSpan e causerà la funzione GetGeopositionAsync generare un'eccezione se la determinazione della posizione corrente richiede più tempo rispetto a quella specificata.

I suggerimenti precedenti due sostanzialmente dovrebbero migliorare le prestazioni. Tuttavia, nelle aree con scarsa connettività Internet e su dispositivi con poca memoria e CPU più lente, il controllo mappa e le API dei servizi di Mapping potrebbe comunque essere necessario tempo, conseguente ritardo di utente. In tal caso, il controllo mappa visualizzerà una mappa di tutto il mondo a livello di zoom corrente finché non viene impostato un percorso nella proprietà del punto centrale del controllo mappa. Questo è anche una scarsa esperienza utente perché l'utente è opportuno prevedere alcune indicazione visiva che lavoro è in corso. Nel codice XAML in Figura 1, una barra di avanzamento viene aggiunto come elemento figlio del controllo mappa e viene reso visibile. L'indicatore di stato è impostato come indeterminato perché non si conosce l'esatta quantità di tempo necessaria. Una volta che la proprietà del centro della mappa è calcolata e impostata nel controllo mappa, l'indicatore di stato può essere compressa. Procedure consigliate per l'utilizzo di indicatori di stato indeterminato indicano dovrebbe essere sempre posizionati nella parte superiore della pagina e la maggior parte degli scenari, accetto. Tuttavia, quando si utilizza il controllo mappa, preferisco visualizzare la barra di avanzamento visualizzata a destra attraverso il centro della mappa. Il controllo mappa tende a catturare lo stato attivo dell'utente e per questo motivo un corso può essere trascurato barra nella parte superiore della pagina. Inoltre, una barra di avanzamento visualizzata attraverso il controllo mappa informa l'utente che è il controllo della mappa del lavoro.

Un insieme di associazioni dati

Un insieme di associazioni per il controllo della mappa è simile a un insieme di associazioni per un controllo ListBox, ListView, GridView o qualsiasi altro controllo che visualizza insiemi. Per illustrare questo concetto con il controllo mappa, si consideri la seguente classe:

public class Team
{
  public string TeamName { get; set; }
  public Uri ImageSource { get; set; }
  public string Division { get; set; }
  public string StadiumName { get; set; }
  public Geopoint StadiumLocation { get; set; }
  public Point NAP { get; set; }
}

Un'istanza di questa classe consente di tenere le informazioni di base su una squadra sportiva professionale. Si noti che una delle proprietà è una proprietà di Geopoint che contiene la posizione dello stadio utilizzato come campo principale del team.

Il codice XAML in nella figura 4 imposta il controllo mappa che può essere associato un insieme di oggetti di Team ad esso e la posizione di stadio campo principale di ogni team verrà contrassegnata con un'icona piccola.

Figura 4 impostazione per l'associazione insieme il controllo mappa

<Maps:MapControl
  x:Name="myMapControl" Grid.Row="1"
  MapServiceToken="{StaticResource MapServiceTokenString}" >
  <Maps:MapItemsControl x:Name="MapItems" >
    <Maps:MapItemsControl.ItemTemplate>
      <DataTemplate>
        <Image Source="{Binding ImageSource}"
          Maps:MapControl.Location="{Binding StadiumLocation}"
          Maps:MapControl.NormalizedAnchorPoint="{Binding NAP}"
          Height="15" Width="15"
          />
      </DataTemplate>
    </Maps:MapItemsControl.ItemTemplate>
  </Maps:MapItemsControl>
</Maps:MapControl>

Se si ha familiarità con l'associazione insieme in altri controlli, nothing in nella figura 4 dovrebbe essere poco familiare. Un controllo immagine è contenuto all'interno di una classe DataTemplate. Il controllo immagine collegato percorso di proprietà viene associata alla proprietà StadiumLocation dell'oggetto Team. Il controllo immagine è anche una proprietà associata NormalizedAnchorPoint, che è associata a una proprietà che consente di centrare l'immagine sulla posizione dello stadio.

Si noti che quando si associa il controllo mappa a un insieme, la proprietà NormalizedAnchorPoint non può essere codificato. Esso deve essere associato a un valore dell'oggetto sottostante. Se si tenta di impostare questa proprietà come segue:

Maps:MapControl.NormalizedAnchorPoint="0.5,0.5"

l'editor XAML non simile a questa sintassi e il valore non sarà non avrà mai impostato. Microsoft è a conoscenza di questo problema.

Figura 5 viene illustrato il controllo mappa visualizzando le posizioni di stadio Campionato. (Questa schermata è il codice di esempio che accompagna questo articolo. Nell'esempio di codice contiene tutto il codice di ausiliario non visualizzato qui per ragioni di brevità, ad esempio un'istanza dell'insieme e formattare correttamente il controllo può essere inserito in una pagina.)

stadi della squadra di calcio nazionale
Figura 5 stadi della squadra di calcio nazionale

Ridimensionamento dei controlli

È possibile ridimensionare i controlli in modo che rappresentino una distanza specificata. Ad esempio, è possibile visualizzare una scala sulla carta. Una scala consente agli utenti di indicazione visiva, consentendo loro di indovinare le distanze tra gli oggetti sulla mappa. Inoltre, se si utilizza il controllo mappa per rappresentare un geofence, un buon metodo per effettuare questa operazione è aggiungere il controllo mappa un'ellisse, la forma in un cerchio e ridimensionare il raggio del cerchio il cerchio colmino la distanza degli avvisi del geofence.

Controlli in Windows Phone 8.1 vengono ridimensionati specificando la larghezza e altezza in pixel. Pertanto, il ridimensionamento dei controlli per rappresentare una certa distanza implica determinare quanta distanza è rappresentato da un singolo pixel sul controllo mappa. Ecco l'equazione per determinare la distanza rappresentata da un singolo pixel sul controllo mappa:

const double BING_MAP_CONSTANT = 156543.04;
double MetersPerPixel =
  BING_MAP_CONSTANT * Math.Cos(latitude) / Math.Pow(2, zoomLevel);

Latitude utilizzato deve provenire da proprietà del centro del controllo della mappa. Deve essere espresso in radianti, non gradi. Poiché latitude viene in genere espresso in gradi, è possibile convertire da radianti moltiplicando il valore in gradi per pi greco/180 (Math.PI/180). Il livello di zoom proviene dal livello di zoom del controllo mappa ed è un valore da 1 a 20. In Windows Phone 8.1, viene espresso come un valore double.

Derivazione matematica completa dell'equazione illustrata è oltre l'ambito del presente articolo; Tuttavia, alcuni commenti sono in ordine.

A prima vista l'equazione potrebbe sembrare non corretto. Perché è importante il notebook latitude? La scala di una mappa va semplicemente una funzione del livello di zoom? La verità è che è importante latitude e il livello di zoom da solo non è sufficiente determinare la portata di una mappa. Bing Maps, ovvero il back-end per il controllo mappa, utilizza la proiezione di Mercatore. La proiezione di Mercatore è una tecnica per proiettare i dettagli della superficie di una sfera (in questo caso la terra) su una superficie di forma quadrata. Questa proiezione comporta incoerenze in scala quanto più lontano Vai dell'equatore, maggiore è mantenere un quadrato adatta di allungamento. Un semplice esperimento può aiutarvi a comprendere meglio la proiezione di Mercatore. Buccia un'arancione e salvare tutti i pezzi. Quando l'arancione è completamente sbucciato, mettete insieme i pezzi nuovamente su una superficie piana e tenta di ottenere tali esattamente adatta in una forma quadrata. È impossibile. È l'unico modo per ottenere questi pezzi in una forma quadrata per estendere i pezzi non disponibili in "equatore" dell'arancione. Vicino per accedere a "poli", più estensione è necessario eseguire per ottenere un adattamento quadrato. Questa estensione consente di creare una differenza nella scala rispetto alle posizioni vicino all'equatore. La quantità di dilatazione necessari è una funzione della distanza dell'equatore. Di conseguenza, la dipendenza su latitude. Esempio di questa estensione in esecuzione su una proiezione di Mercatore della terra, considerare due città del Quebec, Canada e ad ovest chiave, Florida Un'ingrandimento della completamente visualizzazione (livello di Zoom pari a 20) del Quebec utilizzando il controllo mappa comporterà che rappresenta i piedi 33,5 di 100 pixel. Lo stesso livello di zoom di ovest chiave comporterà che rappresenta i piedi 44,5 di 100 pixel. Le persone residenti in Quebec godere di una scala è 11 piedi meglio i residenti di ovest chiave, ovvero un piccolo può consolare per il clima più freddo. Per ulteriori informazioni sulla proiezione Mercatore, estratto da articolo di MSDN Library, "Understanding scala e la risoluzione," bit.ly/1xIqEwC.

Il fatto notare sull'equazione finale è la costante di mappa di Bing. Costante di mappa di Bing si basa sul raggio della terra e nelle equazioni che Microsoft utilizza per determinare la visualizzazione della mappa per un livello di zoom specificato. Le unità sono metri al pixel.

Figura 6 viene illustrato un controllo TextBlock e un rettangolo aggiunto a un controllo mappa da utilizzare come una scala di distanza. Figura 7 viene illustrato l'evento ZoomLevelChanged e la logica necessaria per creare una scala di distanza. (L'esempio di codice verifica la proprietà RegionInfo.CurrentRegion.IsMetric e Mostra i valori metrici per gli utenti che hanno familiari con il sistema metrico decimale). Infine, Figura 8 Mostra una schermata dall'esempio di codice, ovvero una scala di distanza aggiunta a un controllo mappa.

Figura 6 Xaml TextBlock e il rettangolo utilizzato come scala di distanza

<Maps:MapControl
  x:Name="myMapControl" Grid.Row="1"
  MapServiceToken="{StaticResource MapServiceTokenString}"
  ZoomLevelChanged="myMapControl_ZoomLevelChanged">
  <!-- Distance scale, which is located at the lower left of the Map control. -->
  <TextBlock Name="tbScale" Text="Scale Text" FontSize="15" Foreground="Black"
    Margin="24,530,24,6" Opacity="0.6" />
  <Rectangle Name="recScale" Fill="Purple" Width="100" Height="6"
    Margin="24,548,24,24" Opacity="0.6" />
</Maps:MapControl>

Figura 7 ZoomLevelChanged eventi

private void myMapControl_ZoomLevelChanged(MapControl sender, object args)
{
  // Get the Map control's current zoom level.
  double zoomLevel = sender.ZoomLevel;
  // Use the latitude from the center point of the Map control.
  double latitude = sender.Center.Position.Latitude;
  // The following formula for map resolution needs latitude in radians.
  latitude = latitude * (Math.PI / 180);
  // This constant is based on the diameter of the Earth and the
  // equations Microsoft uses to determine the map shown for the
  // Map control's zoom level.
  const double BING_MAP_CONSTANT = 156543.04;
  // Calculate the number of meters represented by a single pixel.
  double MetersPerPixel =
    BING_MAP_CONSTANT * Math.Cos(latitude) / Math.Pow(2, zoomLevel);
  // Aditional units.
  double KilometersPerPixel = MetersPerPixel / 1000;
  double FeetPerPixel = MetersPerPixel * 3.28;
  double MilesPerPixel = FeetPerPixel / 5280;
  // Determine the distance represented by the rectangle control.
  double scaleDistance = recScale.Width * MilesPerPixel;
  tbScale.Text = scaleDistance.ToString() + " miles";
}

aggiunta a un controllo mappa con tramonto molo di ovest chiave, Florida
Scala di distanza figura 8 aggiunta a un controllo mappa con tramonto molo di ovest chiave, Florida

Download di mappe per l'utilizzo Offline

È possibile scaricare le mappe per l'utilizzo offline. Questa soluzione è utile per le applicazioni che devono fornire le funzionalità di mapping quando il dispositivo è senza alcun tipo di connettività Internet, ad esempio quando un utente è basata su una strada lunga tra le zone urbane o fare escursioni nel bosco di profondità.

Mappe non è possibile scaricare a livello di codice senza il consenso dell'utente quanto prendono una notevole quantità di spazio di archiviazione. L'utente deve aderire a ogni file scaricabile utilizzando un sistema -­condizione UX consente necessarie mappe e scaricato. Questa operazione viene eseguita utilizzando la classe statica MapManager, appartenente allo spazio dei nomi Windows.Services.Maps. Questa classe fornisce funzioni per il download di mappe e aggiornamento dei mapping. La funzione ShowDownloadedMapsUI illustrata di seguito verrà avviare l'applicazione esegue il mapping predefinito e visualizzare la pagina visualizzata nel Figura 9:

MapManager.ShowDownloadedMapsUI();

l'interfaccia utente per il download di mappe
Figura 9 l'interfaccia utente per il download di mappe

L'applicazione di mappe incorporato denominato mappe e la pagina visualizzata nel Figura 9 è possibile accedere anche toccando il pulsante mappe di Download dall'opzione di menu impostazioni. Poiché questa funzione richiede all'utente di un'altra applicazione (l'applicazione esegue il mapping predefinito), egli dovrà restituire all'applicazione originale manualmente.

La pagina visualizzata nel Figura 9 Mostra tutte le mappe che sono state scaricate in precedenza. Contiene inoltre un'opzione di menu che consente di eliminare qualsiasi delle mappe scaricate in precedenza in caso di archiviazione del dispositivo deve essere liberata o una mappa non è più necessario.

Toccare il pulsante Aggiungi (+), viene avviata la procedura guidata Selezione mappa, visualizzazione di una pagina che consente di specificare il continente contenente la mappa che si desidera scaricare. Dopo aver selezionato un continente, verrà visualizzata la pagina di visualizzazione di tutti i paesi del continente selezionato. È possibile selezionare tutti i paesi all'interno di un continente e scaricare le mappe per l'intero continente, ma questo richiederebbe una grande quantità di spazio di archiviazione. Ad esempio, tutte le mappe per l'Italia richiedono 3,4 GB di spazio di archiviazione. L'intero continente dell'America settentrionale e centrale richiederebbe molto altro ancora.

Se si seleziona un paese di grandi dimensioni che contiene più regioni o stati, si vedrà una pagina che consente di scegliere di stati o regioni specifiche. È possibile selezionare più di una regione utilizzando il pulsante Seleziona. Quando viene specificata una regione, verrai indirizzato alla pagina di Download indicata nella Figura 10. Questa stessa pagina verrà visualizzata anche se si seleziona un paese di piccole dimensioni senza regioni o stati.

download di una mappa
Figura 10 download di una mappa

Prima di scaricare le mappe, è opportuno incoraggiare gli utenti a controllare lo spazio disponibile sul dispositivo impostazioni applicazione e selezionando senso di archiviazione. Verranno visualizzate sul dispositivo, la memoria utilizzata da ogni applicazione sul dispositivo, nel caso in cui lo spazio deve essere liberato dello spazio disponibile. Al momento della stesura di questo documento, vi sono APIs WinRT che consentono di determinare a livello di codice la quantità di spazio di archiviazione utilizzato in un dispositivo o la quantità di spazio di archiviazione disponibile.

È inoltre consigliabile scaricare le mappe mentre si è connessi a una rete senza restrizioni, come Wi-Fi. Il codice di esempio per questo articolo viene illustrato come controllare la connessione di rete corrente e avvisa l'utente se sono in una connessione misurata.

Aggiornamento dei mapping scaricato

Le mappe vengono occasionalmente modificate o modificate. Nuove strade possono essere aggiunti a una città, possono modificare i nomi di strade e bordi regionali a volte vengono modificate. Pertanto, mappe scaricate devono essere aggiornate periodicamente. La classe statica MapManager contiene una funzione denominata ShowMapsUpdateUI per l'aggiornamento scaricate mappe:

MapManager.ShowMapsUpdateUI();

La funzione ShowMapsUpdateUI è simile alla funzione ShowDownloadedMapsUI in quanto richiede all'utente per l'applicazione di mappe incorporate. Quando questa funzione viene chiamata, tutte le mappe scaricate vengono controllate per verificare se devono essere aggiornati. Se qualsiasi precedentemente scaricate mappe richiedono un aggiornamento, l'utente sarà comunicato la dimensione dell'aggiornamento e ha la possibilità di annullare o continuare con il download. Questa stessa funzionalità è anche disponibile l'opzione di menu impostazioni dell'applicazione mappe.

Se l'applicazione incoraggia il download di mappe utilizzando ShowDownloadedMapsUI, si consiglia di utilizzare anche ShowMapsUpdateUI in modo che le mappe scaricate possono essere sempre aggiornate.

Conclusioni

In questo articolo ho illustrato come aggiungere i dati dell'applicazione per il controllo mappa per Windows Phone 8.1. Inclusi l'aggiunta di controlli XAML per una mappa, controlla l'associazione ai dati e di disegno in scala. È stato illustrato come portare non in linea i mapping dei dati del controllo sottostante, in modo da impostare il controllo mappa per lavorare senza difficoltà all'interno di applicazioni progettate per l'utilizzo offline.


Keith Pijanowski è un ingegnere, un imprenditore e un business guy. Egli ha più di 20 anni di esperienza nel settore del software, lavorando per avvii e grandi aziende in ruoli hanno oscillavano tra la scrittura di codice per lo sviluppo del business. Contattarlo in keithpij@msn.com o twitter.com/keithpij.

Grazie al seguente esperto tecnico di Microsoft per la revisione di questo articolo: Mike o ' Malley
Mike O'Malley è Senior Program Manager, sistemi operativi Microsoft. Ha lavorato in Mmap-developer correlati esperienze di Microsoft per tre anni e ha presentato in posizione - sviluppo di applicazioni con supporto alla compilazione di ogni anno.