Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp wordt beschreven hoe u een batterijrapport krijgt dat gedetailleerde informatie over de batterij bevat (zoals de lading, capaciteit en status van een accu of aggregaties van batterijen), en statuswijzigingen in alle items in het rapport afhandelt.
Codevoorbeelden zijn afkomstig uit de eenvoudige batterij-app die aan het einde van dit onderwerp wordt vermeld.
- Belangrijke API’s:BatteryReport, Windows.Devices.Power, DeviceInformation.FindAllAsync
Aggregaat batterijrapport ophalen
Sommige apparaten hebben meer dan één batterij en het is niet altijd duidelijk hoe elke batterij bijdraagt aan de totale energiecapaciteit van het apparaat. Hier komt de klasse AggregateBattery binnen. De aggregate batterij vertegenwoordigt alle batterijcontrollers die zijn verbonden met het apparaat en kunnen één algemeen BatteryReport object bieden.
Note
Een Battery klasse komt eigenlijk overeen met een batterijcontroller. Afhankelijk van het apparaat, wordt de controller soms aangesloten op de fysieke batterij en soms is het aangesloten op de behuizing van het apparaat. Het is dus mogelijk om een batterijobject te maken, zelfs als er geen batterijen aanwezig zijn. Andere keren kan het batterijobject zijn null.
Zodra u een samengevoegd batterijobject hebt, roept u GetReport aan om de bijbehorende BatteryReport op te halen.
private void RequestAggregateBatteryReport()
{
// Create aggregate battery object.
var aggBattery = Battery.AggregateBattery;
// Get report.
var report = aggBattery.GetReport();
// Update UI.
AddReportUI(BatteryReportPanel, report, aggBattery.DeviceId);
}
Afzonderlijke batterijrapporten ophalen
U kunt ook een BatteryReport-object maken voor afzonderlijke batterijen. Gebruik GetDeviceSelector met de methode FindAllAsync om een verzameling van DeviceInformation objecten te verkrijgen die eventuele accucontrollers vertegenwoordigen die zijn verbonden met het apparaat. Maak vervolgens met behulp van de eigenschap Id van het gewenste DeviceInformation-object een overeenkomende Battery met de methode FromIdAsync. Roep tot slot GetReport aan om het afzonderlijke batterijrapport op te halen.
In dit voorbeeld ziet u hoe u een batterijrapport maakt voor alle batterijen die zijn aangesloten op het apparaat.
private async Task RequestIndividualBatteryReports()
{
// Find batteries.
DeviceInformationCollection deviceInfo =
await DeviceInformation.FindAllAsync(Battery.GetDeviceSelector());
foreach (DeviceInformation device in deviceInfo)
{
try
{
// Create battery object.
Battery battery = await Battery.FromIdAsync(device.Id);
// Get report.
BatteryReport report = battery.GetReport();
// Update UI.
AddReportUI(BatteryReportPanel, report, battery.DeviceId);
}
catch { /* Add error handling, as applicable. */ }
}
}
Rapportdetails bekijken
Het object BatteryReport biedt veel informatie over de batterij. Zie voor meer informatie de API-referentie voor de eigenschappen ervan:
- Status (een BatteryStatus-opsommingswaarde )
- ChargeRateInMilliwatts
- Ontwerpcapaciteit in milliwattuur
- VolledigeLaadcapaciteitInMilliwattuur
- RemainingCapacityInMilliwattHours.
In dit voorbeeld ziet u enkele eigenschappen van het batterijrapport die worden gebruikt door de eenvoudige batterij-app die verderop in dit onderwerp wordt gegeven.
TextBlock txt3 = new TextBlock { Text = "Charge rate (mW): " + report.ChargeRateInMilliwatts.ToString() };
TextBlock txt4 = new TextBlock { Text = "Design energy capacity (mWh): " + report.DesignCapacityInMilliwattHours.ToString() };
TextBlock txt5 = new TextBlock { Text = "Fully-charged energy capacity (mWh): " + report.FullChargeCapacityInMilliwattHours.ToString() };
TextBlock txt6 = new TextBlock { Text = "Remaining energy capacity (mWh): " + report.RemainingCapacityInMilliwattHours.ToString() };
Rapportupdates aanvragen
Het object Battery activeert de gebeurtenis ReportUpdated wanneer de accu wordt opgeladen, capaciteit of status verandert. Dit gebeurt meestal onmiddellijk voor statuswijzigingen en regelmatig voor alle andere wijzigingen. In dit voorbeeld ziet u hoe u zich registreert voor updates van accurapport.
...
Battery.AggregateBattery.ReportUpdated += AggregateBattery_ReportUpdated;
...
Rapportbijwerkingen afhandelen
Wanneer een batterijupdate plaatsvindt, geeft de gebeurtenis ReportUpdated de bijbehorende gebeurtenis Battery door aan de gebeurtenishandlermethode. Deze gebeurtenis-handler wordt echter niet aangeroepen vanuit de UI-thread. U moet het DispatcherQueue-object gebruiken om wijzigingen in de gebruikersinterface aan te roepen, zoals in dit voorbeeld wordt weergegeven.
private async void AggregateBattery_ReportUpdated(Battery sender, object args)
{
if (reportRequested)
{
DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, async () =>
{
await GetBatteryReport();
});
}
}
Voorbeeldcode: eenvoudige batterij-app
In dit voorbeeld ziet u hoe u de batterij-API's gebruikt om batterijgegevens weer te geven in de gebruikersinterface (UI) van de app. Het bevat een minimale XAML-gebruikersinterface, terwijl de gebruikersinterface van het hoofdrapport wordt gemaakt in code-behind.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel x:Name="topPanel" Margin="24">
<RadioButtons>
<RadioButton x:Name="AggregateButton" Content="Aggregate results" IsChecked="True" />
<RadioButton x:Name="IndividualButton" Content="Individual results"/>
</RadioButtons>
<Button Content="Get battery report" Click="GetReportButton_Click" Margin="0,12,0,0"/>
</StackPanel>
<StackPanel x:Name="BatteryReportPanel" Grid.Row="1" Margin="24,0"/>
</Grid>
using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;
using Windows.Devices.Enumeration;
using Windows.Devices.Power;
namespace DevicesDemo.Pages
{
public sealed partial class BatteryInfoPage : Page
{
bool reportRequested = false;
public BatteryInfoPage()
{
InitializeComponent();
Battery.AggregateBattery.ReportUpdated += AggregateBattery_ReportUpdated;
}
private async void AggregateBattery_ReportUpdated(Battery sender, object args)
{
if (reportRequested)
{
DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, async () =>
{
await GetBatteryReport();
});
}
}
private async void GetReportButton_Click(object sender, RoutedEventArgs e)
{
await GetBatteryReport();
}
private async Task GetBatteryReport()
{
// Clear UI.
BatteryReportPanel.Children.Clear();
if (AggregateButton.IsChecked == true)
{
// Request aggregate battery report.
RequestAggregateBatteryReport();
}
else
{
// Request individual battery report.
await RequestIndividualBatteryReports();
}
// Note request.
reportRequested = true;
}
private void RequestAggregateBatteryReport()
{
// Create aggregate battery object.
Battery aggBattery = Battery.AggregateBattery;
// Get report.
BatteryReport report = aggBattery.GetReport();
// Update UI.
AddReportUI(BatteryReportPanel, report, aggBattery.DeviceId);
}
private async Task RequestIndividualBatteryReports()
{
// Find batteries.
DeviceInformationCollection deviceInfo =
await DeviceInformation.FindAllAsync(Battery.GetDeviceSelector());
foreach (DeviceInformation device in deviceInfo)
{
try
{
// Create battery object.
Battery battery = await Battery.FromIdAsync(device.Id);
// Get report.
BatteryReport report = battery.GetReport();
// Update UI.
AddReportUI(BatteryReportPanel, report, battery.DeviceId);
}
catch { /* Add error handling, as applicable. */ }
}
}
private void AddReportUI(StackPanel sp, BatteryReport report, string DeviceID)
{
// Create battery report UI.
TextBlock txt1 = new TextBlock { Text = "Device ID: " + DeviceID };
txt1.FontSize = 15;
txt1.Margin = new Thickness(0, 15, 0, 0);
txt1.TextWrapping = TextWrapping.WrapWholeWords;
TextBlock txt2 = new TextBlock { Text = "Battery status: " + report.Status.ToString() };
txt2.FontStyle = Windows.UI.Text.FontStyle.Italic;
txt2.Margin = new Thickness(0, 0, 0, 15);
TextBlock txt3 = new TextBlock { Text = "Charge rate (mW): " + report.ChargeRateInMilliwatts.ToString() };
TextBlock txt4 = new TextBlock { Text = "Design energy capacity (mWh): " + report.DesignCapacityInMilliwattHours.ToString() };
TextBlock txt5 = new TextBlock { Text = "Fully-charged energy capacity (mWh): " + report.FullChargeCapacityInMilliwattHours.ToString() };
TextBlock txt6 = new TextBlock { Text = "Remaining energy capacity (mWh): " + report.RemainingCapacityInMilliwattHours.ToString() };
// Create energy capacity progress bar & labels.
TextBlock pbLabel = new TextBlock { Text = "Percent remaining energy capacity" };
pbLabel.Margin = new Thickness(0, 10, 0, 5);
pbLabel.FontFamily = new FontFamily("Segoe UI");
pbLabel.FontSize = 11;
ProgressBar pb = new ProgressBar();
pb.Margin = new Thickness(0, 5, 0, 0);
pb.Width = 200;
pb.Height = 10;
pb.IsIndeterminate = false;
pb.HorizontalAlignment = HorizontalAlignment.Left;
TextBlock pbPercent = new TextBlock();
pbPercent.Margin = new Thickness(0, 5, 0, 10);
pbPercent.FontFamily = new FontFamily("Segoe UI");
pbLabel.FontSize = 11;
// Disable progress bar if values are null.
if ((report.FullChargeCapacityInMilliwattHours == null) ||
(report.RemainingCapacityInMilliwattHours == null))
{
pb.IsEnabled = false;
pbPercent.Text = "N/A";
}
else
{
pb.IsEnabled = true;
pb.Maximum = Convert.ToDouble(report.FullChargeCapacityInMilliwattHours);
pb.Value = Convert.ToDouble(report.RemainingCapacityInMilliwattHours);
pbPercent.Text = ((pb.Value / pb.Maximum) * 100).ToString("F2") + "%";
}
// Add controls to stackpanel.
sp.Children.Add(txt1);
sp.Children.Add(txt2);
sp.Children.Add(txt3);
sp.Children.Add(txt4);
sp.Children.Add(txt5);
sp.Children.Add(txt6);
sp.Children.Add(pbLabel);
sp.Children.Add(pb);
sp.Children.Add(pbPercent);
}
}
}
Tip
Als u numerieke waarden wilt ontvangen van het object BatteryReport, moet u fouten opsporen in uw app op de lokale computer of op een extern apparaat. Bij foutopsporing op een apparaatemulator retourneert het Object BatteryReport null naar de capaciteits- en snelheidseigenschappen.
Windows developer