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 met gedetailleerde informatie over de batterij (zoals de lading, capaciteit en status van een batterij of aggregaties van accu's), en statuswijzigingen in 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
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 speelt de klasse AggregateBattery een rol. De geaggregeerde batterij vertegenwoordigt alle accucontrollers die zijn verbonden met het apparaat en kunnen één algemeen BatteryReport object leveren.
Note A 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. In andere gevallen kan het batterijobject null-zijn.
Zodra u een geaggregeerd 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 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.
async private void RequestIndividualBatteryReports()
{
// Find batteries
var deviceInfo = await DeviceInformation.FindAllAsync(Battery.GetDeviceSelector());
foreach(DeviceInformation device in deviceInfo)
{
try
{
// Create battery object
var battery = await Battery.FromIdAsync(device.Id);
// Get report
var report = battery.GetReport();
// Update UI
AddReportUI(BatteryReportPanel, report, battery.DeviceId);
}
catch { /* Add error handling, as applicable */ }
}
}
Details van toegangsrapport
Het BatteryReport object biedt veel informatie over de batterij. Zie voor meer informatie de API-verwijzing voor de eigenschappen: Status (een BatteryStatus opsomming), ChargeRateInMilliwatts, DesignCapacityInMilliwattHours, FullChargeCapacityInMilliwattHoursen 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;
...
Rapportupdates verwerken
Wanneer een batterijupdate plaatsvindt, geeft de gebeurtenis ReportUpdated het bijbehorende Battery-object door aan de gebeurtenishandlermethode. Deze gebeurtenis-handler wordt echter niet aangeroepen vanuit de UI-thread. U moet het Dispatcher--object gebruiken om wijzigingen in de gebruikersinterface aan te roepen, zoals in dit voorbeeld wordt weergegeven.
async private void AggregateBattery_ReportUpdated(Battery sender, object args)
{
if (reportRequested)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
// Clear UI
BatteryReportPanel.Children.Clear();
if (AggregateButton.IsChecked == true)
{
// Request aggregate battery report
RequestAggregateBatteryReport();
}
else
{
// Request individual battery report
RequestIndividualBatteryReports();
}
});
}
}
Voorbeeld: eenvoudige batterij-app
Test deze API's door de volgende eenvoudige batterij-app te bouwen in Microsoft Visual Studio. Klik op de startpagina van Visual Studio op Nieuw projecten maak vervolgens onder de sjablonen voor Visual C# > Windows > Universal een nieuwe app met behulp van de sjabloon Lege app.
Open vervolgens het bestand MainPage.xaml en kopieer de volgende XML naar dit bestand (waarbij de oorspronkelijke inhoud wordt vervangen).
Opmerking
Als uw app geen naam heeft App1, moet u het eerste deel van de klassenaam in het volgende codefragment vervangen door de naamruimte van uw app. Als u bijvoorbeeld een project met de naam BasicBatteryApphebt gemaakt, vervangt u x:Class="App1.MainPage" door x:Class="BasicBatteryApp.MainPage" en xmlns:local="using:App1" door xmlns:local="using:BasicBatteryApp".
<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">
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" >
<StackPanel VerticalAlignment="Center" Margin="15,30,0,0" >
<RadioButton x:Name="AggregateButton" Content="Aggregate results" GroupName="Type" IsChecked="True" />
<RadioButton x:Name="IndividualButton" Content="Individual results" GroupName="Type" IsChecked="False" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button x:Name="GetBatteryReportButton"
Content="Get battery report"
Margin="15,15,0,0"
Click="GetBatteryReport"/>
</StackPanel>
<StackPanel x:Name="BatteryReportPanel" Margin="15,15,0,0"/>
</StackPanel>
</Page>
Open vervolgens het MainPage.xaml.cs-bestand van uw project en vervang de bestaande code door het volgende.
Opmerking
Als uw app geen naam heeft App1, moet u de naamruimte in het volgende voorbeeld wijzigen met de naam die u uw project hebt gegeven. Als u bijvoorbeeld een project met de naam BasicBatteryApphebt gemaakt, vervangt u naamruimte App1 door naamruimte BasicBatteryApp.
using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;
using Windows.Devices.Enumeration;
using Windows.Devices.Power;
using Windows.UI.Core;
namespace App1
{
public sealed partial class MainPage : Page
{
bool reportRequested = false;
public MainPage()
{
this.InitializeComponent();
Battery.AggregateBattery.ReportUpdated += AggregateBattery_ReportUpdated;
}
private void GetBatteryReport(object sender, RoutedEventArgs e)
{
// Clear UI
BatteryReportPanel.Children.Clear();
if (AggregateButton.IsChecked == true)
{
// Request aggregate battery report
RequestAggregateBatteryReport();
}
else
{
// Request individual battery report
RequestIndividualBatteryReports();
}
// Note request
reportRequested = true;
}
private void RequestAggregateBatteryReport()
{
// Create aggregate battery object
var aggBattery = Battery.AggregateBattery;
// Get report
var report = aggBattery.GetReport();
// Update UI
AddReportUI(BatteryReportPanel, report, aggBattery.DeviceId);
}
async private void RequestIndividualBatteryReports()
{
// Find batteries
var deviceInfo = await DeviceInformation.FindAllAsync(Battery.GetDeviceSelector());
foreach(DeviceInformation device in deviceInfo)
{
try
{
// Create battery object
var battery = await Battery.FromIdAsync(device.Id);
// Get report
var 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);
}
async private void AggregateBattery_ReportUpdated(Battery sender, object args)
{
if (reportRequested)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
// Clear UI
BatteryReportPanel.Children.Clear();
if (AggregateButton.IsChecked == true)
{
// Request aggregate battery report
RequestAggregateBatteryReport();
}
else
{
// Request individual battery report
RequestIndividualBatteryReports();
}
});
}
}
}
}
Aanbeveling
Als u numerieke waarden wilt ontvangen uit het BatteryReport-object, debuggen dan uw app op de lokale machine of op een extern apparaat. Bij foutopsporing op een apparaatemulator retourneert het BatteryReport-object null- aan de capaciteits- en snelheidseigenschappen.