-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathMainWindow.xaml.cs
336 lines (293 loc) · 10.9 KB
/
MainWindow.xaml.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
using Microsoft.UI.Windowing;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
using System;
using System.ComponentModel;
using Windows.Foundation;
using Windows.System;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.UI.Shell;
namespace Edge
{
public sealed partial class MainWindow : Window, INotifyPropertyChanged
{
private SUBCLASSPROC mainWindowSubClassProc;
private OverlappedPresenter overlappedPresenter;
private bool _isWindowMaximized;
public bool IsWindowMaximized
{
get => _isWindowMaximized;
set
{
if (_isWindowMaximized != value)
{
_isWindowMaximized = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsWindowMaximized)));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public MainWindow()
{
this.InitializeComponent();
ExtendsContentIntoTitleBar = true;
AppWindow.SetIcon("./Assets/icon.ico");
SetTitleBar(AppTitleBar);
this.SetBackdrop();
this.SetThemeColor();
overlappedPresenter = AppWindow.Presenter as OverlappedPresenter;
IsWindowMaximized = overlappedPresenter.State == OverlappedPresenterState.Maximized;
AppWindow.Changed += OnAppWindowChanged;
mainWindowSubClassProc = new SUBCLASSPROC(MainWindowSubClassProc);
PInvoke.SetWindowSubclass(new(this.GetWindowHandle()), mainWindowSubClassProc, 0, 0);
}
public void AddHomePage()
{
string uri = App.settings.SpecificUri;
if (!string.IsNullOrEmpty(uri))
{
AddNewTab(new WebViewPage(new Uri(uri)));
}
else
{
AddNewTab(new HomePage());
}
}
public void AddNewTab(object content, string header = "主页", int index = -1)
{
TabViewItem newTab = new()
{
IconSource = new FontIconSource() { Glyph = "\ue80f" },
Header = header,
Content = content
};
if (content is WebViewPage web)
{
newTab.ContextFlyout = TabFlyout;
web.tabViewItem = newTab;
}
int insertIndex = index >= 0 ? index : tabView.TabItems.Count;
tabView.TabItems.Insert(insertIndex, newTab);
tabView.SelectedIndex = insertIndex;
}
/// <summary>
/// 窗口位置变化发生的事件
/// </summary>
private void OnAppWindowChanged(AppWindow sender, AppWindowChangedEventArgs args)
{
// 窗口位置发生变化
if (args.DidPositionChange)
{
if (TitlebarMenuFlyout.IsOpen)
{
TitlebarMenuFlyout.Hide();
}
if (overlappedPresenter is not null)
{
IsWindowMaximized = overlappedPresenter.State is OverlappedPresenterState.Maximized;
}
}
}
/// <summary>
/// 窗口还原
/// </summary>
private void OnRestoreClicked(object sender, RoutedEventArgs args)
{
overlappedPresenter.Restore();
}
/// <summary>
/// 窗口移动
/// </summary>
private void OnMoveClicked(object sender, RoutedEventArgs args)
{
PInvoke.SendMessage((HWND)this.GetWindowHandle(), PInvoke.WM_SYSCOMMAND, 0xF010, 0);
}
/// <summary>
/// 窗口大小
/// </summary>
private void OnSizeClicked(object sender, RoutedEventArgs args)
{
PInvoke.SendMessage((HWND)this.GetWindowHandle(), PInvoke.WM_SYSCOMMAND, 0xF000, 0);
}
/// <summary>
/// 窗口最小化
/// </summary>
private void OnMinimizeClicked(object sender, RoutedEventArgs args)
{
overlappedPresenter.Minimize();
}
/// <summary>
/// 窗口最大化
/// </summary>
private void OnMaximizeClicked(object sender, RoutedEventArgs args)
{
overlappedPresenter.Maximize();
}
/// <summary>
/// 窗口关闭
/// </summary>
private void OnCloseClicked(object sender, RoutedEventArgs args)
{
this.Close();
}
/// <summary>
/// 应用主窗口消息处理
/// </summary>
private LRESULT MainWindowSubClassProc(HWND hWnd, uint Msg, WPARAM wParam, LPARAM lParam, nuint uIdSubclass, nuint dwRefData)
{
switch (Msg)
{
case PInvoke.WM_NCRBUTTONUP:
{
if (Content is not null && Content.XamlRoot is not null)
{
int x = (short)(lParam.Value & 0xFFFF);
int y = (short)((lParam.Value >> 16) & 0xFFFF);
System.Drawing.Point point = new(x, y);
PInvoke.ScreenToClient(hWnd, ref point);
uint dpi = PInvoke.GetDpiForWindow(hWnd);
float scalingFactor = dpi / 96.0f;
point.X = (int)(point.X / scalingFactor);
point.Y = (int)(point.Y / scalingFactor);
FlyoutShowOptions options = new()
{
ShowMode = FlyoutShowMode.Standard,
Position = new Point(point.X, point.Y)
};
TitlebarMenuFlyout.ShowAt(Content, options);
}
return (LRESULT)0;
}
}
return PInvoke.DefSubclassProc(hWnd, Msg, wParam, lParam);
}
private void CreateNewTabOnRight(object sender, RoutedEventArgs e)
{
AddHomePage();
}
private void RefreshTab(object sender, RoutedEventArgs e)
{
WebView2 webView2 = App.GetWebView2(tabView.SelectedItem as TabViewItem);
webView2.Reload();
}
private void CopyTab(object sender, RoutedEventArgs e)
{
WebView2 webView2 = App.GetWebView2(tabView.SelectedItem as TabViewItem);
AddNewTab(new WebViewPage(webView2.Source), index: tabView.SelectedIndex + 1);
}
private void MoveTabToNewWindow(object sender, RoutedEventArgs e)
{
WebView2 webView2 = App.GetWebView2(tabView.SelectedItem as TabViewItem);
var window = App.CreateNewWindow();
window.AddNewTab(new WebViewPage(webView2.Source));
window.Activate();
tabView.TabItems.Remove(tabView.SelectedItem);
}
private void CloseTab(object sender, object e)
{
if (e is TabViewTabCloseRequestedEventArgs args)
{
tabView.TabItems.Remove(args.Tab);
}
// else e is RoutedEventArgs
else
{
tabView.TabItems.RemoveAt(tabView.SelectedIndex);
}
if (tabView.TabItems.Count <= 0)
{
Close();
}
}
private void CloseOtherTab(object sender, RoutedEventArgs e)
{
var selectedItem = tabView.SelectedItem;
tabView.TabItems.Clear();
tabView.TabItems.Add(selectedItem);
}
private void CloseRightTab(object sender, RoutedEventArgs e)
{
while (tabView.TabItems.Count > tabView.SelectedIndex + 1)
{
tabView.TabItems.RemoveAt(tabView.SelectedIndex + 1);
}
tabView.UpdateLayout();
}
private void MuteTab(object sender, RoutedEventArgs e)
{
WebView2 webView2 = App.GetWebView2(tabView.SelectedItem as TabViewItem);
if (!webView2.CoreWebView2.IsMuted)
{
webView2.CoreWebView2.IsMuted = true;
MuteButton.Icon = new FontIcon() { Glyph = "\ue995" };
MuteButton.Text = "取消标签页静音";
}
else
{
webView2.CoreWebView2.IsMuted = false;
MuteButton.Icon = new FontIcon() { Glyph = "\ue74f" };
MuteButton.Text = "使标签页静音";
}
}
public object SelectedItem
{
get => (tabView.SelectedItem as TabViewItem).Content;
set => tabView.SelectedItem = value;
}
public TabView TabView => tabView;
private void OpenClosedTab(object sender, RoutedEventArgs e)
{
AddNewTab(new WebViewPage(new Uri(App.Histories[^1].Source)));
}
private void PinTab(object sender, RoutedEventArgs e)
{
var menuItem = sender as MenuFlyoutItem;
var item = tabView.SelectedItem as TabViewItem;
if (item.IsClosable)
{
menuItem.Text = "取消固定标签页";
item.IsClosable = false;
}
else
{
menuItem.Text = "固定标签页";
item.IsClosable = true;
}
}
private void TabViewAddTabButtonClick(TabView sender, object args)
{
AddHomePage();
}
private async void LearnAboutWorkspaces(object sender, RoutedEventArgs e)
{
await Launcher.LaunchUriAsync(new Uri("https://aka.ms/edgeworkspaces/learn-more-msa"));
}
private void CreateNewWorkspaces(object sender, RoutedEventArgs e)
{
}
private void TabViewPointerPressed(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e)
{
var properties = e.GetCurrentPoint(null).Properties;
if (properties.IsMiddleButtonPressed)
{
var pointerPosition = e.GetCurrentPoint(tabView).Position;
foreach (var item in tabView.TabItems)
{
if (item is TabViewItem tabViewItem)
{
var transform = tabViewItem.TransformToVisual(tabView);
var itemBounds = transform.TransformBounds(new Rect(0, 0, tabViewItem.ActualWidth, tabViewItem.ActualHeight));
if (itemBounds.Contains(pointerPosition))
{
tabView.TabItems.Remove(tabViewItem);
if (tabView.TabItems.Count <= 0) Close();
break;
}
}
}
}
}
}
}