|
先上图
新建CustomControl,名:HeaderedWindow
Themes\Generic.aml文件夹下加入
笔刷,转换器
1
2
3
View Code 最大化,最小化,关闭按钮
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
View Code 窗口样式
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 4
36 8
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
View Code
HeaderedWindwo.cs
1 public class HeaderedWindow : Window
2 {
3 #region 模板中的部分控件名称
4 private const string HeaderContainerName = "PART_HeaderContainer";
5 private const string MinimizeButtonName = "PART_MinimizeButton";
6 private const string RestoreButtonName = "PART_RestoreButton";
7 private const string CloseButtonName = "PART_CloseButton";
8 private const string TopResizerName = "PART_TopResizer";
9 private const string LeftResizerName = "PART_LeftResizer";
10 private const string RightResizerName = "PART_RightResizer";
11 private const string BottomResizerName = "PART_BottomResizer";
12 private const string BottomRightResizerName = "PART_BottomRightResizer";
13 private const string TopRightResizerName = "PART_TopRightResizer";
14 private const string TopLeftResizerName = "PART_TopLeftResizer";
15 private const string BottomLeftResizerName = "PART_BottomLeftResizer";
16 #endregion
17
18 #region 依赖属性
19 public static readonly DependencyProperty ShowDefaultHeaderProperty =
20 DependencyProperty.Register("ShowDefaultHeader", typeof(bool), typeof(HeaderedWindow), new FrameworkPropertyMetadata(true));
21
22 public static readonly DependencyProperty ShowResizeGripProperty =
23 DependencyProperty.Register("ShowResizeGrip", typeof(bool), typeof(HeaderedWindow), new FrameworkPropertyMetadata(false));
24
25 public static readonly DependencyProperty CanResizeProperty =
26 DependencyProperty.Register("CanResize", typeof(bool), typeof(HeaderedWindow), new FrameworkPropertyMetadata(true));
27
28 public static readonly DependencyProperty HeaderProperty =
29 DependencyProperty.Register("Header", typeof(object), typeof(HeaderedWindow), new FrameworkPropertyMetadata(null, OnHeaderChanged));
30
31 public static readonly DependencyProperty HeaderTemplateProperty =
32 DependencyProperty.Register("HeaderTemplate", typeof(DataTemplate), typeof(HeaderedWindow), new FrameworkPropertyMetadata(null));
33
34 public static readonly DependencyProperty HeaderTempateSelectorProperty =
35 DependencyProperty.Register("HeaderTempateSelector", typeof(DataTemplateSelector), typeof(HeaderedWindow), new FrameworkPropertyMetadata(null));
36
37 public static readonly DependencyProperty IsFullScreenMaximizeProperty =
38 DependencyProperty.Register("IsFullScreenMaximize", typeof(bool), typeof(HeaderedWindow), new FrameworkPropertyMetadata(false));
39
40 private static void OnHeaderChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
41 {
42 HeaderedWindow win = sender as HeaderedWindow;
43 win.RemoveLogicalChild(e.OldValue);
44 win.AddLogicalChild(e.NewValue);
45 }
46
47 public bool ShowDefaultHeader
48 {
49 get { return (bool)GetValue(ShowDefaultHeaderProperty); }
50 set { SetValue(ShowDefaultHeaderProperty, value); }
51 }
52
53 public bool CanResize
54 {
55 get { return (bool)GetValue(CanResizeProperty); }
56 set { SetValue(CanResizeProperty, value); }
57 }
58
59 public bool ShowResizeGrip
60 {
61 get { return (bool)GetValue(ShowResizeGripProperty); }
62 set { SetValue(ShowResizeGripProperty, value); }
63 }
64
65 public object Header
66 {
67 get { return (object)GetValue(HeaderProperty); }
68 set { SetValue(HeaderProperty, value); }
69 }
70
71 public DataTemplate HeaderTemplate
72 {
73 get { return (DataTemplate)GetValue(HeaderTemplateProperty); }
74 set { SetValue(HeaderTemplateProperty, value); }
75 }
76
77 public DataTemplateSelector HeaderTempateSelector
78 {
79 get { return (DataTemplateSelector)GetValue(HeaderTempateSelectorProperty); }
80 set { SetValue(HeaderTempateSelectorProperty, value); }
81 }
82
83 public bool IsFullScreenMaximize
84 {
85 get { return (bool)GetValue(IsFullScreenMaximizeProperty); }
86 set { SetValue(IsFullScreenMaximizeProperty, value); }
87 }
88
89 #endregion
90
91 static HeaderedWindow()
92 {
93 DefaultStyleKeyProperty.OverrideMetadata(typeof(HeaderedWindow), new FrameworkPropertyMetadata(typeof(HeaderedWindow)));
94 }
95
96 #region 私有变量
97
98 private FrameworkElement headerContainer;
99 private Button minimizeButton;
100 private ToggleButton restoreButton;
101 private Button closeButton;
102 private Thumb topResizer;
103 private Thumb leftResizer;
104 private Thumb rightResizer;
105 private Thumb bottomResizer;
106 private Thumb bottomRightResizer;
107 private Thumb topRightResizer;
108 private Thumb topLeftResizer;
109 private Thumb bottomLeftResizer;
110 #endregion
111
112 #region 重写函数
113
114 public override void OnApplyTemplate()
115 {
116 base.OnApplyTemplate();
117 headerContainer = GetTemplateChild(HeaderContainerName);
118 headerContainer.MouseLeftButtonDown += HeaderContainerMouseLeftButtonDown;
119 closeButton = GetTemplateChild(CloseButtonName);
120 closeButton.Click += delegate { Close(); };
121 restoreButton = GetTemplateChild(RestoreButtonName);
122 restoreButton.Checked += delegate { ChangeWindowState(WindowState.Maximized); };
123 restoreButton.Unchecked += delegate { ChangeWindowState(WindowState.Normal); };
124 StateChanged += new EventHandler(HeaderedWindowStateChanged);
125 minimizeButton = GetTemplateChild(MinimizeButtonName);
126 minimizeButton.Click += delegate { ChangeWindowState(WindowState.Minimized); };
127 topResizer = GetTemplateChild(TopResizerName);
128 topResizer.DragDelta += new DragDeltaEventHandler(ResizeTop);
129 leftResizer = GetTemplateChild(LeftResizerName);
130 leftResizer.DragDelta += new DragDeltaEventHandler(ResizeLeft);
131 rightResizer = GetTemplateChild(RightResizerName);
132 rightResizer.DragDelta += new DragDeltaEventHandler(ResizeRight);
133 bottomResizer = GetTemplateChild(BottomResizerName);
134 bottomResizer.DragDelta += new DragDeltaEventHandler(ResizeBottom);
135 bottomRightResizer = GetTemplateChild(BottomRightResizerName);
136 bottomRightResizer.DragDelta += new DragDeltaEventHandler(ResizeBottomRight);
137 topRightResizer = GetTemplateChild(TopRightResizerName);
138 topRightResizer.DragDelta += new DragDeltaEventHandler(ResizeTopRight);
139 topLeftResizer = GetTemplateChild(TopLeftResizerName);
140 topLeftResizer.DragDelta += new DragDeltaEventHandler(ResizeTopLeft);
141 bottomLeftResizer = GetTemplateChild(BottomLeftResizerName);
142 bottomLeftResizer.DragDelta += new DragDeltaEventHandler(ResizeBottomLeft);
143 }
144 #endregion
145
146 #region 辅助函数
147
148 private T GetTemplateChild(string childName) where T : FrameworkElement
149 {
150 return (GetTemplateChild(childName) as T);
151 }
152
153 ///
154 /// 鼠标左键单击拖动标题栏,双击窗体状态变化(最大化和还原)
155 ///
156 ///
157 ///
158 private void HeaderContainerMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
159 {
160 if (e.ClickCount == 1)
161 {
162 DragMove();
163 }
164 else
165 {
166 ChangeWindowState(WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized);
167 }
168 }
169 ///
170 /// 改变窗体状态
171 ///
172 /// Maximized,Normal,Minimized
173 private void ChangeWindowState(WindowState state)
174 {
175 if (state == WindowState.Maximized)
176 {
177 if (!IsFullScreenMaximize && IsLocationOnPrimaryScreen())
178 {
179 MaxHeight = SystemParameters.WorkArea.Height;
180 MaxWidth = SystemParameters.WorkArea.Width;
181 }
182 else
183 {
184 MaxHeight = double.PositiveInfinity;
185 MaxWidth = double.PositiveInfinity;
186 }
187 }
188 WindowState = state;
189 }
190
191 private void HeaderedWindowStateChanged(object sender, EventArgs e)
192 {
193 if (WindowState == WindowState.Minimized)
194 {
195 restoreButton.IsChecked = null;
196 }
197 else
198 {
199 restoreButton.IsChecked = WindowState == WindowState.Maximized;
200 }
201 }
202 ///
203 /// 判断控件是否位于主显示器中
204 ///
205 ///
206 private bool IsLocationOnPrimaryScreen()
207 {
208 return Left < SystemParameters.PrimaryScreenWidth && Top < SystemParameters.PrimaryScreenHeight;
209 }
210
211 #endregion
212
213 #region 重置大小
214 private void ResizeBottomLeft(object sender, DragDeltaEventArgs e)
215 {
216 ResizeLeft(sender, e);
217 ResizeBottom(sender, e);
218 }
219
220 private void ResizeTopLeft(object sender, DragDeltaEventArgs e)
221 {
222 ResizeTop(sender, e);
223 ResizeLeft(sender, e);
224 }
225
226 private void ResizeTopRight(object sender, DragDeltaEventArgs e)
227 {
228 ResizeRight(sender, e);
229 ResizeTop(sender, e);
230 }
231
232 private void ResizeBottomRight(object sender, DragDeltaEventArgs e)
233 {
234 ResizeBottom(sender, e);
235 ResizeRight(sender, e);
236 }
237
238 private void ResizeBottom(object sender, DragDeltaEventArgs e)
239 {
240 if (ActualHeight |
|