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()); } } }