|
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { SetLabelButtonStatus(IndexerCurrentFileLabel, "检索进行中 ...."); IKnownFolder docs; if (ShellLibrary.IsPlatformSupported) docs = KnownFolders.DocumentsLibrary; else docs = KnownFolders.Documents; ShellContainer docsContainer = docs as ShellContainer; foreach (ShellObject so in docs) { RecurseDisplay(so); if (backgroundWorker.CancellationPending) { SetLabelButtonStatus(StartStopIndexerButton, "开始检索"); SetLabelButtonStatus(IndexerStatusLabel, "点击开始寻找按钮继续开始寻找."); SetLabelButtonStatus(IndexerCurrentFileLabel, (cancelReason == "电源改变") ? "因为电源放弃检索" : "因为使用者放弃检索"); return; } Thread.Sleep(1000); // 休眠1秒,以指示该文件的索引 } } private void Window_Loaded(object sender, RoutedEventArgs e) { CapturePowerManagementEvents(); GetPowerSettings(); } //获取从PowerManager的当前属性值。 //此方法是在启动时调用。 private void GetPowerSettings() { settings.PowerPersonality = PowerManager.PowerPersonality.ToString(); settings.PowerSource = PowerManager.PowerSource.ToString(); settings.BatteryPresent = PowerManager.IsBatteryPresent; settings.UpsPresent = PowerManager.IsUpsPresent; settings.MonitorOn = PowerManager.IsMonitorOn; settings.MonitorRequired = PowerManager.MonitorRequired; if (PowerManager.IsBatteryPresent) { settings.BatteryShortTerm = PowerManager.IsBatteryShortTerm; settings.BatteryLifePercent = PowerManager.BatteryLifePercent; BatteryState batteryState = PowerManager.GetCurrentBatteryState(); string batteryStateStr = string.Format( "ACOnline: {1}{0}最大充电: {2} mWh{0}兆瓦时电流充电: {3} mWh{0}兆瓦时放电率: {4} {0}估计剩余时间: {5}{0}建议临界电池更换: {6} mWh{0}建议兆瓦电池充电警告: {7} mWh{0}", Environment.NewLine, batteryState.ACOnline, batteryState.MaxCharge, batteryState.CurrentCharge, batteryState.ACOnline == true ? "N/A" : batteryState.DischargeRate.ToString() + " mWh", batteryState.ACOnline == true ? "N/A" : batteryState.EstimatedTimeRemaining.ToString(), batteryState.SuggestedCriticalBatteryCharge, batteryState.SuggestedBatteryWarningCharge ); settings.BatteryState = batteryStateStr; } } // 增加了对PowerManager的事件的事件处理程序。 private void CapturePowerManagementEvents() { PowerManager.IsMonitorOnChanged += new EventHandler(MonitorOnChanged); PowerManager.PowerPersonalityChanged += new EventHandler( PowerPersonalityChanged); PowerManager.PowerSourceChanged += new EventHandler(PowerSourceChanged); if (PowerManager.IsBatteryPresent) { PowerManager.BatteryLifePercentChanged += new EventHandler(BatteryLifePercentChanged); SetLabelButtonStatus(batteryLifePercentLabel, string.Format("{0}%", PowerManager.BatteryLifePercent.ToString())); } PowerManager.SystemBusyChanged += new EventHandler(SystemBusyChanged); } // PowerManager的事件处理程序。 void MonitorOnChanged(object sender, EventArgs e) { settings.MonitorOn = PowerManager.IsMonitorOn; AddEventMessage(string.Format("显示器状态改变 (new status: {0})", PowerManager.IsMonitorOn ? "On" : "Off")); } void PowerPersonalityChanged(object sender, EventArgs e) { settings.PowerPersonality = PowerManager.PowerPersonality.ToString(); AddEventMessage(string.Format("电源变化(current setting: {0})", PowerManager.PowerPersonality.ToString())); } void PowerSourceChanged(object sender, EventArgs e) { settings.PowerSource = PowerManager.PowerSource.ToString(); AddEventMessage(string.Format("电源设置变化 (current source: {0})", PowerManager.PowerSource.ToString())); // if (backgroundWorker.IsBusy) { if (PowerManager.PowerSource == PowerSource.Battery) { cancelReason = "电源变化"; backgroundWorker.CancelAsync(); } } else { if (PowerManager.PowerSource == PowerSource.AC || PowerManager.PowerSource == PowerSource.Ups) { SetLabelButtonStatus(IndexerStatusLabel, "点击开始寻找按钮继续开始寻找."); } } } void BatteryLifePercentChanged(object sender, EventArgs e) { settings.BatteryLifePercent = PowerManager.BatteryLifePercent; AddEventMessage(string.Format("电源电量变化了 (new value: {0})", PowerManager.BatteryLifePercent)); // 设置剩余电源电量 SetLabelButtonStatus(batteryLifePercentLabel, string.Format("{0}%", PowerManager.BatteryLifePercent.ToString())); } //事件处理程序必须使用窗口的调度 //更新用户界面直接。这是必要的,因为 //事件处理程序被调用在非UI线程。 void SystemBusyChanged(object sender, EventArgs e) { AddEventMessage(string.Format("系统忙碌变化 at {0}", DateTime.Now.ToLongTimeString())); } void AddEventMessage(string message) { this.Dispatcher.Invoke(DispatcherPriority.Normal, (Window1.MethodInvoker)delegate { ListBoxItem lbi = new ListBoxItem(); lbi.Content = message; messagesListBox.Items.Add(lbi); messagesListBox.ScrollIntoView(lbi); }); } private void StartIndexer(object sender, RoutedEventArgs e) { if (backgroundWorker.IsBusy && ((Button)sender).Content.ToString() == "停止索引") { cancelReason = "userCancelled"; backgroundWorker.CancelAsync(); SetLabelButtonStatus(IndexerStatusLabel, "点击按钮开始寻找"); return; } //如果运行在使用电池,不启动索引 if (PowerManager.PowerSource != PowerSource.Battery) { backgroundWorker.RunWorkerAsync(); SetLabelButtonStatus(IndexerStatusLabel, "索引进行中...."); SetLabelButtonStatus(StartStopIndexerButton, "停止 索引"); } else { SetLabelButtonStatus(IndexerCurrentFileLabel, "电池上运行。没有启动的索引"); } } private void RecurseDisplay(ShellObject so) { if (backgroundWorker.CancellationPending) return; SetLabelButtonStatus(IndexerCurrentFileLabel, string.Format("Current {0}: {1}", so is ShellContainer ? "文件夹" : "文件", so.ParsingName)); // 通过此对象的子项,如果它是一个对象容器 ShellContainer container = so as ShellContainer; if (container != null) { foreach (ShellObject child in container) RecurseDisplay(child); } } private void SetLabelButtonStatus(ContentControl control, string status) { this.Dispatcher.Invoke(DispatcherPriority.Normal, (Window1.MethodInvoker)delegate { control.Content = status; }); } } } 编译运行,见效果: ![]() ![]() ![]() |








骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价