C#: Windows.Devices.Power.Battery.ReportUpdate是否会在电脑插上电源时出现状态,并限制事件的发生。

问题描述 投票:0回答:1

我想知道电脑何时被拔掉插头并以电池运行。一旦用上电池,我想知道电池的百分比何时达到25%。我更喜欢事件,但如果有必要,也可以进行投票。

有几种方法可以检查电脑是插上电源还是用电池。你可以投票,看看。

System.Windows.SystemParameters.PowerLineStatus == System.Windows.PowerLineStatus.Offline;

var batteryPercentage == SystemInformation.PowerStatus.BatteryLifePercent;

我不认为这有什么不好的地方,除了要投票。

你也可以使用Windows.Devices.Power.Battery.AggregateBattery.ReportUpdated的事件ReportUpdate。 这似乎和我想要的很接近。从这里你可以得到 BatteryStatus Enum。

可能的情况是充电、放电、闲置和不在状态。我的猜测是,充电或闲置必然意味着笔记本是插着电源的,而放电则意味着它只是在使用电池。 但这只是我的猜测。 文件中并没有这样说。我可以想象,你可能有一个非常糟糕的电池,即使它是插入式的放电。 我怎么才能确定它是否插上了电?

此外,事件真的太多了。 我真的不希望出现插上电源充电,电池百分比上升的事件。 我真的只关心它是否插电,一旦插电,到了25%。 我想如果事件不多,我可以忽略这些不必要的信息。有没有办法减少或选择活动,或者是活动不多,我应该忽略这些?

c# windows uwp battery
1个回答
0
投票

我真的只关心它是否被拔掉了插头,一旦它被拔掉了插头,就会达到25%的电量。

请检查 获取电池信息一旦你有了一个聚合电池对象,调用 GetReport 以获得相应的 BatteryReport.

当电池的电量、容量或状态发生变化时,电池对象会触发 ReportUpdated 事件。通常情况下,状态变化会立即发生,其他变化会定期发生。

Battery.AggregateBattery.ReportUpdated += AggregateBattery_ReportUpdated;

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();
            }
        });
    }
}

如果你只是想检测它是否被拔掉了电源,并且电量达到25%,你可以用一个方法来封装上述代码。

例如,你可以用一个方法来封装上述代码。

public static class BatteryUnpluggedTo25
{
    private static Action<bool> _action;
    public static void Report(Action<bool> action)
    {
        Battery.AggregateBattery.ReportUpdated += AggregateBattery_ReportUpdated;
        _action = action;
    }

    private static void AggregateBattery_ReportUpdated(Battery sender, object args)
    {
        var aggBattery = Battery.AggregateBattery;
        var report = aggBattery.GetReport();
        switch (report.Status)
        {
            case Windows.System.Power.BatteryStatus.NotPresent:
                break;
            case Windows.System.Power.BatteryStatus.Discharging:
                currentBatteryLevel(report, _action);
                break;
            case Windows.System.Power.BatteryStatus.Idle:
                break;
            case Windows.System.Power.BatteryStatus.Charging:

                break;
            default:
                break;
        }
    }
    private  static void currentBatteryLevel(BatteryReport report, Action<bool> action)
    {

        var Maximum = Convert.ToDouble(report.FullChargeCapacityInMilliwattHours);
        var Value = Convert.ToDouble(report.RemainingCapacityInMilliwattHours);
        var level = Value / Maximum;

        if (level <= 0.25)
        {
            action(true);
        }

    }
}

例如:

BatteryUnpluggedTo25.Report((s) =>
{

    if (s == true)
    {
      // do something
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.