Usare la bussolaUse the compass

API importantiImportant APIs

EsempioSample

Scopri come usare la bussola per determinare la direzione corrente.Learn how to use the compass to determine the current heading.

Un'app può recuperare la direzione corrente rispetto al nord magnetico, o nord effettivo.An app can retrieve the current heading with respect to magnetic, or true, north. Le app di navigazione usano la bussola per determinare la direzione verso cui si muove il dispositivo e orientano la mappa di conseguenza.Navigation apps use the compass to determine the direction a device is facing and then orient the map accordingly.

PrerequisitiPrerequisites

È necessaria una conoscenza di Extensible Application Markup Language (XAML), Microsoft Visual C# e gli eventi.You should be familiar with Extensible Application Markup Language (XAML), Microsoft Visual C#, and events.

Il dispositivo o l'emulatore in uso deve supportare una bussola.The device or emulator that you're using must support a compass.

Creare un'app bussola sempliceCreate a simple compass app

Questa sezione è suddivisa in due sottosezioni.This section is divided into two subsections. La prima sottosezione illustrerà i passaggi necessari per la creazione di un'applicazione bussola semplice da zero.The first subsection will take you through the steps necessary to create a simple compass application from scratch. La sottosezione seguente illustra l'app appena creata.The following subsection explains the app you have just created.

IstruzioniInstructions

  • Crea un nuovo progetto scegliendo App vuota (Windows universale) nei modelli di progetto per Visual C#.Create a new project, choosing a Blank App (Universal Windows) from the Visual C# project templates.

  • Apri il file MainPage.xaml.cs del progetto e sostituisci il codice esistente con il codice seguente.Open your project's MainPage.xaml.cs file and replace the existing code with the following.

    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);
                }
            }
        }
    }
    ```

You'll need to rename the namespace in the previous snippet with the name you gave your project. For example, if you created a project named **CompassCS**, you'd replace `namespace App1` with `namespace CompassCS`.

-   Open the file MainPage.xaml and replace the original contents with the following XML.

```xml
        <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>

Devi sostituire la prima parte del nome della classe nel frammento di codice precedente con lo spazio dei nomi della tua app.You'll need to replace the first part of the class name in the previous snippet with the namespace of your app. Ad esempio, se hai creato un progetto denominato CompassCS, devi sostituire x:Class="App1.MainPage" con x:Class="CompassCS.MainPage".For example, if you created a project named CompassCS, you'd replace x:Class="App1.MainPage" with x:Class="CompassCS.MainPage". Devi anche sostituire xmlns:local="using:App1" con xmlns:local="using:CompassCS".You should also replace xmlns:local="using:App1" with xmlns:local="using:CompassCS".

  • Premere F5 o selezionare debug > Avvia debug per compilare, distribuire ed eseguire l'app.Press F5 or select Debug > Start Debugging to build, deploy, and run the app.

Quando l'app è in esecuzione puoi cambiare i valori della bussola spostando il dispositivo o tramite gli strumenti di emulazione.Once the app is running, you can change the compass values by moving the device or using the emulator tools.

  • Arrestare l'app tornando a Visual Studio e premere MAIUSC + F5 oppure selezionare debug > Interrompi debug per arrestare l'app.Stop the app by returning to Visual Studio and pressing Shift+F5 or select Debug > Stop Debugging to stop the app.

SpiegazioneExplanation

L'esempio riportato sopra dimostra quanto poco codice è necessario scrivere per integrare l'input della bussola nella tua app.The previous example demonstrates how little code you'll need to write in order to integrate compass input in your app.

L'app stabilisce una connessione con la bussola predefinita nel metodo MainPage.The app establishes a connection with the default compass in the MainPage method.

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

L’app stabilisce l’intervallo di report all’interno del metodo MainPage.The app establishes the report interval within the MainPage method. Questo codice recupera l'intervallo minimo supportato dal dispositivo e lo confronta con un intervallo richiesto di 16 millisecondi (che si avvicina a una frequenza di aggiornamento di 60 Hz).This code retrieves the minimum interval supported by the device and compares it to a requested interval of 16 milliseconds (which approximates a 60-Hz refresh rate). Se l'intervallo minimo supportato è maggiore dell'intervallo richiesto, il codice imposta il valore sul minimo.If the minimum supported interval is greater than the requested interval, the code sets the value to the minimum. In caso contrario, lo imposta sull'intervallo richiesto.Otherwise, it sets the value to the requested interval.

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

I nuovi dati della bussola vengono acquisiti nel metodo ReadingChanged.The new compass data is captured in the ReadingChanged method. Ogni volta che il driver del sensore riceve i nuovi dati dal sensore, passa i valori all'app usando questo gestore eventi.Each time the sensor driver receives new data from the sensor, it passes the values to your app using this event handler. L'app registra il gestore eventi nella riga seguente.The app registers this event handler on the following line.

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

I nuovi valori vengono scritti nei TextBlock inclusi nel codice XAML del progetto.These new values are written to the TextBlocks found in the project's XAML.

 <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"/>