アプリケーションが起動している最中のシステムの電源状態の変更(スリープ状態への移行、スリープ状態からの復帰)時に、特定の処理を行いたい場合に利用することができる、WPF 用のビヘイビア PowerModeChangedBehavior を作成しました。MakViewModelBase に組み込んでいます。
仕組みは次のようになっています。
- ICommand インターフェイス型の依存関係プロパティ CommandProperty を持つ。
- Window オブジェクトへのアタッチ及びデタッチ時に SystemEvents.PowerModeChanged イベントへイベントハンドラをアタッチ及びデタッチする。
- イベントハンドラでは、PowerModeChangedEventArgs を引数にセットし、CommandProperty に設定されたコマンドを起動する。
使用例は次のとおりです。
実行時の画面(実行後にシステムをスリープ状態にし、その後スリープ状態から復帰させたときのもの)。
使用例のプログラム。
WPF のプロジェクト「Eventhandle_Resume」を作成し、NuGet から MakViewModelBase をインストールしておきます。
まずは、ビューモデル。
プロジェクトに ViewModels フォルダを作成し、MainViewModel クラスを作成します。
using System.Windows.Input;
using MakCraft.ViewModels;
namespace Eventhandle_Resume.ViewModels
{
class MainViewModel : ViewModelBase
{
public string Info
{
get { return _info; }
set
{
base.SetProperty(ref _info, value);
}
}
private string _info;
private void resumeEventHandlerExecute(Microsoft.Win32.PowerModeChangedEventArgs e)
{
switch (e.Mode)
{
case Microsoft.Win32.PowerModes.Suspend:
Info += string.Format("スリープになりました。\r\n");
break;
case Microsoft.Win32.PowerModes.Resume:
Info += string.Format("スリープから復帰しました。\r\n");
break;
}
}
private RelayCommand<Microsoft.Win32.PowerModeChangedEventArgs> _resumeEventhandlerCommand;
public ICommand ResuomeEventHandlerCommand
{
get
{
if (_resumeEventhandlerCommand == null)
{
_resumeEventhandlerCommand =
new RelayCommand<Microsoft.Win32.PowerModeChangedEventArgs>(resumeEventHandlerExecute);
}
return _resumeEventhandlerCommand;
}
}
}
}
ICommand 型のプロパティ ResuomeEventHandlerCommand の get アクセサーにて、ジェネリックな RelayCommand クラスのインスタンス _resumeEventhandlerCommand を作成し、View 側へ渡すようになっています。コマンド実行の本体 resumeEventHandlerExecute(Microsoft.Win32.PowerModeChangedEventArgs e) メソッドでは、PowerModeChangedEventArgs クラスの Mode プロパティの値でスリープ移行とスリープからの復帰の状態遷移を判断しています。
次に MainWindow.xaml です。
<Window x:Class="Eventhandle_Resume.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:mb="clr-namespace:MakCraft.Behaviors;assembly=MakViewModelsBase"
xmlns:vm="clr-namespace:Eventhandle_Resume.ViewModels"
xmlns:local="clr-namespace:Eventhandle_Resume"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<vm:MainViewModel />
</Window.DataContext>
<i:Interaction.Behaviors>
<mb:PowerModeChangedBehavior Command="{Binding ResuomeEventHandlerCommand}" />
</i:Interaction.Behaviors>
<StackPanel>
<TextBlock
Margin="4" HorizontalAlignment="Center" FontSize="18"
Text="レジュームの通知をハンドリング" />
<TextBox
Margin="4" FontSize="14" MinHeight="100" MinWidth="100" IsReadOnly="True"
Text="{Binding Info}" />
</StackPanel>
</Window>
View 側では、XAML 名前空間宣言と Window への PowerModeChangedBehavior ビヘイビアの付加・Command 依存関係プロパティへのバインディングを行っています。
MakViewModelBase は GitHub 上にリポジトリがあるので、ソースを見たい方はリポジトリを参照してください。