Condividi tramite


Usare la bussola

Scopri come usare la bussola per determinare la direzione attuale.

API Importanti

Prerequisiti

Dovresti avere familiarità con Extensible Application Markup Language (XAML), Microsoft Visual C# ed eventi.

Il dispositivo o l'emulatore in uso deve supportare una bussola.

Creare una semplice app bussola

Un'app può recuperare l'orientamento attuale rispetto al nord magnetico o vero. Le app di spostamento usano la bussola per determinare la direzione in cui si trova un dispositivo e quindi orientare la mappa di conseguenza.

Annotazioni

Per un'implementazione più completa, vedere l'esempio di bussola .

Disposizioni

  • Creare un nuovo progetto scegliendo un'app vuota (universale Windows) dai modelli di progetto Visual C# .

  • Aprire il file di MainPage.xaml.cs del progetto e sostituire il codice esistente con il codice seguente.

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Navigation;

    using Windows.UI.Core; // Required to access the core dispatcher object
    using Windows.Devices.Sensors; // Required to access the sensor platform and the compass


    namespace App1
    {
        /// <summary>
        /// An empty page that can be used on its own or navigated to within a Frame.
        /// </summary>
        public sealed partial class MainPage : Page
        {
            private Compass _compass; // Our app' s compass object

            // This event handler writes the current compass reading to
            // the textblocks on the app' s main page.

            private async void ReadingChanged(object sender, CompassReadingChangedEventArgs e)
            {
               await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    CompassReading reading = e.Reading;
                    txtMagnetic.Text = String.Format("{0,5:0.00}", reading.HeadingMagneticNorth);
                    if (reading.HeadingTrueNorth.HasValue)
                        txtNorth.Text = String.Format("{0,5:0.00}", reading.HeadingTrueNorth);
                    else
                        txtNorth.Text = "No reading.";
                });
            }

            public MainPage()
            {
                this.InitializeComponent();
               _compass = Compass.GetDefault(); // Get the default compass object

                // Assign an event handler for the compass reading-changed event
                if (_compass != null)
                {
                    // Establish the report interval for all scenarios
                    uint minReportInterval = _compass.MinimumReportInterval;
                    uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
                    _compass.ReportInterval = reportInterval;
                    _compass.ReadingChanged += new TypedEventHandler<Compass, CompassReadingChangedEventArgs>(ReadingChanged);
                }
            }
        }
    }

Sarai necessario rinominare il namespace nel frammento precedente con il nome che hai dato al tuo progetto. Ad esempio, se hai creato un progetto denominato CompassCS, sostituirai namespace App1 con namespace CompassCS.

  • Aprire il file MainPage.xaml e sostituire il contenuto originale con il codice XML seguente.
    <Page
        x:Class="App1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">

        <Grid x:Name="LayoutRoot" Background="#FF0C0C0C">
            <TextBlock HorizontalAlignment="Left" Height="22" Margin="8,18,0,0" TextWrapping="Wrap" Text="Magnetic Heading:" VerticalAlignment="Top" Width="104" Foreground="#FFFBF9F9"/>
            <TextBlock HorizontalAlignment="Left" Height="18" Margin="8,58,0,0" TextWrapping="Wrap" Text="True North Heading:" VerticalAlignment="Top" Width="104" Foreground="#FFF3F3F3"/>
            <TextBlock x:Name="txtMagnetic" HorizontalAlignment="Left" Height="22" Margin="130,18,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="116" Foreground="#FFFBF6F6"/>
            <TextBlock x:Name="txtNorth" HorizontalAlignment="Left" Height="18" Margin="130,58,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="116" Foreground="#FFF5F1F1"/>

         </Grid>
    </Page>

Dovrai sostituire la prima parte del nome della classe nel frammento di codice precedente con il namespace della tua app. Ad esempio, se hai creato un progetto denominato CompassCS, sostituirai x:Class="App1.MainPage" con x:Class="CompassCS.MainPage". È anche consigliabile sostituire xmlns:local="using:App1" con xmlns:local="using:CompassCS".

  • Premere F5 o selezionare Debug>Avvia debug per compilare, distribuire ed eseguire l'app.

Una volta eseguita l'app, è possibile modificare i valori della bussola spostando il dispositivo o usando gli strumenti dell'emulatore.

  • Arrestare l'app ritornando a Visual Studio e premendo MAIUSC+F5, oppure selezionare Debug>Interrompi debug per arrestare l'app.

Spiegazione

L'esempio precedente illustra quanto poco codice è necessario scrivere per integrare la bussola nella tua app.

L'app instaura una connessione con la bussola predefinita nel metodo MainPage.

_compass = Compass.GetDefault(); // Get the default compass object

L'app definisce l'intervallo del report all'interno del metodo MainPage. Questo codice recupera l'intervallo minimo supportato dal dispositivo e lo confronta con un intervallo richiesto di 16 millisecondi (che approssima una frequenza di aggiornamento a 60 Hz). Se l'intervallo minimo supportato è maggiore dell'intervallo richiesto, il codice imposta il valore sul valore minimo. Altrimenti, imposta il valore al intervallo richiesto.

uint minReportInterval = _compass.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
_compass.ReportInterval = reportInterval;

I nuovi dati della bussola vengono acquisiti nel metodo ReadingChanged. Ogni volta che il driver del sensore riceve nuovi dati dal sensore, passa i valori all'app usando questo gestore eventi. L'app registra questo gestore eventi nella riga seguente.

_compass.ReadingChanged += new TypedEventHandler<Compass,
CompassReadingChangedEventArgs>(ReadingChanged);

Questi nuovi valori vengono scritti nei TextBlock trovati nel codice XAML del progetto.

 <TextBlock HorizontalAlignment="Left" Height="22" Margin="8,18,0,0" TextWrapping="Wrap" Text="Magnetic Heading:" VerticalAlignment="Top" Width="104" Foreground="#FFFBF9F9"/>
 <TextBlock HorizontalAlignment="Left" Height="18" Margin="8,58,0,0" TextWrapping="Wrap" Text="True North Heading:" VerticalAlignment="Top" Width="104" Foreground="#FFF3F3F3"/>
 <TextBlock x:Name="txtMagnetic" HorizontalAlignment="Left" Height="22" Margin="130,18,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="116" Foreground="#FFFBF6F6"/>
 <TextBlock x:Name="txtNorth" HorizontalAlignment="Left" Height="18" Margin="130,58,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="116" Foreground="#FFF5F1F1"/>