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 @@
+
+
+
+
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/AchievementViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/AchievementViewModel.cs
index 8550d255..d416a48f 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/AchievementViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/AchievementViewModel.cs
@@ -42,6 +42,7 @@ internal class AchievementViewModel
private readonly IAchievementService achievementService;
private readonly IMetadataService metadataService;
private readonly IInfoBarService infoBarService;
+ private readonly IContentDialogFactory contentDialogFactory;
private readonly JsonSerializerOptions options;
private readonly TaskCompletionSource openUICompletionSource = new();
@@ -64,7 +65,7 @@ internal class AchievementViewModel
/// 信息条服务
/// Json序列化选项
/// 异步命令工厂
- /// 范围工厂
+ /// 内容对话框工厂
/// 消息器
public AchievementViewModel(
IMetadataService metadataService,
@@ -72,11 +73,13 @@ internal class AchievementViewModel
IInfoBarService infoBarService,
JsonSerializerOptions options,
IAsyncRelayCommandFactory asyncRelayCommandFactory,
+ IContentDialogFactory contentDialogFactory,
IMessenger messenger)
{
this.metadataService = metadataService;
this.achievementService = achievementService;
this.infoBarService = infoBarService;
+ this.contentDialogFactory = contentDialogFactory;
this.options = options;
OpenUICommand = asyncRelayCommandFactory.Create(OpenUIAsync);
@@ -241,36 +244,6 @@ internal class AchievementViewModel
return false;
}
- private static Task ShowImportResultDialogAsync(string title, string message)
- {
- MainWindow mainWindow = Ioc.Default.GetRequiredService();
- ContentDialog dialog = new()
- {
- Title = title,
- Content = message,
- PrimaryButtonText = "确认",
- DefaultButton = ContentDialogButton.Primary,
- XamlRoot = mainWindow.Content.XamlRoot,
- };
-
- return dialog.ShowAsync().AsTask();
- }
-
- private static Task ShowImportFailDialogAsync(string message)
- {
- MainWindow mainWindow = Ioc.Default.GetRequiredService();
- ContentDialog dialog = new()
- {
- Title = "导入失败",
- Content = message,
- PrimaryButtonText = "确认",
- DefaultButton = ContentDialogButton.Primary,
- XamlRoot = mainWindow.Content.XamlRoot,
- };
-
- return dialog.ShowAsync().AsTask();
- }
-
private async Task OpenUIAsync()
{
bool metaInitialized = await metadataService.InitializeAsync().ConfigureAwait(false);
@@ -303,8 +276,7 @@ internal class AchievementViewModel
{
if (Archives != null)
{
- MainWindow mainWindow = Ioc.Default.GetRequiredService();
- (bool isOk, string name) = await new AchievementArchiveCreateDialog(mainWindow).GetInputAsync().ConfigureAwait(false);
+ (bool isOk, string name) = await new AchievementArchiveCreateDialog().GetInputAsync().ConfigureAwait(false);
if (isOk)
{
@@ -335,17 +307,9 @@ internal class AchievementViewModel
{
if (Archives != null && SelectedArchive != null)
{
- ContentDialog dialog = new()
- {
- Title = $"确定要删除存档 {SelectedArchive.Name} 吗?",
- Content = "该操作是不可逆的,该存档和其内的所有成就状态会丢失。",
- PrimaryButtonText = "确认",
- CloseButtonText = "取消",
- DefaultButton = ContentDialogButton.Close,
- };
-
- MainWindow mainWindow = Ioc.Default.GetRequiredService();
- ContentDialogResult result = await dialog.InitializeWithWindow(mainWindow).ShowAsync();
+ ContentDialogResult result = await contentDialogFactory
+ .CreateForConfirmCancel($"确定要删除存档 {SelectedArchive.Name} 吗?", "该操作是不可逆的,该存档和其内的所有成就状态会丢失。")
+ .ShowAsync();
if (result == ContentDialogResult.Primary)
{
@@ -408,11 +372,11 @@ internal class AchievementViewModel
await ThreadHelper.SwitchToMainThreadAsync();
if (isOk)
{
- await ShowImportResultDialogAsync("导出成功", "成功保存到指定位置").ConfigureAwait(false);
+ await contentDialogFactory.CreateForConfirm("导出成功", "成功保存到指定位置").ShowAsync();
}
else
{
- await ShowImportResultDialogAsync("导出失败", "写入文件时遇到问题").ConfigureAwait(false);
+ await contentDialogFactory.CreateForConfirm("导出失败", "写入文件时遇到问题").ShowAsync();
}
}
}
@@ -432,7 +396,7 @@ internal class AchievementViewModel
else
{
await ThreadHelper.SwitchToMainThreadAsync();
- await ShowImportFailDialogAsync("数据格式不正确").ConfigureAwait(false);
+ await contentDialogFactory.CreateForConfirm("导入失败", "数据格式不正确").ShowAsync();
}
}
@@ -444,8 +408,8 @@ internal class AchievementViewModel
return;
}
- IPickerFactory pickerFactory = Ioc.Default.GetRequiredService();
- FileOpenPicker picker = pickerFactory.GetFileOpenPicker(PickerLocationId.Desktop, "导入", ".json");
+ FileOpenPicker picker = Ioc.Default.GetRequiredService()
+ .GetFileOpenPicker(PickerLocationId.Desktop, "导入", ".json");
if (await picker.PickSingleFileAsync() is StorageFile file)
{
@@ -459,7 +423,7 @@ internal class AchievementViewModel
else
{
await ThreadHelper.SwitchToMainThreadAsync();
- await ShowImportFailDialogAsync("文件的数据格式不正确").ConfigureAwait(false);
+ await contentDialogFactory.CreateForConfirm("导入失败", "文件的数据格式不正确").ShowAsync();
}
}
}
@@ -481,20 +445,12 @@ internal class AchievementViewModel
{
if (uiaf.IsCurrentVersionSupported())
{
- MainWindow mainWindow = Ioc.Default.GetRequiredService();
- await ThreadHelper.SwitchToMainThreadAsync();
- (bool isOk, ImportStrategy strategy) = await new AchievementImportDialog(mainWindow, uiaf).GetImportStrategyAsync().ConfigureAwait(true);
+ (bool isOk, ImportStrategy strategy) = await new AchievementImportDialog(uiaf).GetImportStrategyAsync().ConfigureAwait(true);
if (isOk)
{
- ContentDialog importingDialog = new()
- {
- Title = "导入成就中",
- Content = new ProgressBar() { IsIndeterminate = true },
- };
-
ImportResult result;
- await using (await importingDialog.InitializeWithWindow(mainWindow).BlockAsync().ConfigureAwait(false))
+ await using (await contentDialogFactory.CreateForIndeterminateProgress("导入成就中").BlockAsync().ConfigureAwait(false))
{
result = await achievementService.ImportFromUIAFAsync(archive, uiaf.List, strategy).ConfigureAwait(false);
}
@@ -507,7 +463,7 @@ internal class AchievementViewModel
else
{
await ThreadHelper.SwitchToMainThreadAsync();
- await ShowImportFailDialogAsync("数据的 UIAF 版本过低,无法导入").ConfigureAwait(false);
+ await contentDialogFactory.CreateForConfirm("导入失败", "数据的 UIAF 版本过低,无法导入").ShowAsync();
}
return false;
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarPropertyViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarPropertyViewModel.cs
index 87d52e09..73460bea 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarPropertyViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarPropertyViewModel.cs
@@ -204,8 +204,7 @@ internal class AvatarPropertyViewModel : ObservableObject, ISupportCancellation
if (userService.Current != null)
{
- MainWindow mainWindow = Ioc.Default.GetRequiredService();
- (bool isOk, CalcAvatarPromotionDelta delta) = await new CultivatePromotionDeltaDialog(mainWindow, avatar.ToCalculable(), avatar.Weapon.ToCalculable())
+ (bool isOk, CalcAvatarPromotionDelta delta) = await new CultivatePromotionDeltaDialog(avatar.ToCalculable(), avatar.Weapon.ToCalculable())
.GetPromotionDeltaAsync()
.ConfigureAwait(false);
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs
index f234a9c5..fdb118d1 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs
@@ -150,8 +150,7 @@ internal class CultivationViewModel : ObservableObject, ISupportCancellation
private async Task AddProjectAsync()
{
- MainWindow mainWindow = Ioc.Default.GetRequiredService();
- (bool isOk, CultivateProject project) = await new CultivateProjectDialog(mainWindow).CreateProjectAsync().ConfigureAwait(false);
+ (bool isOk, CultivateProject project) = await new CultivateProjectDialog().CreateProjectAsync().ConfigureAwait(false);
if (isOk)
{
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNoteViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNoteViewModel.cs
index 31a1aa76..deb30b32 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNoteViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNoteViewModel.cs
@@ -220,18 +220,16 @@ internal class DailyNoteViewModel : ObservableObject, ISupportCancellation
{
if (entry != null)
{
- MainWindow mainWindow = Ioc.Default.GetRequiredService();
- await new DailyNoteNotificationDialog(mainWindow, entry).ShowAsync();
+ await new DailyNoteNotificationDialog(entry).ShowAsync();
appDbContext.DailyNotes.UpdateAndSave(entry);
}
}
private async Task VerifyDailyNoteVerificationAsync()
{
- if (userService.Current != null && userService.Current.SelectedUserGameRole != null)
+ if (UserAndRole.TryFromUser(userService.Current, out UserAndRole? userAndRole))
{
- MainWindow mainWindow = Ioc.Default.GetRequiredService();
- await new DailyNoteVerificationDialog(mainWindow, userService.Current.Entity, userService.Current.SelectedUserGameRole).ShowAsync();
+ await new DailyNoteVerificationDialog(userAndRole).ShowAsync();
}
else
{
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLogViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLogViewModel.cs
index 63787c63..a61695c7 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLogViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLogViewModel.cs
@@ -6,7 +6,6 @@ using Microsoft.UI.Xaml.Controls;
using Snap.Hutao.Control;
using Snap.Hutao.Control.Extension;
using Snap.Hutao.Core.IO;
-using Snap.Hutao.Core.Threading.CodeAnalysis;
using Snap.Hutao.Factory.Abstraction;
using Snap.Hutao.Model.Binding.Gacha;
using Snap.Hutao.Model.Entity;
@@ -29,6 +28,7 @@ internal class GachaLogViewModel : ObservableObject, ISupportCancellation
private readonly IGachaLogService gachaLogService;
private readonly IInfoBarService infoBarService;
private readonly IPickerFactory pickerFactory;
+ private readonly IContentDialogFactory contentDialogFactory;
private readonly JsonSerializerOptions options;
private ObservableCollection? archives;
@@ -45,26 +45,27 @@ internal class GachaLogViewModel : ObservableObject, ISupportCancellation
/// 信息
/// Json序列化选项
/// 异步命令工厂
+ /// 内容对话框工厂
/// 文件选择器工厂
public GachaLogViewModel(
IGachaLogService gachaLogService,
IInfoBarService infoBarService,
JsonSerializerOptions options,
IAsyncRelayCommandFactory asyncRelayCommandFactory,
+ IContentDialogFactory contentDialogFactory,
IPickerFactory pickerFactory)
{
this.gachaLogService = gachaLogService;
this.infoBarService = infoBarService;
this.pickerFactory = pickerFactory;
+ this.contentDialogFactory = contentDialogFactory;
this.options = options;
OpenUICommand = asyncRelayCommandFactory.Create(OpenUIAsync);
RefreshByWebCacheCommand = asyncRelayCommandFactory.Create(RefreshByWebCacheAsync);
RefreshByStokenCommand = asyncRelayCommandFactory.Create(RefreshByStokenAsync);
RefreshByManualInputCommand = asyncRelayCommandFactory.Create(RefreshByManualInputAsync);
- ImportFromUIGFExcelCommand = asyncRelayCommandFactory.Create(ImportFromUIGFExcelAsync);
ImportFromUIGFJsonCommand = asyncRelayCommandFactory.Create(ImportFromUIGFJsonAsync);
- ExportToUIGFExcelCommand = asyncRelayCommandFactory.Create(ExportToUIGFExcelAsync);
ExportToUIGFJsonCommand = asyncRelayCommandFactory.Create(ExportToUIGFJsonAsync);
RemoveArchiveCommand = asyncRelayCommandFactory.Create(RemoveArchiveAsync);
}
@@ -137,21 +138,11 @@ internal class GachaLogViewModel : ObservableObject, ISupportCancellation
///
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);