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.
I det här avsnittet beskrivs hur du hämtar en batterirapport som innehåller detaljerad batteriinformation (till exempel laddning, kapacitet och status för ett batteri eller en mängd batterier) och hanterar tillståndsändringar för alla objekt i rapporten.
Kodexempel kommer från den grundläggande batteriappen som visas i slutet av det här avsnittet.
viktiga API:er
Hämta aggregerad batterirapport
Vissa enheter har mer än ett batteri och det är inte alltid uppenbart hur varje batteri bidrar till enhetens totala energikapacitet. Här kommer klassen AggregateBattery in i bilden. Det aggregerade batteriet representerar alla batteristyrenheter som är anslutna till enheten och kan ge ett enda övergripande BatteryReport-objekt.
Notera A Batteri-klass motsvarar faktiskt en batteristyrenhet. Beroende på enheten är styrenheten ibland ansluten till det fysiska batteriet och ibland är den ansluten till enhetens hölje. Därför är det möjligt att skapa ett batteriobjekt även när det inte finns några batterier. Andra gånger kan batteriobjektet vara null.
När du har ett sammanställt batteriobjekt, anropar du GetReport för att hämta den motsvarande BatteryReport.
private void RequestAggregateBatteryReport()
{
// Create aggregate battery object
var aggBattery = Battery.AggregateBattery;
// Get report
var report = aggBattery.GetReport();
// Update UI
AddReportUI(BatteryReportPanel, report, aggBattery.DeviceId);
}
Hämta enskilda batterirapporter
Du kan också skapa ett BatteryReport- objekt för enskilda batterier. Använd GetDeviceSelector med metoden FindAllAsync för att hämta en samling DeviceInformation objekt som representerar alla batteristyrenheter som är anslutna till enheten. Använd sedan egenskapen ID för det önskade objektet DeviceInformation och skapa en motsvarande Battery med metoden FromIdAsync. Anropa slutligen GetReport för att hämta den enskilda batterirapporten.
Det här exemplet visar hur du skapar en batterirapport för alla batterier som är anslutna till enheten.
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 */ }
}
}
Åtkomst till rapportinformation
Objektet BatteryReport innehåller mycket batteriinformation. Övrig information finns i API-referensen om dess egenskaper: Status (en BatteryStatus uppräkningstyp), ChargeRateInMilliwatts, DesignCapacityInMilliwattHours, FullChargeCapacityInMilliwattHoursoch RemainingCapacityInMilliwattHours. Det här exemplet visar några av de batterirapportegenskaper som används av den grundläggande batteriappen, som tillhandahålls senare i det här avsnittet.
...
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() };
...
...
Begära rapportuppdateringar
Objektet Battery utlöser händelsen ReportUpdated när batteriets laddning, kapacitet eller status ändras. Detta sker vanligtvis omedelbart för statusändringar och med jämna mellanrum för alla andra ändringar. Det här exemplet visar hur du registrerar dig för uppdateringar av batterirapporter.
...
Battery.AggregateBattery.ReportUpdated += AggregateBattery_ReportUpdated;
...
Hantera rapportuppdateringar
När en batteriuppdatering inträffar skickar händelsen ReportUpdated motsvarande Battery-objekt till händelsehanterarmetoden. Den här händelsehanteraren anropas dock inte från användargränssnittstråden. Du måste använda objektet Dispatcher för att anropa ändringar i användargränssnittet, som du ser i det här exemplet.
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();
}
});
}
}
Exempel: grundläggande batteriapp
Testa dessa API:er genom att skapa följande grundläggande batteriapp i Microsoft Visual Studio. På Visual Studio-startsidan klickar du på Nytt projektoch under mallarna Visual C# > Windows > Universal skapar du sedan en ny app med mallen Tom app.
Öppna sedan filen MainPage.xaml och kopiera följande XML till den här filen (ersätta dess ursprungliga innehåll).
Anmärkning
Om din app inte heter App1måste du ersätta den första delen av klassnamnet i följande kodavsnitt med appens namnområde. Om du till exempel har skapat ett projekt med namnet BasicBatteryAppersätter du x:Class="App1.MainPage" med x:Class="BasicBatteryApp.MainPage" och xmlns:local="using:App1" med 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>
Öppna sedan projektets MainPage.xaml.cs-fil och ersätt den befintliga koden med följande.
Anmärkning
Om appen inte heter App1måste du byta namn på namnområdet i följande exempel med det namn som du gav projektet. Om du till exempel har skapat ett projekt med namnet BasicBatteryAppersätter du namnområdet App1 med namnområdet 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();
}
});
}
}
}
}
Tips/Råd
Om du vill ta emot numeriska värden från objektet BatteryReport kan du felsöka appen på lokal dator eller en extern Device. När du felsöker en enhetsemulator returnerar objektet BatteryReportnull- till kapacitets- och hastighetsegenskaperna.