-
Notifications
You must be signed in to change notification settings - Fork 0
/
MultiMonitorUtilBehavior.cs
116 lines (102 loc) · 5.09 KB
/
MultiMonitorUtilBehavior.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using System;
using System.Windows;
using System.Windows.Input;
using Microsoft.Xaml.Behaviors;
using MakCraft.Utils;
namespace MakCraft.Behaviors
{
/// <summary>
/// <see cref="MutiMonitorUtil"/> の利用を支援するビヘイビア
/// SourceInitialized イベント発生時に <see cref="IMutiMonitorUtilProperty"/> 依存関係プロパティに MultiMonitorUtil クラスのインスタンスを設定するとともに <see cref="OnSourceInitializedCommandProperty"/> に設定されたコマンドを実行する。
/// DisplaySettingsChanged イベント発生時に <see cref="OnDisplaySettingsChangedCommandProperty"/> に設定されたコマンドを実行する。
/// </summary>
public class MultiMonitorUtilBehavior : Behavior<Window>
{
/// <summary>
/// 依存関係プロパティ IMutiMonitorUtilProperty
/// </summary>
public static readonly DependencyProperty IMutiMonitorUtilProperty = DependencyProperty.Register(
"IMutiMonitorUtil", typeof(IMutiMonitorUtil), typeof(MultiMonitorUtilBehavior), new UIPropertyMetadata
{
DefaultValue = null
});
/// <summary>
/// MultiMonitorUtil クラスのインスタンスを取得または設定します。
/// </summary>
public IMutiMonitorUtil IMutiMonitorUtil
{
get { return (IMutiMonitorUtil)GetValue(IMutiMonitorUtilProperty); }
set { SetValue(IMutiMonitorUtilProperty, value); }
}
/// <summary>
/// 依存関係プロパティ OnSourceInitializedCommandProperty
/// </summary>
public static readonly DependencyProperty OnSourceInitializedCommandProperty = DependencyProperty.Register(
"OnSourceInitializedCommand", typeof(ICommand), typeof(MultiMonitorUtilBehavior), new UIPropertyMetadata());
/// <summary>
/// OnSourceInitializedCommand プロパティ
/// </summary>
public ICommand OnSourceInitializedCommand
{
get { return (ICommand)GetValue(OnSourceInitializedCommandProperty); }
set { SetValue(OnSourceInitializedCommandProperty, value); }
}
/// <summary>
/// 依存関係プロパティ OnDisplaySettingsChangedCommandProperty
/// </summary>
public static readonly DependencyProperty OnDisplaySettingsChangedCommandProperty = DependencyProperty.Register(
"OnDisplaySettingsChangedCommand", typeof(ICommand), typeof(MultiMonitorUtilBehavior), new UIPropertyMetadata());
/// <summary>
/// OnDisplaySettingsChangedCommand プロパティ
/// </summary>
public ICommand OnDisplaySettingsChangedCommand
{
get { return (ICommand)GetValue(OnDisplaySettingsChangedCommandProperty); }
set { SetValue(OnDisplaySettingsChangedCommandProperty, value); }
}
/// <summary>
/// ビヘイビアーが AssociatedObject にアタッチされた後で呼び出されます。
/// </summary>
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.SourceInitialized += new EventHandler(OnSourceInitialized);
this.AssociatedObject.Closed += new EventHandler(OnClosed); // OnDetaching が呼ばれない場合に備えて Window.Closed イベントでも後処理を行う
Microsoft.Win32.SystemEvents.DisplaySettingsChanged +=
new EventHandler(OnDisplaySettingsChanged);
}
/// <summary>
/// ビヘイビアーが AssociatedObject からデタッチされるとき、その前に呼び出されます。
/// </summary>
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.SourceInitialized -= new EventHandler(OnSourceInitialized);
this.AssociatedObject.Closed -= new EventHandler(OnClosed);
Microsoft.Win32.SystemEvents.DisplaySettingsChanged -=
new EventHandler(OnDisplaySettingsChanged);
}
private void OnSourceInitialized(object sender, EventArgs e)
{
var multiMonitorUtil = Utils.MutiMonitorUtil.Instance;
multiMonitorUtil.Refresh();
IMutiMonitorUtil = multiMonitorUtil;
if (OnSourceInitializedCommand == null) return;
OnSourceInitializedCommand.Execute(e);
}
private void OnDisplaySettingsChanged(object sender, EventArgs e)
{
var multiMonitorUtil = Utils.MutiMonitorUtil.Instance;
multiMonitorUtil.Refresh();
if (OnDisplaySettingsChangedCommand == null) return;
OnDisplaySettingsChangedCommand.Execute(e);
}
private void OnClosed(object sender, EventArgs e)
{
this.AssociatedObject.SourceInitialized -= new EventHandler(OnSourceInitialized);
this.AssociatedObject.Closed -= new EventHandler(OnClosed);
Microsoft.Win32.SystemEvents.DisplaySettingsChanged -=
new EventHandler(OnDisplaySettingsChanged);
}
}
}