Skip to content

Commit 826b968

Browse files
committed
将弹窗独立为服务
1 parent 8efffb8 commit 826b968

File tree

7 files changed

+93
-67
lines changed

7 files changed

+93
-67
lines changed

src/ComputerLock/App.xaml.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ private void Init()
5353
services.AddSingleton<AutostartHook>();
5454
services.AddSingleton<TaskManagerHook>();
5555
services.AddSingleton<UserActivityMonitor>();
56+
services.AddSingleton<PopupService>();
5657
services.AddSingleton<WindowMain>();
5758
services.AddTransient<WindowLockScreen>();
5859
services.AddTransient<WindowBlankScreen>();

src/ComputerLock/Services/HotkeyScreenLockService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ namespace ComputerLock.Services;
55
internal class HotkeyScreenLockService(
66
IServiceProvider serviceProvider,
77
IStringLocalizer<Lang> lang,
8-
ILogger logger) : ScreenLockBaseService
8+
ILogger logger, PopupService popupService) : ScreenLockBaseService
99
{
1010
private bool _showAnimation;
1111
private readonly List<WindowBlankScreen> _blankScreens = [];
@@ -25,7 +25,7 @@ public override bool Lock(bool showAnimation)
2525
if (_showAnimation)
2626
{
2727
logger.Write("快捷键屏幕锁定 -> 锁定动画");
28-
ShowPopup(lang["Locked"]);
28+
popupService.ShowMessage(lang["Locked"]);
2929
}
3030

3131
if (_blankScreens.Count > 0)
@@ -61,7 +61,7 @@ public override void Unlock()
6161
if (_showAnimation)
6262
{
6363
logger.Write("快捷键屏幕锁定 -> 解锁动画");
64-
ShowPopup(lang["UnLocked"]);
64+
popupService.ShowMessage(lang["UnLocked"]);
6565
}
6666
}
6767
}

src/ComputerLock/Services/PasswordScreenLockService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace ComputerLock.Services;
55

6-
internal class PasswordScreenLockService(IServiceProvider serviceProvider, IStringLocalizer<Lang> lang, ILogger logger)
6+
internal class PasswordScreenLockService(IServiceProvider serviceProvider, IStringLocalizer<Lang> lang, ILogger logger, PopupService popupService)
77
: ScreenLockBaseService
88
{
99
private bool _showAnimation;
@@ -25,7 +25,7 @@ public override bool Lock(bool showAnimation)
2525
if (_showAnimation)
2626
{
2727
logger.Write("密码屏幕锁定 -> 锁定动画");
28-
ShowPopup(lang["Locked"]);
28+
popupService.ShowMessage(lang["Locked"]);
2929
}
3030

3131
if (_blankScreens.Count > 0)
@@ -79,7 +79,7 @@ public override void Unlock()
7979
if (_showAnimation)
8080
{
8181
logger.Write("密码屏幕锁定 -> 解锁动画");
82-
ShowPopup(lang["UnLocked"]);
82+
popupService.ShowMessage(lang["UnLocked"]);
8383
}
8484
}
8585

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System.Windows;
2+
using System.Windows.Threading;
3+
using Application = System.Windows.Application;
4+
5+
namespace ComputerLock.Services;
6+
7+
/// <summary>
8+
/// 弹窗服务,用于显示各种提示信息
9+
/// </summary>
10+
public class PopupService(ILogger logger)
11+
{
12+
/// <summary>
13+
/// 显示提示信息
14+
/// </summary>
15+
/// <param name="message">提示信息</param>
16+
/// <param name="duration">显示时长(毫秒)</param>
17+
public void ShowMessage(string message, int duration = 1100)
18+
{
19+
Application.Current.Dispatcher.Invoke(() =>
20+
{
21+
logger.Write($"弹窗服务 -> 显示消息:{message}");
22+
var popup = new WindowPopup(message);
23+
double primaryScreenWidth = SystemParameters.PrimaryScreenWidth;
24+
double primaryScreenHeight = SystemParameters.PrimaryScreenHeight;
25+
popup.Left = (primaryScreenWidth - popup.Width) / 2;
26+
popup.Top = (primaryScreenHeight - popup.Height) / 2;
27+
popup.Show();
28+
29+
var timer = new DispatcherTimer()
30+
{
31+
Interval = TimeSpan.FromMilliseconds(duration),
32+
};
33+
timer.Tick += (_, _) =>
34+
{
35+
timer.Stop();
36+
popup.CloseWindow();
37+
};
38+
timer.Start();
39+
});
40+
}
41+
}

src/ComputerLock/Services/ScreenLockBaseService.cs

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using ComputerLock.Interfaces;
22
using System.Windows;
3-
using System.Windows.Threading;
4-
using Application = System.Windows.Application;
53

64
namespace ComputerLock.Services;
75

@@ -51,28 +49,4 @@ protected void ShowWindowOnScreen(Window window, Screen screen)
5149
}
5250
return (1.0, 1.0); // 默认比例
5351
}
54-
55-
protected void ShowPopup(string message)
56-
{
57-
Application.Current.Dispatcher.Invoke(() =>
58-
{
59-
var popup = new WindowPopup(message);
60-
double primaryScreenWidth = SystemParameters.PrimaryScreenWidth;
61-
double primaryScreenHeight = SystemParameters.PrimaryScreenHeight;
62-
popup.Left = (primaryScreenWidth - popup.Width) / 2;
63-
popup.Top = (primaryScreenHeight - popup.Height) / 2;
64-
popup.Show();
65-
66-
var timer = new DispatcherTimer()
67-
{
68-
Interval = TimeSpan.FromMilliseconds(1100),
69-
};
70-
timer.Tick += (_, _) =>
71-
{
72-
timer.Stop();
73-
popup.CloseWindow();
74-
};
75-
timer.Start();
76-
});
77-
}
7852
}

src/ComputerLock/WindowPopup.xaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
mc:Ignorable="d"
77
Title="WindowPopup"
88
Height="50"
9-
Width="120"
9+
SizeToContent="Width"
1010
WindowStyle="None"
1111
AllowsTransparency="True"
1212
Background="Transparent"
@@ -16,9 +16,11 @@
1616
<Border BorderBrush="Black"
1717
BorderThickness="1"
1818
CornerRadius="5"
19-
Background="White">
19+
Background="White"
20+
Padding="20,0">
2021
<TextBlock x:Name="TxtMessage"
2122
FontSize="18"
23+
TextWrapping="NoWrap"
2224
HorizontalAlignment="Center"
2325
VerticalAlignment="Center"/>
2426
</Border>
Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,53 @@
11
using System.Windows;
22
using System.Windows.Media.Animation;
33

4-
namespace ComputerLock
4+
namespace ComputerLock;
5+
/// <summary>
6+
/// WindowPopup.xaml 的交互逻辑
7+
/// </summary>
8+
public partial class WindowPopup : Window
59
{
6-
/// <summary>
7-
/// WindowPopup.xaml 的交互逻辑
8-
/// </summary>
9-
public partial class WindowPopup : Window
10+
public WindowPopup(string message)
1011
{
11-
public WindowPopup(string message)
12-
{
13-
InitializeComponent();
14-
TxtMessage.Text = message;
15-
Loaded += WindowPopup_Loaded;
16-
}
17-
private void WindowPopup_Loaded(object sender, RoutedEventArgs e)
12+
InitializeComponent();
13+
TxtMessage.Text = message;
14+
Loaded += WindowPopup_Loaded;
15+
}
16+
private void WindowPopup_Loaded(object sender, RoutedEventArgs e)
17+
{
18+
// 在窗口加载完成后开始渐入动画
19+
var fadeInAnimation = new DoubleAnimation
1820
{
19-
// 在窗口加载完成后开始渐入动画
20-
var fadeInAnimation = new DoubleAnimation
21-
{
22-
From = 0,
23-
To = 1,
24-
Duration = TimeSpan.FromMilliseconds(300),
25-
};
21+
From = 0,
22+
To = 1,
23+
Duration = TimeSpan.FromMilliseconds(300),
24+
};
2625

27-
BeginAnimation(UIElement.OpacityProperty, fadeInAnimation);
28-
}
26+
BeginAnimation(UIElement.OpacityProperty, fadeInAnimation);
27+
28+
UpdateWindowPosition();
29+
}
2930

30-
public void CloseWindow()
31+
private void UpdateWindowPosition()
32+
{
33+
double primaryScreenWidth = SystemParameters.PrimaryScreenWidth;
34+
double primaryScreenHeight = SystemParameters.PrimaryScreenHeight;
35+
Left = (primaryScreenWidth - ActualWidth) / 2;
36+
Top = (primaryScreenHeight - ActualHeight) / 2;
37+
}
38+
39+
public void CloseWindow()
40+
{
41+
// 在窗口关闭时开始渐出动画
42+
var fadeOutAnimation = new DoubleAnimation
3143
{
32-
// 在窗口关闭时开始渐出动画
33-
var fadeOutAnimation = new DoubleAnimation
34-
{
35-
From = 1,
36-
To = 0,
37-
Duration = TimeSpan.FromMilliseconds(300),
38-
};
44+
From = 1,
45+
To = 0,
46+
Duration = TimeSpan.FromMilliseconds(300),
47+
};
3948

40-
fadeOutAnimation.Completed += (_, _) => Close();
49+
fadeOutAnimation.Completed += (_, _) => Close();
4150

42-
BeginAnimation(UIElement.OpacityProperty, fadeOutAnimation);
43-
}
51+
BeginAnimation(UIElement.OpacityProperty, fadeOutAnimation);
4452
}
45-
}
53+
}

0 commit comments

Comments
 (0)