Menggunakan kompas

Pelajari cara menggunakan kompas untuk menentukan judul saat ini.

Contoh ini membuat aplikasi sederhana yang bergantung pada kompas sebagai perangkat input. Aplikasi dapat memperoleh arah hadap saat ini terhadap utara magnetis atau utara sejati. Aplikasi navigasi menggunakan kompas untuk menentukan arah yang dihadapi perangkat lalu mengorientasikan peta yang sesuai.

Note

Artikel ini berfokus pada kode yang menunjukkan cara menggunakan kompas. Untuk gambaran umum sensor kompas, lihat Sensor: Kompas.

Prasyarat

Anda harus terbiasa dengan sensor kompas dan penggunaannya. Lihat Sensor: Kompas.

Perangkat atau emulator yang Anda gunakan harus mendukung kompas.

Contoh kode

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>

Saat aplikasi berjalan, Anda dapat mengubah nilai kompas dengan memindahkan perangkat.

Contoh sebelumnya menunjukkan kode penting yang perlu Anda tulis untuk mengintegrasikan input kompas ke dalam aplikasi Anda.

Menyambungkan ke sensor

Panggil metode GetDefault untuk membuat koneksi dengan kompas default.

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

Anda juga dapat memanggil FromIdAsync untuk membuat objek Compass dari nilai DeviceInformation.Id. Untuk informasi selengkapnya, lihat Menghitung perangkat.

Jika tidak ada sensor kompas yang terdeteksi, pesan status diperbarui untuk memberi tahu pengguna.

Mengatur interval laporan

Interval laporan diatur dalam konstruktor halaman. Kode ini mengambil interval minimum yang didukung oleh perangkat dan membandingkannya dengan interval yang diminta sebesar 16 milidetik (yang perkiraan laju refresh 60 Hz). Jika interval minimum yang didukung lebih besar dari interval yang diminta, kode akan mengatur nilai ke minimum. Jika tidak, nilainya diatur ke interval yang diminta.

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

Baca data sensor

Data kompas baru diambil di penanganan aktivitas ReadingChanged . Setiap kali driver sensor menerima data baru dari sensor, driver tersebut meneruskan nilai ke aplikasi Anda menggunakan peristiwa ini. Untuk contoh ini, nilai baru ini ditulis ke blok teks yang ditemukan di XAML untuk halaman yang sesuai.

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