From 04c187aa165cb56ce5755cd34cc46c8d9ad6fd88 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Thu, 22 Feb 2024 22:34:12 +0800 Subject: [PATCH 1/2] real time refresh background --- .../Message/BackgroundImageTypeChangedMessage.cs | 8 ++++++++ src/Snap.Hutao/Snap.Hutao/View/MainView.xaml | 4 ++-- src/Snap.Hutao/Snap.Hutao/View/MainView.xaml.cs | 8 ++++++-- .../Main/IMainViewModelInitialization.cs | 11 +++++++++++ .../ViewModel/{ => Main}/MainViewModel.cs | 16 +++++++++++++++- .../ViewModel/Setting/SettingViewModel.cs | 3 +++ 6 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Message/BackgroundImageTypeChangedMessage.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/ViewModel/Main/IMainViewModelInitialization.cs rename src/Snap.Hutao/Snap.Hutao/ViewModel/{ => Main}/MainViewModel.cs (79%) 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..ec85335e --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Message/BackgroundImageTypeChangedMessage.cs @@ -0,0 +1,8 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Message; + +internal sealed class BackgroundImageTypeChangedMessage +{ +} 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(BackgroundImagePresenter); navigationService = serviceProvider.GetRequiredService(); if (navigationService is INavigationInitialization navigationInitialization) diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Main/IMainViewModelInitialization.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Main/IMainViewModelInitialization.cs new file mode 100644 index 00000000..6dcf8b04 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Main/IMainViewModelInitialization.cs @@ -0,0 +1,11 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.UI.Xaml.Controls; + +namespace Snap.Hutao.ViewModel.Main; + +internal interface IMainViewModelInitialization +{ + void Initialize(Image backgroundImagePresenter); +} diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/MainViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Main/MainViewModel.cs similarity index 79% rename from src/Snap.Hutao/Snap.Hutao/ViewModel/MainViewModel.cs rename to src/Snap.Hutao/Snap.Hutao/ViewModel/Main/MainViewModel.cs index fa333520..4235565d 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/MainViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Main/MainViewModel.cs @@ -1,23 +1,37 @@ // 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; +using Snap.Hutao.ViewModel.Main; 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(Image backgroundImagePresenter) + { + this.backgroundImagePresenter = backgroundImagePresenter; + } + + public void Receive(BackgroundImageTypeChangedMessage message) + { + UpdateBackgroundAsync(backgroundImagePresenter).SafeForget(); + } [Command("UpdateBackgroundCommand")] private async Task UpdateBackgroundAsync(Image presenter) 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()); } } } From 0c093851edc96185adf3213901da4f07db938001 Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Fri, 23 Feb 2024 09:33:55 +0800 Subject: [PATCH 2/2] code style --- .../Control/IXamlElementAccessor.cs | 6 +++++ .../BackgroundImageTypeChangedMessage.cs | 4 +-- .../Navigation/INavigationInitialization.cs | 9 +------ .../Navigation/INavigationViewAccessor.cs | 14 ++++++++++ .../Service/Navigation/NavigationService.cs | 6 ++--- .../Snap.Hutao/View/MainView.xaml.cs | 27 +++++++++++++++++-- .../IBackgroundImagePresenterAccessor.cs | 12 +++++++++ .../IMainViewModelInitialization.cs | 6 ++--- .../ViewModel/{Main => }/MainViewModel.cs | 24 ++++++++++------- 9 files changed, 78 insertions(+), 30 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Control/IXamlElementAccessor.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/Navigation/INavigationViewAccessor.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/ViewModel/IBackgroundImagePresenterAccessor.cs rename src/Snap.Hutao/Snap.Hutao/ViewModel/{Main => }/IMainViewModelInitialization.cs (53%) rename src/Snap.Hutao/Snap.Hutao/ViewModel/{Main => }/MainViewModel.cs (73%) 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 index ec85335e..d765f827 100644 --- a/src/Snap.Hutao/Snap.Hutao/Message/BackgroundImageTypeChangedMessage.cs +++ b/src/Snap.Hutao/Snap.Hutao/Message/BackgroundImageTypeChangedMessage.cs @@ -3,6 +3,4 @@ namespace Snap.Hutao.Message; -internal sealed class BackgroundImageTypeChangedMessage -{ -} +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.cs b/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml.cs index 8b3864da..1838d7be 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml.cs @@ -34,14 +34,37 @@ internal sealed partial class MainView : UserControl DataContext = mainViewModel; InitializeComponent(); - mainViewModel.Initialize(BackgroundImagePresenter); + 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/Main/IMainViewModelInitialization.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/IMainViewModelInitialization.cs similarity index 53% rename from src/Snap.Hutao/Snap.Hutao/ViewModel/Main/IMainViewModelInitialization.cs rename to src/Snap.Hutao/Snap.Hutao/ViewModel/IMainViewModelInitialization.cs index 6dcf8b04..0fb1d37d 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Main/IMainViewModelInitialization.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/IMainViewModelInitialization.cs @@ -1,11 +1,9 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using Microsoft.UI.Xaml.Controls; - -namespace Snap.Hutao.ViewModel.Main; +namespace Snap.Hutao.ViewModel; internal interface IMainViewModelInitialization { - void Initialize(Image backgroundImagePresenter); + void Initialize(IBackgroundImagePresenterAccessor accessor); } diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Main/MainViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/MainViewModel.cs similarity index 73% rename from src/Snap.Hutao/Snap.Hutao/ViewModel/Main/MainViewModel.cs rename to src/Snap.Hutao/Snap.Hutao/ViewModel/MainViewModel.cs index 4235565d..fe0c1887 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Main/MainViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/MainViewModel.cs @@ -9,7 +9,6 @@ using Snap.Hutao.Control.Animation; using Snap.Hutao.Control.Theme; using Snap.Hutao.Message; using Snap.Hutao.Service.BackgroundImage; -using Snap.Hutao.ViewModel.Main; namespace Snap.Hutao.ViewModel; @@ -21,21 +20,26 @@ internal sealed partial class MainViewModel : Abstraction.ViewModel, IMainViewMo private readonly ITaskContext taskContext; private BackgroundImage? previousBackgroundImage; - private Image backgroundImagePresenter; + private Image? backgroundImagePresenter; - public void Initialize(Image backgroundImagePresenter) + public void Initialize(IBackgroundImagePresenterAccessor accessor) { - this.backgroundImagePresenter = backgroundImagePresenter; + backgroundImagePresenter = accessor.BackgroundImagePresenter; } public void Receive(BackgroundImageTypeChangedMessage message) { - UpdateBackgroundAsync(backgroundImagePresenter).SafeForget(); + 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) @@ -50,11 +54,11 @@ internal sealed partial class MainViewModel : Abstraction.ViewModel, IMainViewMo 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() @@ -63,7 +67,7 @@ internal sealed partial class MainViewModel : Abstraction.ViewModel, IMainViewMo duration: ControlAnimationConstants.ImageOpacityFadeInOut, easingType: EasingType.Quartic, easingMode: EasingMode.EaseInOut) - .StartAsync(presenter) + .StartAsync(backgroundImagePresenter) .ConfigureAwait(true); } }