Win10/UWP新特性系列—电池报告

时间:2023-01-20 21:26:05

UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间。

通过Windows.Devices.Power命名空间中的电池API,你可以了解到正在运行的设备所有的电池详细信息。

通过创建Battery对象来表示单个电池控制器或聚合的所有电池控制器,然后使用GetReport方法返回BatteryReport对象,该对象可指示响应电池的充电、容量和状态。

需要用到的资源:

  • Battery:提供该设备的电池控制器信息类
  • Battery.AggregateBattery:提供一个Battery的实例
  • ReportUpdated:当电池控制器报告更新时的事件
  • Battery. GetReport():获取电池报告对象BatteryReport
  • BatteryReport:电池报告对象
  • BatteryReport.Status:获取当前电池状态
  • BatteryReport.ChargeRateInMilliwatts:充电速度
  • BatteryReport.DesignCapacityInMilliwattHours:理论容量
  • BatteryReport.FullChargeCapacityInMilliwattHours:冲满后的容量,总容量
  • BatteryReport.RemainingCapacityInMilliwattHours:当前电量

下面写个Demo,来获取电池信息,以及处理电量低的时候的主题切换,(这里用充电中和没充电的状态来切换)

前台:​

 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel VerticalAlignment="Center" Margin="6">
<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="GetBatteryReportButton_Click"
/>
</StackPanel>
<StackPanel x:Name="BatteryReportPanel" Margin="15,15,0,0"/>
</StackPanel>
</Grid>

后台:

 public sealed partial class MainPage : Page
{
bool reportRequested;
public MainPage()
{
this.InitializeComponent();
//订阅电池状态更改事件
Battery.AggregateBattery.ReportUpdated += AggregateBattery_ReportUpdated;
} private async void AggregateBattery_ReportUpdated(Battery sender, object args)
{
if (reportRequested)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
//清空显示区UI元素
BatteryReportPanel.Children.Clear(); if (AggregateButton.IsChecked == true)
{
//多电池报告
RequestAggregateBatteryReport();
}
else
{
//单电池报告
RequestIndividualBatteryReports();
}
});
}
} /// <summary>
/// 获取 单个电池 报告
/// </summary>
private void RequestIndividualBatteryReports()
{
var aggBattery = Battery.AggregateBattery; var report = aggBattery.GetReport(); AddReportUI(BatteryReportPanel, report, aggBattery.DeviceId);
} private void AddReportUI(StackPanel batteryReportPanel, BatteryReport report, string deviceId)
{
// 创建 电池报告 UI
var txt1 = new TextBlock { Text = "设备 ID: " + deviceId };
txt1.FontSize = ;
txt1.Margin = new Thickness(, , , );
txt1.TextWrapping = TextWrapping.WrapWholeWords; var txt2 = new TextBlock { Text = "电池状态: " + report.Status.ToString() };
ChangRequestedTheme(report.Status);
txt2.FontStyle = Windows.UI.Text.FontStyle.Italic;
txt2.Margin = new Thickness(, , , ); var txt3 = new TextBlock { Text = "充电速度 (mW): " + report.ChargeRateInMilliwatts.ToString() };
var txt4 = new TextBlock { Text = "理论产能 (mWh): " + report.DesignCapacityInMilliwattHours.ToString() };
var txt5 = new TextBlock { Text = "总容量 (mWh): " + report.FullChargeCapacityInMilliwattHours.ToString() };
var txt6 = new TextBlock { Text = "当前容量 (mWh): " + report.RemainingCapacityInMilliwattHours.ToString() }; // 创建电量比例UI
var pbLabel = new TextBlock { Text = "剩余电量百分比" };
pbLabel.Margin = new Thickness(, , , );
pbLabel.FontFamily = new FontFamily("Segoe UI");
pbLabel.FontSize = ; var pb = new ProgressBar();
pb.Margin = new Thickness(, , , );
pb.Width = ;
pb.Height = ;
pb.IsIndeterminate = false;
pb.HorizontalAlignment = HorizontalAlignment.Left; var pbPercent = new TextBlock();
pbPercent.Margin = new Thickness(, , , );
pbPercent.FontFamily = new FontFamily("Segoe UI");
pbLabel.FontSize = ; // 防止分母为0
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) * ).ToString("F2") + "%";
} // 添加页面元素
BatteryReportPanel.Children.Add(txt1);
BatteryReportPanel.Children.Add(txt2);
BatteryReportPanel.Children.Add(txt3);
BatteryReportPanel.Children.Add(txt4);
BatteryReportPanel.Children.Add(txt5);
BatteryReportPanel.Children.Add(txt6);
BatteryReportPanel.Children.Add(pbLabel);
BatteryReportPanel.Children.Add(pb);
BatteryReportPanel.Children.Add(pbPercent);
} /// <summary>
/// 根据电池使用状态改变Theme色
/// </summary>
/// <param name="status"></param>
private void ChangRequestedTheme(BatteryStatus status)
{
switch (status)
{
case BatteryStatus.NotPresent:
Debug.WriteLine(BatteryStatus.NotPresent.ToString());
break;
case BatteryStatus.Discharging:
//电池处于放电状态
Debug.WriteLine(BatteryStatus.Discharging.ToString());
//当电量百分比很低是可以采用 黑色主题
this.RequestedTheme = ElementTheme.Dark;
break;
case BatteryStatus.Idle:
Debug.WriteLine(BatteryStatus.Idle.ToString());
break;
case BatteryStatus.Charging:
//电池处于充电状态
Debug.WriteLine(BatteryStatus.Charging.ToString());
//正常模式
this.RequestedTheme = ElementTheme.Default;
break;
default:
break;
}
} /// <summary>
/// 获取 电池集 报告
/// </summary>
private async void RequestAggregateBatteryReport()
{
// 获取所有电池对象
var deviceInfo = await DeviceInformation.FindAllAsync(Battery.GetDeviceSelector());
foreach (DeviceInformation device in deviceInfo)
{
try
{
// 获取单个电池对象
var battery = await Battery.FromIdAsync(device.Id); // 获取电池报告
var report = battery.GetReport(); // 更新UI
AddReportUI(BatteryReportPanel, report, battery.DeviceId);
}
catch { /* Add error handling, as applicable */ }
}
} private void GetBatteryReportButton_Click(object sender, RoutedEventArgs e)
{
// 清除 UI
BatteryReportPanel.Children.Clear(); if (AggregateButton.IsChecked == true)
{
// 获取多电池报告
RequestAggregateBatteryReport();
}
else
{
// 获取单电池报告
RequestIndividualBatteryReports();
} reportRequested = true;
}
}

运行后我们可以看到,当电池状态处于放电时,界面会换成黑色主题来节约电池电量,当插上充电器时会换成默认的主题(我的默认是白色),实际开发中可根据电量百分比来决定是否切换节电主题来延长电池使用时间。

Win10/UWP新特性系列—电池报告

推荐一个UWP开发群:53078485 大家可以进来一起学习~~

Win10/UWP新特性系列—电池报告的更多相关文章

  1. 【转】Win10&sol;UWP新特性系列—Web

    Internet Explorer Internet Explorer 在Windows 10 升级为Edge模式,是一种交互性和兼容性都很强的新型浏览器,该浏览器相比以前的版本更新了超过2000个操 ...

  2. Win10&sol;UWP新特性系列—Launcher实现应用间的通信

    UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等. 如 ...

  3. Win10&sol;UWP新特性系列—使用打印机

    微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来 ...

  4. Win10&sol;UWP新特性系列-GetPublisherCacheFolder

    微软Windows Runtime App拥有很强的安全模型来防止不同App之间的数据获取和共享,也就是我们所说的"沙盒机制",每个App都运行在Windows沙盒中,App之间的 ...

  5. Win10&sol;UWP新特性—Drag&amp&semi;Drop 拖出元素到其他App

    在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop A ...

  6. Win10&sol;UWP新特性—SharedStorageAccessManager 共享文件

    首先先给大家推荐一个UWP/Win10开发者群:53078485  里面有很多大婶,还有很多学习资源,欢迎大家来一起讨论Win10开发! 在UWP开发中,微软提供了一个新的特性叫做SharedStor ...

  7. atitit。win7 win8 win9 win10 win11 新特性总结与战略规划

    atitit.win7 win8 win9 win10  win11 新特性总结与战略规划 1. win7 1 1.1. 发布时间 2009年10月22日 1 1.2. 稳定性大幅提升,很少蓝屏死机 ...

  8. UWP&sol;Win10新特性系列—App Service

    Win10中,新增了一个很实用的新特性叫做App Service,App Service允许App不在前台运行的情况下提供出一个或多个对外服务供其他App使用,这看起来就好像Web开发中的Web Ap ...

  9. 19、UWP 新特性(Creator Update)

    Build 版本 15063+ 1.能够为 CompositionObjects 的其他属性(阴影,裁剪,属性集合)添加动画 2.当设备插上电源的时候,通过 Extended Excution Ses ...

随机推荐

  1. Mac&&num;160&semi;下locate命令使用问题WARNING&colon; The locate database &lpar;&sol;var&sol;db&sol;locate&period;database&rpar; does not exist&period;

    想在Mac下使用locate时,提醒数据库没创建: WARNING: The locate database (/var/db/locate.database) does not exist. To ...

  2. 百度编辑器ueditor插入表格没有边框&comma;没有颜色的解决方法 2015-01-06 09&colon;24 98人阅读 评论&lpar;0&rpar; 收藏

    百度富文本编辑器..很强大.. - - ,不过有些BUG..真的很无解.. 最近用这个,发现上传的表格全部没有表框.. 解决办法如下: 转载的.. 百度编辑器ueditor插入一个表格后,在编辑过程中 ...

  3. 去除IE6浏览器下获得焦点的元素的虚线框的两个小办法

    [1]onfocus = "this.blur()"//得到焦点时,失去焦点 e.g. <a href="#" onfocus = "this. ...

  4. ajax 异步请求webservice&lpar;XML格式&rpar;

    function callAjaxWebservice(){ alert("call ajax"); try { $.ajax({ type: "POST", ...

  5. 2016021901 - ubuntu截图技巧

    ubuntu系统自带截图功能使用介绍 ubuntu自定义截图快捷键:Shift+PrtSc 截取当前窗口快捷键:Alt+PrtSc 保存全屏截图:PrtSc

  6. dom4j解析xml字符串

    import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Docume ...

  7. shell 编程之 for while until 循环

    shell 的for循环 的格式如下: for 变量  in 列表 do ... done 列表是一组值的序列 每个值通过空格隔开 每循环一次,列表中的下一个值赋给变量 in 列表是可选的,如果不用他 ...

  8. javascript 三种弹出对话框

    第一种:alert()方法 第二种:confirm()方法 返回一个布尔值,根据返回的值可以执行相应操作. 第三种: prompt()方法 返回输入的消息,或者其默认值提示框经常用于提示用户在进入页面 ...

  9. sha1withRSA算法

    RAS_USE_PRIVATE_ENCRYPT(3021300906052b0e03021a05000414 + SHA1(DATA))

  10. ActiveMQ的学习整理(代码实现PTP,以及Pub&sol;Sub)

    (一)由于在实习过程中需要用到ActiveMQ,在网上看了很多文章,现在整理出来以防忘记. (二)这篇文章比较适合之前没有接触过的同学,在看下面文章的过程中,建议先学习参考链接中的知识点,然后自己再参 ...