From 23f3e5df77f6413182b35bab931a89e800f4b57e Mon Sep 17 00:00:00 2001 From: DismissedLight <1686188646@qq.com> Date: Mon, 9 Jan 2023 12:15:11 +0800 Subject: [PATCH] ContentDialogFactory --- .../Extension/ContentDialogExtensions.cs | 14 --- .../EnumerableExtension.Dictionary.cs | 28 ++++++ .../Extension/EnumerableExtension.cs | 76 ++------------- .../Abstraction/IContentDialogFactory.cs | 36 +++++++ .../Factory/ContentDialogFactory.cs | 67 +++++++++++++ .../Model/Binding/User/UserAndRole.cs | 18 ++++ .../GachaLogUrlManualInputProvider.cs | 3 +- .../Snap.Hutao/Service/Game/GameService.cs | 6 +- src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj | 6 -- .../AchievementArchiveCreateDialog.xaml.cs | 5 +- .../Dialog/AchievementImportDialog.xaml.cs | 6 +- .../View/Dialog/AdoptCalculatorDialog.xaml.cs | 4 +- .../View/Dialog/AvatarInfoQueryDialog.xaml | 21 ----- .../View/Dialog/AvatarInfoQueryDialog.xaml.cs | 53 ----------- .../Dialog/CommunityGameRecordDialog.xaml.cs | 4 +- .../Dialog/CultivateProjectDialog.xaml.cs | 4 +- .../CultivatePromotionDeltaDialog.xaml.cs | 6 +- .../DailyNoteNotificationDialog.xaml.cs | 5 +- .../DailyNoteVerificationDialog.xaml.cs | 21 ++--- .../View/Dialog/GachaLogImportDialog.xaml.cs | 7 +- .../GachaLogRefreshProgressDialog.xaml.cs | 4 +- .../View/Dialog/GachaLogUrlDialog.xaml.cs | 4 +- .../View/Dialog/GameAccountNameDialog.xaml.cs | 4 +- .../View/Dialog/LoginMihoyoBBSDialog.xaml.cs | 5 +- .../View/Dialog/SignInWebViewDialog.xaml.cs | 4 +- .../Snap.Hutao/View/Dialog/UserDialog.xaml.cs | 5 +- .../Snap.Hutao/View/Page/AchievementPage.xaml | 2 - .../View/Page/AvatarPropertyPage.xaml | 93 +++++++++++++------ .../Snap.Hutao/View/Page/DailyNotePage.xaml | 7 +- .../Snap.Hutao/View/Page/TestPage.xaml | 4 + .../ViewModel/AchievementViewModel.cs | 78 ++++------------ .../ViewModel/AvatarPropertyViewModel.cs | 3 +- .../ViewModel/CultivationViewModel.cs | 3 +- .../ViewModel/DailyNoteViewModel.cs | 8 +- .../Snap.Hutao/ViewModel/GachaLogViewModel.cs | 83 +++-------------- .../Snap.Hutao/ViewModel/SettingViewModel.cs | 5 +- .../Snap.Hutao/ViewModel/TestViewModel.cs | 17 +++- .../Snap.Hutao/ViewModel/UserViewModel.cs | 3 +- .../Snap.Hutao/ViewModel/WelcomeViewModel.cs | 1 + .../ViewModel/WikiAvatarViewModel.cs | 3 +- .../ViewModel/WikiWeaponViewModel.cs | 3 +- 41 files changed, 330 insertions(+), 399 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Factory/Abstraction/IContentDialogFactory.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Factory/ContentDialogFactory.cs delete mode 100644 src/Snap.Hutao/Snap.Hutao/View/Dialog/AvatarInfoQueryDialog.xaml delete mode 100644 src/Snap.Hutao/Snap.Hutao/View/Dialog/AvatarInfoQueryDialog.xaml.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Extension/ContentDialogExtensions.cs b/src/Snap.Hutao/Snap.Hutao/Control/Extension/ContentDialogExtensions.cs index 16d44dec..efd4fced 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Extension/ContentDialogExtensions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Extension/ContentDialogExtensions.cs @@ -1,7 +1,6 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; namespace Snap.Hutao.Control.Extension; @@ -11,19 +10,6 @@ namespace Snap.Hutao.Control.Extension; /// internal static class ContentDialogExtensions { - /// - /// 针对窗口进行初始化 - /// - /// 对话框 - /// 窗口 - /// 初始化完成的对话框 - public static ContentDialog InitializeWithWindow(this ContentDialog contentDialog, Window window) - { - contentDialog.XamlRoot = window.Content.XamlRoot; - - return contentDialog; - } - /// /// 阻止用户交互 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.Dictionary.cs b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.Dictionary.cs index 528121e3..1079297a 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.Dictionary.cs +++ b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.Dictionary.cs @@ -77,4 +77,32 @@ public static partial class EnumerableExtension return false; } + + /// + public static Dictionary ToDictionaryOverride(this IEnumerable source, Func keySelector) + where TKey : notnull + { + Dictionary dictionary = new(); + + foreach (TSource value in source) + { + dictionary[keySelector(value)] = value; + } + + return dictionary; + } + + /// + public static Dictionary ToDictionaryOverride(this IEnumerable source, Func keySelector, Func valueSelector) + where TKey : notnull + { + Dictionary dictionary = new(); + + foreach (TSource value in source) + { + dictionary[keySelector(value)] = valueSelector(value); + } + + return dictionary; + } } diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs index 149d911b..583b1b32 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs @@ -1,6 +1,8 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using System.Collections.ObjectModel; + namespace Snap.Hutao.Extension; /// @@ -8,26 +10,6 @@ namespace Snap.Hutao.Extension; /// public static partial class EnumerableExtension { - /// - /// 计数 - /// - /// 源类型 - /// 计数的键类型 - /// 源 - /// 键选择器 - /// 计数表 - public static IEnumerable> CountBy(this IEnumerable source, Func keySelector) - where TKey : notnull, IEquatable - { - CounterInt32 counter = new(); - foreach (TSource item in source) - { - counter.Increase(keySelector(item)); - } - - return counter; - } - /// /// 如果传入集合不为空则原路返回, /// 如果传入集合为空返回一个集合的空集 @@ -64,56 +46,14 @@ public static partial class EnumerableExtension return source.FirstOrDefault(predicate) ?? source.FirstOrDefault(); } - /// - public static Dictionary ToDictionaryOverride(this IEnumerable source, Func keySelector) - where TKey : notnull - { - Dictionary dictionary = new(); - - foreach (TSource value in source) - { - dictionary[keySelector(value)] = value; - } - - return dictionary; - } - - /// - public static Dictionary ToDictionaryOverride(this IEnumerable source, Func keySelector, Func valueSelector) - where TKey : notnull - { - Dictionary dictionary = new(); - - foreach (TSource value in source) - { - dictionary[keySelector(value)] = valueSelector(value); - } - - return dictionary; - } - /// - /// 表示一个对 类型的计数器 + /// 转换到 /// - /// 待计数的类型 - private class CounterInt32 : Dictionary - where TItem : notnull, IEquatable + /// 类型 + /// 源 + /// + public static ObservableCollection ToObservableCollection(this IEnumerable source) { - /// - /// 增加计数器 - /// - /// 物品 - public void Increase(TItem? item) - { - if (item != null) - { - if (!ContainsKey(item)) - { - this[item] = 0; - } - - this[item] += 1; - } - } + return new ObservableCollection(source); } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Factory/Abstraction/IContentDialogFactory.cs b/src/Snap.Hutao/Snap.Hutao/Factory/Abstraction/IContentDialogFactory.cs new file mode 100644 index 00000000..32a88f37 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Factory/Abstraction/IContentDialogFactory.cs @@ -0,0 +1,36 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.UI.Xaml.Controls; + +namespace Snap.Hutao.Factory.Abstraction; + +/// +/// 内容对话框工厂 +/// +internal interface IContentDialogFactory +{ + /// + /// 创建一个新的内容对话框,用于确认 + /// + /// 标题 + /// 内容 + /// 内容对话框 + ContentDialog CreateForConfirm(string title, string content); + + /// + /// 创建一个新的内容对话框,用于确认或取消 + /// + /// 标题 + /// 内容 + /// 默认按钮 + /// 内容对话框 + ContentDialog CreateForConfirmCancel(string title, string content, ContentDialogButton defaultButton = ContentDialogButton.Close); + + /// + /// 创建一个新的内容对话框,用于提示未知的进度 + /// + /// 标题 + /// 内容对话框 + ContentDialog CreateForIndeterminateProgress(string title); +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Factory/ContentDialogFactory.cs b/src/Snap.Hutao/Snap.Hutao/Factory/ContentDialogFactory.cs new file mode 100644 index 00000000..d35a3490 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Factory/ContentDialogFactory.cs @@ -0,0 +1,67 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.UI.Xaml.Controls; +using Snap.Hutao.Factory.Abstraction; + +namespace Snap.Hutao.Factory; + +/// +[Injection(InjectAs.Transient, typeof(IContentDialogFactory))] +internal class ContentDialogFactory : IContentDialogFactory +{ + private readonly MainWindow mainWindow; + + /// + /// 构造一个新的内容对话框工厂 + /// + /// 主窗体 + public ContentDialogFactory(MainWindow mainWindow) + { + this.mainWindow = mainWindow; + } + + /// + public ContentDialog CreateForConfirm(string title, string content) + { + ContentDialog dialog = new() + { + XamlRoot = mainWindow.Content.XamlRoot, + Title = title, + Content = content, + DefaultButton = ContentDialogButton.Primary, + PrimaryButtonText = "确认", + }; + + return dialog; + } + + /// + public ContentDialog CreateForConfirmCancel(string title, string content, ContentDialogButton defaultButton = ContentDialogButton.Close) + { + ContentDialog dialog = new() + { + XamlRoot = mainWindow.Content.XamlRoot, + Title = title, + Content = content, + DefaultButton = defaultButton, + PrimaryButtonText = "确认", + CloseButtonText = "取消", + }; + + return dialog; + } + + /// + public ContentDialog CreateForIndeterminateProgress(string title) + { + ContentDialog dialog = new() + { + XamlRoot = mainWindow.Content.XamlRoot, + Title = title, + Content = new ProgressBar() { IsIndeterminate = true }, + }; + + return dialog; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/UserAndRole.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/UserAndRole.cs index 11f4b556..be27cf86 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/UserAndRole.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/UserAndRole.cs @@ -41,4 +41,22 @@ public class UserAndRole { return new UserAndRole(user.Entity, user.SelectedUserGameRole!); } + + /// + /// 尝试转换到用户与角色 + /// + /// 用户 + /// 用户与角色 + /// 是否转换成功 + public static bool TryFromUser(User? user, [NotNullWhen(true)]out UserAndRole? userAndRole) + { + if (user != null && user.SelectedUserGameRole != null) + { + userAndRole = FromUser(user); + return true; + } + + userAndRole = null; + return false; + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UrlProvider/GachaLogUrlManualInputProvider.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UrlProvider/GachaLogUrlManualInputProvider.cs index bfc4efff..0af24bde 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UrlProvider/GachaLogUrlManualInputProvider.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UrlProvider/GachaLogUrlManualInputProvider.cs @@ -17,8 +17,7 @@ internal class GachaLogUrlManualInputProvider : IGachaLogUrlProvider /// public async Task> GetQueryAsync() { - MainWindow mainWindow = Ioc.Default.GetRequiredService(); - ValueResult result = await new GachaLogUrlDialog(mainWindow).GetInputUrlAsync().ConfigureAwait(false); + ValueResult result = await new GachaLogUrlDialog().GetInputUrlAsync().ConfigureAwait(false); if (result.IsOk) { diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs index d4b2c2fe..072d8a1f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs @@ -304,8 +304,7 @@ internal class GameService : IGameService, IDisposable if (account == null) { - MainWindow mainWindow = Ioc.Default.GetRequiredService(); - (bool isOk, string name) = await new GameAccountNameDialog(mainWindow).GetInputNameAsync().ConfigureAwait(false); + (bool isOk, string name) = await new GameAccountNameDialog().GetInputNameAsync().ConfigureAwait(false); if (isOk) { @@ -349,8 +348,7 @@ internal class GameService : IGameService, IDisposable /// public async ValueTask ModifyGameAccountAsync(GameAccount gameAccount) { - MainWindow mainWindow = Ioc.Default.GetRequiredService(); - (bool isOk, string name) = await new GameAccountNameDialog(mainWindow).GetInputNameAsync().ConfigureAwait(true); + (bool isOk, string name) = await new GameAccountNameDialog().GetInputNameAsync().ConfigureAwait(true); if (isOk) { diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj index 36a31b6d..7183b8c8 100644 --- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj +++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj @@ -75,7 +75,6 @@ - @@ -306,11 +305,6 @@ MSBuild:Compile - - - MSBuild:Compile - - MSBuild:Compile diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementArchiveCreateDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementArchiveCreateDialog.xaml.cs index 4a46990f..eb26abb0 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementArchiveCreateDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementArchiveCreateDialog.xaml.cs @@ -15,10 +15,10 @@ public sealed partial class AchievementArchiveCreateDialog : ContentDialog /// 构造一个新的成就存档创建对话框 /// /// 窗体 - public AchievementArchiveCreateDialog(Window window) + public AchievementArchiveCreateDialog() { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; + XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot; } /// @@ -27,6 +27,7 @@ public sealed partial class AchievementArchiveCreateDialog : ContentDialog /// 输入的结果 public async Task> GetInputAsync() { + await ThreadHelper.SwitchToMainThreadAsync(); ContentDialogResult result = await ShowAsync(); string text = InputText.Text ?? string.Empty; diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementImportDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementImportDialog.xaml.cs index 72378a19..3ccea45b 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementImportDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/AchievementImportDialog.xaml.cs @@ -19,12 +19,11 @@ public sealed partial class AchievementImportDialog : ContentDialog /// /// 构造一个新的成就对话框 /// - /// 呈现的父窗口 /// uiaf数据 - public AchievementImportDialog(Window window, UIAF uiaf) + public AchievementImportDialog(UIAF uiaf) { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; + XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot; UIAF = uiaf; } @@ -43,6 +42,7 @@ public sealed partial class AchievementImportDialog : ContentDialog /// 导入选项 public async Task> GetImportStrategyAsync() { + await ThreadHelper.SwitchToMainThreadAsync(); ContentDialogResult result = await ShowAsync(); ImportStrategy strategy = (ImportStrategy)ImportModeSelector.SelectedIndex; diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AdoptCalculatorDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/AdoptCalculatorDialog.xaml.cs index 98e3815e..2ac99190 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AdoptCalculatorDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/AdoptCalculatorDialog.xaml.cs @@ -24,11 +24,11 @@ public sealed partial class AdoptCalculatorDialog : ContentDialog /// һµɼԻ /// /// - public AdoptCalculatorDialog(Window window) + public AdoptCalculatorDialog() { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; scope = Ioc.Default.CreateScope(); + XamlRoot = scope.ServiceProvider.GetRequiredService().Content.XamlRoot; } private void OnGridLoaded(object sender, RoutedEventArgs e) diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AvatarInfoQueryDialog.xaml b/src/Snap.Hutao/Snap.Hutao/View/Dialog/AvatarInfoQueryDialog.xaml deleted file mode 100644 index 42e2373d..00000000 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AvatarInfoQueryDialog.xaml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AvatarInfoQueryDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/AvatarInfoQueryDialog.xaml.cs deleted file mode 100644 index 7febfcb2..00000000 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/AvatarInfoQueryDialog.xaml.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; -using Snap.Hutao.Web.Hoyolab; - -namespace Snap.Hutao.View.Dialog; - -/// -/// 角色信息查询UID对话框 -/// -public sealed partial class AvatarInfoQueryDialog : ContentDialog -{ - /// - /// 构造一个新的角色信息查询UID对话框 - /// - /// 窗口 - public AvatarInfoQueryDialog(Window window) - { - InitializeComponent(); - XamlRoot = window.Content.XamlRoot; - } - - /// - /// 获取玩家UID - /// - /// 玩家UID - public async Task> GetPlayerUidAsync() - { - ContentDialogResult result = await ShowAsync(); - - bool isOk = result == ContentDialogResult.Primary; - - if (InputText.Text.Length != 9) - { - return new(false, default); - } - - return new(isOk, isOk && InputText.Text.Length == 9 ? new(InputText.Text) : default); - } - - private void InputTextChanged(object sender, TextChangedEventArgs e) - { - bool inputValid = string.IsNullOrEmpty(InputText.Text) && InputText.Text.Length == 9; - - (PrimaryButtonText, IsPrimaryButtonEnabled) = inputValid switch - { - true => ("请输入正确的UID", false), - false => ("确认", true), - }; - } -} diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/CommunityGameRecordDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/CommunityGameRecordDialog.xaml.cs index 8bf6f386..dc5d6719 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/CommunityGameRecordDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/CommunityGameRecordDialog.xaml.cs @@ -24,11 +24,11 @@ public sealed partial class CommunityGameRecordDialog : ContentDialog /// һµϷ¼Ի /// /// - public CommunityGameRecordDialog(MainWindow window) + public CommunityGameRecordDialog() { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; scope = Ioc.Default.CreateScope(); + XamlRoot = scope.ServiceProvider.GetRequiredService().Content.XamlRoot; } private void OnGridLoaded(object sender, RoutedEventArgs e) diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/CultivateProjectDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/CultivateProjectDialog.xaml.cs index 082154c4..6691ddc5 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/CultivateProjectDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/CultivateProjectDialog.xaml.cs @@ -17,10 +17,10 @@ public sealed partial class CultivateProjectDialog : ContentDialog /// һµɼƻԻ /// /// - public CultivateProjectDialog(Window window) + public CultivateProjectDialog() { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; + XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot; } /// diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/CultivatePromotionDeltaDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/CultivatePromotionDeltaDialog.xaml.cs index 18fb7669..53fa5415 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/CultivatePromotionDeltaDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/CultivatePromotionDeltaDialog.xaml.cs @@ -19,13 +19,12 @@ public sealed partial class CultivatePromotionDeltaDialog : ContentDialog /// /// һµɼԻ /// - /// /// ɫ /// - public CultivatePromotionDeltaDialog(Window window, ICalculableAvatar? avatar, ICalculableWeapon? weapon) + public CultivatePromotionDeltaDialog(ICalculableAvatar? avatar, ICalculableWeapon? weapon) { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; + XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot; DataContext = this; Avatar = avatar; Weapon = weapon; @@ -55,6 +54,7 @@ public sealed partial class CultivatePromotionDeltaDialog : ContentDialog /// public async Task> GetPromotionDeltaAsync() { + await ThreadHelper.SwitchToMainThreadAsync(); ContentDialogResult result = await ShowAsync(); if (result == ContentDialogResult.Primary) diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/DailyNoteNotificationDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/DailyNoteNotificationDialog.xaml.cs index 498203ca..cb853eba 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/DailyNoteNotificationDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/DailyNoteNotificationDialog.xaml.cs @@ -15,12 +15,11 @@ public sealed partial class DailyNoteNotificationDialog : ContentDialog /// /// һµʵʱ֪ͨöԻ /// - /// /// ʵʱ - public DailyNoteNotificationDialog(Window window, DailyNoteEntry entry) + public DailyNoteNotificationDialog(DailyNoteEntry entry) { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; + XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot; DataContext = entry; } } diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/DailyNoteVerificationDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/DailyNoteVerificationDialog.xaml.cs index 2e6768d3..ab89d2bb 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/DailyNoteVerificationDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/DailyNoteVerificationDialog.xaml.cs @@ -5,9 +5,8 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.Web.WebView2.Core; -using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Binding.User; using Snap.Hutao.Web.Bridge; -using Snap.Hutao.Web.Hoyolab; namespace Snap.Hutao.View.Dialog; @@ -17,23 +16,20 @@ namespace Snap.Hutao.View.Dialog; public sealed partial class DailyNoteVerificationDialog : ContentDialog { private readonly IServiceScope scope; - private readonly User user; - private readonly PlayerUid uid; + private readonly UserAndRole userAndRole; + [SuppressMessage("", "IDE0052")] private DailyNoteJsInterface? dailyNoteJsInterface; /// /// һµʵʱ֤Ի /// - /// - /// û - /// uid - public DailyNoteVerificationDialog(Window window, User user, PlayerUid uid) + /// ûɫ + public DailyNoteVerificationDialog(UserAndRole userAndRole) { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; - this.user = user; - this.uid = uid; + XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot; + this.userAndRole = userAndRole; scope = Ioc.Default.CreateScope(); } @@ -47,10 +43,11 @@ public sealed partial class DailyNoteVerificationDialog : ContentDialog await WebView.EnsureCoreWebView2Async(); CoreWebView2 coreWebView2 = WebView.CoreWebView2; + Model.Entity.User user = userAndRole.User; coreWebView2.SetCookie(user.CookieToken, user.Ltoken, null).SetMobileUserAgent(); dailyNoteJsInterface = new(coreWebView2, scope.ServiceProvider); - string query = $"?role_id={uid.Value}&server={uid.Region}"; + string query = $"?role_id={userAndRole.Role.GameUid}&server={userAndRole.Role.Region}"; coreWebView2.Navigate($"https://webstatic.mihoyo.com/app/community-game-records/index.html?bbs_presentation_style=fullscreen#/ys/daily/{query}"); } diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogImportDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogImportDialog.xaml.cs index db23bdbe..62c5ac65 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogImportDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogImportDialog.xaml.cs @@ -18,12 +18,12 @@ public sealed partial class GachaLogImportDialog : ContentDialog /// /// 构造一个新的祈愿记录导入对话框 /// - /// 呈现的父窗口 /// uigf数据 - public GachaLogImportDialog(Window window, UIGF uigf) + /// + public GachaLogImportDialog(UIGF uigf) { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; + XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot; UIGF = uigf; } @@ -42,6 +42,7 @@ public sealed partial class GachaLogImportDialog : ContentDialog /// 是否导入 public async Task GetShouldImportAsync() { + await ThreadHelper.SwitchToMainThreadAsync(); return await ShowAsync() == ContentDialogResult.Primary; } } diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogRefreshProgressDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogRefreshProgressDialog.xaml.cs index de4dfb1d..c4c3b2ae 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogRefreshProgressDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogRefreshProgressDialog.xaml.cs @@ -22,10 +22,10 @@ public sealed partial class GachaLogRefreshProgressDialog : ContentDialog /// 构造一个新的对话框 /// /// 窗体 - public GachaLogRefreshProgressDialog(Window window) + public GachaLogRefreshProgressDialog() { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; + XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot; } /// diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogUrlDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogUrlDialog.xaml.cs index 85417aa0..fdd9ee20 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogUrlDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogUrlDialog.xaml.cs @@ -15,10 +15,10 @@ public sealed partial class GachaLogUrlDialog : ContentDialog /// 初始化一个新的祈愿记录Url对话框 /// /// 窗体 - public GachaLogUrlDialog(Window window) + public GachaLogUrlDialog() { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; + XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot; } /// diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/GameAccountNameDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/GameAccountNameDialog.xaml.cs index d925a2ae..e047b7d0 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/GameAccountNameDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/GameAccountNameDialog.xaml.cs @@ -15,10 +15,10 @@ public sealed partial class GameAccountNameDialog : ContentDialog /// 构造一个新的游戏账号命名对话框 /// /// 窗体 - public GameAccountNameDialog(Window window) + public GameAccountNameDialog() { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; + XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot; } /// diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml.cs index 128e1b40..f3a78b66 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml.cs @@ -15,10 +15,10 @@ public sealed partial class LoginMihoyoBBSDialog : ContentDialog /// һµĵ¼Ի /// /// - public LoginMihoyoBBSDialog(MainWindow window) + public LoginMihoyoBBSDialog() { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; + XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot; } /// @@ -27,6 +27,7 @@ public sealed partial class LoginMihoyoBBSDialog : ContentDialog /// ˺ public async Task>> GetInputAccountPasswordAsync() { + await ThreadHelper.SwitchToMainThreadAsync(); bool result = await ShowAsync() == ContentDialogResult.Primary; Dictionary data = new() diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/SignInWebViewDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/SignInWebViewDialog.xaml.cs index 8da9a813..bc6ef2e2 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/SignInWebViewDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/SignInWebViewDialog.xaml.cs @@ -23,11 +23,11 @@ public sealed partial class SignInWebViewDialog : ContentDialog /// һµǩҳͼԻ /// /// - public SignInWebViewDialog(MainWindow window) + public SignInWebViewDialog() { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; scope = Ioc.Default.CreateScope(); + XamlRoot = scope.ServiceProvider.GetRequiredService().Content.XamlRoot; } private void OnGridLoaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/UserDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/UserDialog.xaml.cs index 6a7db6c0..8c47f9fa 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/UserDialog.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/UserDialog.xaml.cs @@ -15,10 +15,10 @@ public sealed partial class UserDialog : ContentDialog /// 构造一个新的添加用户对话框 /// /// 呈现的父窗口 - public UserDialog(Window window) + public UserDialog() { InitializeComponent(); - XamlRoot = window.Content.XamlRoot; + XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot; } /// @@ -27,6 +27,7 @@ public sealed partial class UserDialog : ContentDialog /// 输入的结果 public async Task> GetInputCookieAsync() { + await ThreadHelper.SwitchToMainThreadAsync(); ContentDialogResult result = await ShowAsync(); string cookie = InputText.Text; diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/AchievementPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/AchievementPage.xaml index 5091ce08..3671b0c7 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/AchievementPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/AchievementPage.xaml @@ -144,8 +144,6 @@ Style="{StaticResource CaptionTextBlockStyle}" Text="{Binding FinishDescription}"/> diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/AvatarPropertyPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/AvatarPropertyPage.xaml index 8ecf1438..01d3fa57 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/AvatarPropertyPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/AvatarPropertyPage.xaml @@ -62,7 +62,7 @@ @@ -141,12 +141,7 @@ MaxWidth="800" HorizontalAlignment="Left" Background="Transparent"> - + @@ -483,35 +478,63 @@ - - - + + - - + + + + + + + + + + + + + + + + + + - + - - - - + + + + + + + + - - - - - @@ -526,9 +549,16 @@ - - - + + + + + + + @@ -545,9 +575,16 @@ - - - + + + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml index 943b3996..eabc59d0 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/DailyNotePage.xaml @@ -143,11 +143,8 @@ - + Style="{StaticResource BorderCardStyle}"> + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/TestPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/TestPage.xaml index 27b333fd..0a2af1be 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/TestPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/TestPage.xaml @@ -25,6 +25,10 @@ public ICommand RefreshByManualInputCommand { get; } - /// - /// 从 UIGF Excel 导入命令 - /// - public ICommand ImportFromUIGFExcelCommand { get; } - /// /// 从 UIGF Json 导入命令 /// public ICommand ImportFromUIGFJsonCommand { get; } - /// - /// 导出到 UIGF Excel 命令 - /// - public ICommand ExportToUIGFExcelCommand { get; } - /// /// 导出到 UIGF Json 命令 /// @@ -162,21 +153,6 @@ internal class GachaLogViewModel : ObservableObject, ISupportCancellation /// public ICommand RemoveArchiveCommand { get; } - [ThreadAccess(ThreadAccessState.MainThread)] - private static Task ShowImportResultDialogAsync(string title, string message) - { - ContentDialog dialog = new() - { - Title = title, - Content = message, - PrimaryButtonText = "确认", - DefaultButton = ContentDialogButton.Primary, - }; - - MainWindow mainWindow = Ioc.Default.GetRequiredService(); - return dialog.InitializeWithWindow(mainWindow).ShowAsync().AsTask(); - } - private async Task OpenUIAsync() { if (await gachaLogService.InitializeAsync().ConfigureAwait(true)) @@ -216,9 +192,7 @@ internal class GachaLogViewModel : ObservableObject, ISupportCancellation { RefreshStrategy strategy = IsAggressiveRefresh ? RefreshStrategy.AggressiveMerge : RefreshStrategy.LazyMerge; - MainWindow mainWindow = Ioc.Default.GetRequiredService(); - await ThreadHelper.SwitchToMainThreadAsync(); - GachaLogRefreshProgressDialog dialog = new(mainWindow); + GachaLogRefreshProgressDialog dialog = new(); IAsyncDisposable dialogHider = await dialog.BlockAsync().ConfigureAwait(false); Progress progress = new(dialog.OnReport); bool authkeyValid = await gachaLogService.RefreshGachaLogAsync(query, strategy, progress, default).ConfigureAwait(false); @@ -246,11 +220,6 @@ internal class GachaLogViewModel : ObservableObject, ISupportCancellation } } - private async Task ImportFromUIGFExcelAsync() - { - await Task.Yield(); - } - private async Task ImportFromUIGFJsonAsync() { FileOpenPicker picker = pickerFactory.GetFileOpenPicker(PickerLocationId.Desktop, "导入", ".json"); @@ -266,16 +235,11 @@ internal class GachaLogViewModel : ObservableObject, ISupportCancellation else { await ThreadHelper.SwitchToMainThreadAsync(); - await ShowImportResultDialogAsync("导入失败", "文件的数据格式不正确").ConfigureAwait(false); + await contentDialogFactory.CreateForConfirm("导入失败", "文件的数据格式不正确").ShowAsync(); } } } - private async Task ExportToUIGFExcelAsync() - { - await Task.Yield(); - } - private async Task ExportToUIGFJsonAsync() { if (SelectedArchive == null) @@ -297,11 +261,11 @@ internal class GachaLogViewModel : ObservableObject, ISupportCancellation await ThreadHelper.SwitchToMainThreadAsync(); if (isOk) { - await ShowImportResultDialogAsync("导出成功", "成功保存到指定位置").ConfigureAwait(false); + await contentDialogFactory.CreateForConfirm("导出成功", "成功保存到指定位置").ShowAsync(); } else { - await ShowImportResultDialogAsync("导出失败", "写入文件时遇到问题").ConfigureAwait(false); + await contentDialogFactory.CreateForConfirm("导出失败", "写入文件时遇到问题").ShowAsync(); } } } @@ -310,17 +274,9 @@ internal class GachaLogViewModel : ObservableObject, ISupportCancellation { if (Archives != null && SelectedArchive != null) { - ContentDialog dialog = new() - { - Title = $"确定要删除存档 {SelectedArchive.Uid} 吗?", - Content = "该操作是不可逆的,该存档和其内的所有祈愿数据会丢失。", - PrimaryButtonText = "确认", - CloseButtonText = "取消", - DefaultButton = ContentDialogButton.Close, - }; - - MainWindow mainWindow = Ioc.Default.GetRequiredService(); - ContentDialogResult result = await dialog.InitializeWithWindow(mainWindow).ShowAsync(); + ContentDialogResult result = await contentDialogFactory + .CreateForConfirmCancel($"确定要删除存档 {SelectedArchive.Uid} 吗?", "该操作是不可逆的,该存档和其内的所有祈愿数据会丢失。") + .ShowAsync(); if (result == ContentDialogResult.Primary) { @@ -332,7 +288,6 @@ internal class GachaLogViewModel : ObservableObject, ISupportCancellation } } - [ThreadAccess(ThreadAccessState.MainThread)] private void SetSelectedArchiveAndUpdateStatistics(GachaArchive? archive, bool forceUpdate = false) { bool changed = false; @@ -357,7 +312,6 @@ internal class GachaLogViewModel : ObservableObject, ISupportCancellation } } - [ThreadAccess(ThreadAccessState.MainThread)] private async Task UpdateStatisticsAsync(GachaArchive? archive) { GachaStatistics temp = await gachaLogService.GetStatisticsAsync(archive).ConfigureAwait(false); @@ -365,22 +319,13 @@ internal class GachaLogViewModel : ObservableObject, ISupportCancellation Statistics = temp; } - [ThreadAccess(ThreadAccessState.AnyThread)] private async Task TryImportUIGFInternalAsync(UIGF uigf) { if (uigf.IsCurrentVersionSupported()) { - MainWindow mainWindow = Ioc.Default.GetRequiredService(); - await ThreadHelper.SwitchToMainThreadAsync(); - if (await new GachaLogImportDialog(mainWindow, uigf).GetShouldImportAsync().ConfigureAwait(true)) + if (await new GachaLogImportDialog(uigf).GetShouldImportAsync().ConfigureAwait(true)) { - ContentDialog importingDialog = new() - { - Title = "导入祈愿记录中", - Content = new ProgressBar() { IsIndeterminate = true }, - }; - - await using (await importingDialog.InitializeWithWindow(mainWindow).BlockAsync().ConfigureAwait(false)) + await using (await contentDialogFactory.CreateForIndeterminateProgress("导入祈愿记录中").BlockAsync().ConfigureAwait(false)) { await gachaLogService.ImportFromUIGFAsync(uigf.List, uigf.Info.Uid).ConfigureAwait(false); } @@ -394,7 +339,7 @@ internal class GachaLogViewModel : ObservableObject, ISupportCancellation else { await ThreadHelper.SwitchToMainThreadAsync(); - await ShowImportResultDialogAsync("导入失败", "数据的 UIGF 版本过低,无法导入").ConfigureAwait(false); + await contentDialogFactory.CreateForConfirm("导入失败", "数据的 UIGF 版本过低,无法导入").ShowAsync(); } return false; diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs index 90b41752..d90eb577 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs @@ -207,10 +207,9 @@ internal class SettingViewModel : ObservableObject } } - private async Task ShowSignInWebViewDialogAsync() + private Task ShowSignInWebViewDialogAsync() { - MainWindow mainWindow = Ioc.Default.GetRequiredService(); - await new SignInWebViewDialog(mainWindow).ShowAsync(); + return new SignInWebViewDialog().ShowAsync().AsTask(); } private async Task DebugThrowExceptionAsync() diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/TestViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/TestViewModel.cs index 561bae87..74372379 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/TestViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/TestViewModel.cs @@ -29,6 +29,7 @@ internal class TestViewModel : ObservableObject, ISupportCancellation public TestViewModel(IAsyncRelayCommandFactory asyncRelayCommandFactory) { ShowCommunityGameRecordDialogCommand = asyncRelayCommandFactory.Create(ShowCommunityGameRecordDialogAsync); + ShowAdoptCalculatorDialogCommand = asyncRelayCommandFactory.Create(ShowAdoptCalculatorDialogAsync); DangerousLoginMihoyoBbsCommand = asyncRelayCommandFactory.Create(DangerousLoginMihoyoBbsAsync); DownloadStaticFileCommand = asyncRelayCommandFactory.Create(DownloadStaticFileAsync); } @@ -41,6 +42,11 @@ internal class TestViewModel : ObservableObject, ISupportCancellation /// public ICommand ShowCommunityGameRecordDialogCommand { get; } + /// + /// 打开养成计算对话框命令 + /// + public ICommand ShowAdoptCalculatorDialogCommand { get; } + /// /// Dangerous 登录米游社命令 /// @@ -53,14 +59,17 @@ internal class TestViewModel : ObservableObject, ISupportCancellation private async Task ShowCommunityGameRecordDialogAsync() { - CommunityGameRecordDialog dialog = ActivatorUtilities.CreateInstance(Ioc.Default); - await dialog.ShowAsync(); + await new CommunityGameRecordDialog().ShowAsync(); + } + + private async Task ShowAdoptCalculatorDialogAsync() + { + await new AdoptCalculatorDialog().ShowAsync(); } private async Task DangerousLoginMihoyoBbsAsync() { - LoginMihoyoBBSDialog dialog = ActivatorUtilities.CreateInstance(Ioc.Default); - (bool isOk, Dictionary? data) = await dialog.GetInputAccountPasswordAsync().ConfigureAwait(false); + (bool isOk, Dictionary? data) = await new LoginMihoyoBBSDialog().GetInputAccountPasswordAsync().ConfigureAwait(false); if (isOk) { diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/UserViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/UserViewModel.cs index 5c2fddbd..deae1c04 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/UserViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/UserViewModel.cs @@ -107,8 +107,7 @@ internal class UserViewModel : ObservableObject private async Task AddUserAsync() { // Get cookie from user input - MainWindow mainWindow = Ioc.Default.GetRequiredService(); - ValueResult result = await new UserDialog(mainWindow).GetInputCookieAsync().ConfigureAwait(false); + ValueResult result = await new UserDialog().GetInputCookieAsync().ConfigureAwait(false); // User confirms the input if (result.IsOk) diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/WelcomeViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/WelcomeViewModel.cs index 80c498cd..dfac990a 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/WelcomeViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/WelcomeViewModel.cs @@ -71,6 +71,7 @@ internal class WelcomeViewModel : ObservableObject downloadSummaries.Add(new(serviceProvider, "成就图标", "AchievementIcon")); downloadSummaries.Add(new(serviceProvider, "物品图标", "ItemIcon")); downloadSummaries.Add(new(serviceProvider, "元素图标", "IconElement")); + downloadSummaries.Add(new(serviceProvider, "圣遗物图标", "RelicIcon")); } DownloadSummaries = new(downloadSummaries); diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiAvatarViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiAvatarViewModel.cs index 6b923018..28073374 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiAvatarViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiAvatarViewModel.cs @@ -129,8 +129,7 @@ internal class WikiAvatarViewModel : ObservableObject if (userService.Current != null) { - MainWindow mainWindow = Ioc.Default.GetRequiredService(); - (bool isOk, CalcAvatarPromotionDelta delta) = await new CultivatePromotionDeltaDialog(mainWindow, avatar.ToCalculable(), null) + (bool isOk, CalcAvatarPromotionDelta delta) = await new CultivatePromotionDeltaDialog(avatar.ToCalculable(), null) .GetPromotionDeltaAsync() .ConfigureAwait(false); diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiWeaponViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiWeaponViewModel.cs index e4a9edb1..c4e13893 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiWeaponViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/WikiWeaponViewModel.cs @@ -132,8 +132,7 @@ internal class WikiWeaponViewModel : ObservableObject, ISupportCancellation if (userService.Current != null) { - MainWindow mainWindow = Ioc.Default.GetRequiredService(); - (bool isOk, CalcAvatarPromotionDelta delta) = await new CultivatePromotionDeltaDialog(mainWindow, null, weapon.ToCalculable()) + (bool isOk, CalcAvatarPromotionDelta delta) = await new CultivatePromotionDeltaDialog(null, weapon.ToCalculable()) .GetPromotionDeltaAsync() .ConfigureAwait(false);