Verwenden des Kompasses

Erfahren Sie, wie Sie den Kompass verwenden, um die aktuelle Richtung zu bestimmen.

In diesem Beispiel wird eine einfache App erstellt, die auf einem Kompass als Eingabegerät basiert. Eine App kann die aktuelle Ausrichtung in Bezug auf den magnetischen oder geografischen Norden abrufen. Navigations-Apps verwenden den Kompass, um zu bestimmen, in welche Richtung ein Gerät zeigt, und richten die Karte dann entsprechend aus.

Note

Dieser Artikel konzentriert sich auf Code, der die Verwendung eines Kompasss veranschaulicht. Eine Übersicht über den Kompasssensor finden Sie unter Sensors: Compass.

Voraussetzungen

Sie sollten mit dem Kompasssensor und dessen Verwendung vertraut sein. Siehe Sensoren: Kompass.

Das verwendete Gerät oder der Emulator muss einen Kompass unterstützen.

Beispielcode

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>

Wenn die App ausgeführt wird, können Sie die Kompasswerte ändern, indem Sie das Gerät verschieben.

Im vorherigen Beispiel wird der wesentliche Code veranschaulicht, den Sie schreiben müssen, um Kompasseingaben in Ihre App zu integrieren.

Verbindung mit dem Sensor herstellen

Rufen Sie die GetDefault-Methode auf, um eine Verbindung mit dem Standardkompass herzustellen.

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

Sie können auch FromIdAsync aufrufen, um einen Compass-Objekt aus einem DeviceInformation.Idwert zu erstellen. Weitere Informationen finden Sie unter "Aufzählen von Geräten".

Wenn kein Kompasssensor erkannt wird, wird die Statusmeldung aktualisiert, um den Benutzer zu informieren.

Festlegen des Berichtsintervalls

Das Berichtsintervall wird im Konstruktor der Seite festgelegt. Dieser Code ruft das vom Gerät unterstützte Mindestintervall ab und vergleicht es mit einem angeforderten Intervall von 16 Millisekunden (was einer Aktualisierungsrate von 60 Hz entspricht). Wenn das unterstützte Mindestintervall größer als das angeforderte Intervall ist, legt der Code den Wert auf das Minimum fest. Andernfalls wird der Wert auf das angeforderte Intervall festgelegt.

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

Lesen von Sensordaten

Die neuen Kompassdaten werden im ReadingChanged-Ereignishandler erfasst. Jedes Mal, wenn der Sensortreiber neue Daten vom Sensor empfängt, übergibt er die Werte mithilfe dieses Ereignisses an Ihre App. In diesem Beispiel werden diese neuen Werte in die Textblöcke geschrieben, die im XAML-Code für die entsprechende Seite enthalten sind.

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.";
    });
}