Använd kompassen

Lär dig hur du använder kompassen för att fastställa den aktuella rubriken.

Det här exemplet skapar en enkel app som förlitar sig på en kompass som en indataenhet. En app kan hämta den nuvarande riktningen i förhållande till magnetisk eller geografisk nord. Navigeringsappar använder kompassen för att fastställa vilken riktning en enhet är riktad mot och sedan orientera en karta därefter.

Note

Den här artikeln fokuserar på kod som visar hur du använder en kompass. En översikt över kompasssensorn finns i Sensorer: Kompass.

Förutsättningar

Du bör känna till kompasssensorn och dess användning. Se Sensorer: Kompass.

Enheten eller emulatorn som du använder måste ha stöd för en kompass.

Exempelkod

using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls;
using Windows.Devices.Sensors;

namespace DevicesDemo.Pages
{
    public sealed partial class CompassPage : Page
    {
        private Compass? compass;

        public CompassPage()
        {
            InitializeComponent();

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

            if (compass != null)
            {
                // Establish the report interval for all scenarios.
                uint minReportInterval = compass.MinimumReportInterval;
                uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
                compass.ReportInterval = reportInterval;

                // Assign an event handler for the reading-changed event.
                compass.ReadingChanged += Compass_ReadingChanged;
            }
            else
            {
                statusBar.Message = "No compass was found.";
                statusBar.Severity = InfoBarSeverity.Error;
                statusBar.IsOpen = true;
            }
        }

        // This event handler writes the current compass
        // reading to the text blocks on the XAML page.
        private void Compass_ReadingChanged(Compass sender, CompassReadingChangedEventArgs args)
        {
            DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
            {
                CompassReading reading = args.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.";
            });
        }
    }
}
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid Margin="24">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="44"/>
            <RowDefinition Height="44"/>
        </Grid.RowDefinitions>
        <TextBlock Text="Magnetic Heading:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtMagnetic" Grid.Column="1" Text="---"/>

        <TextBlock Grid.Row="1" Text="True North Heading:" Style="{StaticResource LabelTextBlockStyle}"/>
        <TextBlock x:Name="txtNorth" Grid.Column="1" Grid.Row="1" Text="---"/>
    </Grid>

    <InfoBar x:Name="statusBar" Grid.Row="1"/>
</Grid>

När appen körs kan du ändra kompassvärdena genom att flytta enheten.

I föregående exempel visas den viktiga kod som du behöver skriva för att integrera kompassindata i din app.

Anslut till sensorn

Anropa metoden GetDefault för att upprätta en anslutning till standard kompassen.

private Compass? compass;
// ...
compass = Compass.GetDefault();

Du kan också anropa FromIdAsync för att skapa ett Compass-objekt från ett DeviceInformation.Id värde. Mer information finns i Räkna upp enheter.

Om ingen kompasssensor identifieras uppdateras statusmeddelandet för att informera användaren.

Ange rapportintervallet

Rapportintervallet anges i sidans konstruktor. Den här koden hämtar det minsta intervall som stöds av enheten och jämför det med ett begärt intervall på 16 millisekunder (vilket motsvarar en uppdateringshastighet på 60 Hz). Om det minsta intervall som stöds är större än det begärda intervallet anger koden värdet till minimum. Annars anges värdet till det begärda intervallet.

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

Läs sensordata

De nya kompassdata samlas in i händelsehanteraren ReadingChanged . Varje gång sensordrivrutinen tar emot nya data från sensorn skickar den värdena till din app med den här händelsen. I det här exemplet skrivs dessa nya värden till de textblock som finns i XAML för motsvarande sida.

compass.ReadingChanged += Compass_ReadingChanged;
// ...

private void Compass_ReadingChanged(Compass sender, CompassReadingChangedEventArgs args)
{
    DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
    {
        CompassReading reading = args.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.";
    });
}