Verwenden des Kompasses
Erfahren Sie, wie Sie den Kompass verwenden, um die aktuelle Richtung zu bestimmen.
Wichtige APIs
Voraussetzungen
Sie sollten mit Extensible Application Markup Language (XAML), Microsoft Visual C# und Ereignissen vertraut sein.
Das verwendete Gerät oder der Emulator muss einen Kompass unterstützen.
Erstellen einer einfachen Kompass-App
Eine App kann die aktuelle Richtung im Hinblick auf magnetische oder true, nord abrufen. Navigations-Apps verwenden den Kompass, um die Richtung zu bestimmen, in der sich ein Gerät befindet, und richten Sie dann die Karte entsprechend aus.
Hinweis
Eine umfassendere Implementierung finden Sie im Kompassbeispiel.
Anweisungen
Erstellen Sie ein neues Projekt, und wählen Sie eine leere App (Universelle Windows-App) aus den Visual C# -Projektvorlagen aus.
Öffnen Sie die MainPage.xaml.cs Datei Ihres Projekts, und ersetzen Sie den vorhandenen Code durch Folgendes.
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);
}
}
}
}
Sie müssen den Namespace im vorherigen Codeausschnitt mit dem Namen umbenennen, den Sie ihrem Projekt gegeben haben. Wenn Sie z. B. ein Projekt mit dem Namen CompassCS erstellt haben, ersetzen Sie es durch namespace App1
namespace CompassCS
.
- Öffnen Sie die Datei "MainPage.xaml", und ersetzen Sie den ursprünglichen Inhalt durch den folgenden XML-Code.
<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>
Sie müssen den ersten Teil des Klassennamens im vorherigen Codeausschnitt durch den Namespace Ihrer App ersetzen. Wenn Sie z. B. ein Projekt mit dem Namen CompassCS erstellt haben, ersetzen Sie es durch x:Class="App1.MainPage"
x:Class="CompassCS.MainPage"
. Sie sollten auch durch xmlns:local="using:App1"
xmlns:local="using:CompassCS"
.
- Drücken Sie F5, oder wählen Sie "Debuggen>starten" aus, um die App zu erstellen, bereitzustellen und auszuführen.
Sobald die App ausgeführt wird, können Sie die Kompasswerte ändern, indem Sie das Gerät verschieben oder die Emulatortools verwenden.
- Beenden Sie die App, indem Sie zu Visual Studio zurückkehren und UMSCHALT+F5 drücken, oder wählen Sie "Debuggen>beenden" aus, um die App zu beenden.
Erklärung
Im vorherigen Beispiel wird veranschaulicht, wie wenig Code Sie schreiben müssen, um Kompasseingaben in Ihre App zu integrieren.
Die App stellt eine Verbindung mit dem Standardkompass in der MainPage-Methode her.
_compass = Compass.GetDefault(); // Get the default compass object
Die App richtet das Berichtsintervall innerhalb der MainPage-Methode ein. 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;
Die neuen Kompassdaten werden in der ReadingChanged-Methode erfasst. Jedes Mal, wenn der Sensortreiber neue Daten vom Sensor empfängt, übergibt er die Werte mithilfe dieses Ereignishandlers an Ihre App. Die App registriert diesen Ereignishandler in der folgenden Zeile.
_compass.ReadingChanged += new TypedEventHandler<Compass,
CompassReadingChangedEventArgs>(ReadingChanged);
Diese neuen Werte werden in die TextBlocks geschrieben, die im XAML-Code des Projekts enthalten sind.
<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"/>