diff --git a/src/Snap.Hutao/Snap.Hutao/Control/IXamlElementAccessor.cs b/src/Snap.Hutao/Snap.Hutao/Control/IXamlElementAccessor.cs
new file mode 100644
index 00000000..c9913374
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Control/IXamlElementAccessor.cs
@@ -0,0 +1,6 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Snap.Hutao.Control;
+
+internal interface IXamlElementAccessor;
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Message/BackgroundImageTypeChangedMessage.cs b/src/Snap.Hutao/Snap.Hutao/Message/BackgroundImageTypeChangedMessage.cs
new file mode 100644
index 00000000..d765f827
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Message/BackgroundImageTypeChangedMessage.cs
@@ -0,0 +1,6 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Snap.Hutao.Message;
+
+internal sealed class BackgroundImageTypeChangedMessage;
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Navigation/INavigationInitialization.cs b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/INavigationInitialization.cs
index 27269ab7..e9efdbba 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Navigation/INavigationInitialization.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/INavigationInitialization.cs
@@ -1,8 +1,6 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
-using Microsoft.UI.Xaml.Controls;
-
namespace Snap.Hutao.Service.Navigation;
///
@@ -10,10 +8,5 @@ namespace Snap.Hutao.Service.Navigation;
///
internal interface INavigationInitialization
{
- ///
- /// 使用指定的对象进行初始化
- ///
- /// 管理的
- /// 管理的
- void Initialize(NavigationView navigationView, Frame frame);
+ void Initialize(INavigationViewAccessor accessor);
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Navigation/INavigationViewAccessor.cs b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/INavigationViewAccessor.cs
new file mode 100644
index 00000000..c219bd2c
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/INavigationViewAccessor.cs
@@ -0,0 +1,14 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Microsoft.UI.Xaml.Controls;
+using Snap.Hutao.Control;
+
+namespace Snap.Hutao.Service.Navigation;
+
+internal interface INavigationViewAccessor : IXamlElementAccessor
+{
+ NavigationView NavigationView { get; }
+
+ Frame Frame { get; }
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Navigation/NavigationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/NavigationService.cs
index 8729e996..8aebb5b8 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Navigation/NavigationService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/NavigationService.cs
@@ -147,10 +147,10 @@ internal sealed class NavigationService : INavigationService, INavigationInitial
}
///
- public void Initialize(NavigationView navigationView, Frame frame)
+ public void Initialize(INavigationViewAccessor accessor)
{
- NavigationView = navigationView;
- this.frame = frame;
+ NavigationView = accessor.NavigationView;
+ frame = accessor.Frame;
NavigationView.IsPaneOpen = LocalSetting.Get(SettingKeys.IsNavPaneOpen, true);
}
diff --git a/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml b/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml
index b5728fb2..45f98c12 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml
@@ -18,7 +18,7 @@
@@ -31,7 +31,7 @@
public MainView()
{
- DataContext = Ioc.Default.GetRequiredService();
+ IServiceProvider serviceProvider = Ioc.Default;
+
+ MainViewModel mainViewModel = serviceProvider.GetRequiredService();
+
+ DataContext = mainViewModel;
InitializeComponent();
- IServiceProvider serviceProvider = Ioc.Default;
+ mainViewModel.Initialize(new BackgroundImagePresenterAccessor(BackgroundImagePresenter));
navigationService = serviceProvider.GetRequiredService();
if (navigationService is INavigationInitialization navigationInitialization)
{
- navigationInitialization.Initialize(NavView, ContentFrame);
+ navigationInitialization.Initialize(new NavigationViewAccessor(NavView, ContentFrame));
}
navigationService.Navigate(INavigationAwaiter.Default, true);
}
+
+ private class NavigationViewAccessor : INavigationViewAccessor
+ {
+ public NavigationViewAccessor(NavigationView navigationView, Frame frame)
+ {
+ NavigationView = navigationView;
+ Frame = frame;
+ }
+
+ public NavigationView NavigationView { get; private set; }
+
+ public Frame Frame { get; private set; }
+ }
+
+ private class BackgroundImagePresenterAccessor : IBackgroundImagePresenterAccessor
+ {
+ public BackgroundImagePresenterAccessor(Image backgroundImagePresenter)
+ {
+ BackgroundImagePresenter = backgroundImagePresenter;
+ }
+
+ public Image BackgroundImagePresenter { get; private set; }
+ }
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/IBackgroundImagePresenterAccessor.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/IBackgroundImagePresenterAccessor.cs
new file mode 100644
index 00000000..cf73f768
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/IBackgroundImagePresenterAccessor.cs
@@ -0,0 +1,12 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Microsoft.UI.Xaml.Controls;
+using Snap.Hutao.Control;
+
+namespace Snap.Hutao.ViewModel;
+
+internal interface IBackgroundImagePresenterAccessor : IXamlElementAccessor
+{
+ Image BackgroundImagePresenter { get; }
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/IMainViewModelInitialization.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/IMainViewModelInitialization.cs
new file mode 100644
index 00000000..0fb1d37d
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/IMainViewModelInitialization.cs
@@ -0,0 +1,9 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Snap.Hutao.ViewModel;
+
+internal interface IMainViewModelInitialization
+{
+ void Initialize(IBackgroundImagePresenterAccessor accessor);
+}
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/MainViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/MainViewModel.cs
index fa333520..fe0c1887 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/MainViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/MainViewModel.cs
@@ -1,27 +1,45 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
+using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.WinUI.Animations;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media.Animation;
using Snap.Hutao.Control.Animation;
using Snap.Hutao.Control.Theme;
+using Snap.Hutao.Message;
using Snap.Hutao.Service.BackgroundImage;
namespace Snap.Hutao.ViewModel;
[ConstructorGenerated]
[Injection(InjectAs.Singleton)]
-internal sealed partial class MainViewModel : Abstraction.ViewModel
+internal sealed partial class MainViewModel : Abstraction.ViewModel, IMainViewModelInitialization, IRecipient
{
private readonly IBackgroundImageService backgroundImageService;
private readonly ITaskContext taskContext;
private BackgroundImage? previousBackgroundImage;
+ private Image? backgroundImagePresenter;
+
+ public void Initialize(IBackgroundImagePresenterAccessor accessor)
+ {
+ backgroundImagePresenter = accessor.BackgroundImagePresenter;
+ }
+
+ public void Receive(BackgroundImageTypeChangedMessage message)
+ {
+ UpdateBackgroundAsync().SafeForget();
+ }
[Command("UpdateBackgroundCommand")]
- private async Task UpdateBackgroundAsync(Image presenter)
+ private async Task UpdateBackgroundAsync()
{
+ if (backgroundImagePresenter is null)
+ {
+ return;
+ }
+
(bool isOk, BackgroundImage backgroundImage) = await backgroundImageService.GetNextBackgroundImageAsync(previousBackgroundImage).ConfigureAwait(false);
if (isOk)
@@ -36,11 +54,11 @@ internal sealed partial class MainViewModel : Abstraction.ViewModel
duration: ControlAnimationConstants.ImageOpacityFadeInOut,
easingType: EasingType.Quartic,
easingMode: EasingMode.EaseInOut)
- .StartAsync(presenter)
+ .StartAsync(backgroundImagePresenter)
.ConfigureAwait(true);
- presenter.Source = backgroundImage.ImageSource;
- double targetOpacity = ThemeHelper.IsDarkMode(presenter.ActualTheme) ? 1 - backgroundImage.Luminance : backgroundImage.Luminance;
+ backgroundImagePresenter.Source = backgroundImage.ImageSource;
+ double targetOpacity = ThemeHelper.IsDarkMode(backgroundImagePresenter.ActualTheme) ? 1 - backgroundImage.Luminance : backgroundImage.Luminance;
await AnimationBuilder
.Create()
@@ -49,7 +67,7 @@ internal sealed partial class MainViewModel : Abstraction.ViewModel
duration: ControlAnimationConstants.ImageOpacityFadeInOut,
easingType: EasingType.Quartic,
easingMode: EasingMode.EaseInOut)
- .StartAsync(presenter)
+ .StartAsync(backgroundImagePresenter)
.ConfigureAwait(true);
}
}
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs
index 5ba8cffd..a34ce387 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs
@@ -1,6 +1,7 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
+using CommunityToolkit.Mvvm.Messaging;
using Microsoft.UI.Xaml.Controls;
using Microsoft.Windows.AppLifecycle;
using Snap.Hutao.Core;
@@ -54,6 +55,7 @@ internal sealed partial class SettingViewModel : Abstraction.ViewModel
private readonly IUserService userService;
private readonly ITaskContext taskContext;
private readonly AppOptions appOptions;
+ private readonly IMessenger messenger;
private NameValue? selectedBackdropType;
private NameValue? selectedBackgroundImageType;
@@ -100,6 +102,7 @@ internal sealed partial class SettingViewModel : Abstraction.ViewModel
if (SetProperty(ref selectedBackgroundImageType, value) && value is not null)
{
AppOptions.BackgroundImageType = value.Value;
+ messenger.Send(new Message.BackgroundImageTypeChangedMessage());
}
}
}