Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.
- Importerande API:Windows. Devices.Sensors, Compass
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.";
});
}
Relaterade ämnen
Windows developer