diff --git a/src/Snap.Hutao/.editorconfig b/src/Snap.Hutao/.editorconfig index 5905c66a..cc0a0303 100644 --- a/src/Snap.Hutao/.editorconfig +++ b/src/Snap.Hutao/.editorconfig @@ -322,6 +322,7 @@ dotnet_diagnostic.CA2227.severity = suggestion dotnet_diagnostic.CA2251.severity = suggestion csharp_style_prefer_primary_constructors = false:none +dotnet_diagnostic.SA1124.severity = none [*.vb] #### 命名样式 #### diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Database/AdvancedDbCollectionView.cs b/src/Snap.Hutao/Snap.Hutao/Core/Database/AdvancedDbCollectionView.cs index 124fdba5..920a4217 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Database/AdvancedDbCollectionView.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Database/AdvancedDbCollectionView.cs @@ -1,16 +1,104 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using Microsoft.EntityFrameworkCore; using Snap.Hutao.Core.Database.Abstraction; +using Snap.Hutao.Model; +using Snap.Hutao.Model.Entity.Database; using Snap.Hutao.UI.Xaml.Data; namespace Snap.Hutao.Core.Database; +// The scope of the view follows the scope of the service provider. internal sealed class AdvancedDbCollectionView : AdvancedCollectionView where TEntity : class, IAdvancedCollectionViewItem, ISelectable { - public AdvancedDbCollectionView(IList source) + private readonly IServiceProvider serviceProvider; + + private bool detached; + + public AdvancedDbCollectionView(IList source, IServiceProvider serviceProvider) : base(source) { + this.serviceProvider = serviceProvider; + } + + public void Detach() + { + detached = true; + } + + protected override void OnCurrentChangedOverride() + { + if (serviceProvider is null || detached) + { + return; + } + + TEntity? currentItem = CurrentItem; + + foreach (TEntity item in Source) + { + item.IsSelected = ReferenceEquals(item, currentItem); + } + + using (IServiceScope scope = serviceProvider.CreateScope()) + { + AppDbContext dbContext = scope.ServiceProvider.GetRequiredService(); + dbContext.Set().ExecuteUpdate(update => update.SetProperty(entity => entity.IsSelected, false)); + + if (currentItem is not null) + { + dbContext.Set().UpdateAndSave(currentItem); + } + } + } +} + +// The scope of the view follows the scope of the service provider. +[SuppressMessage("", "SA1402")] +internal sealed class AdvancedDbCollectionView : AdvancedCollectionView + where TEntityAccess : class, IEntityAccess, IAdvancedCollectionViewItem + where TEntity : class, ISelectable +{ + private readonly IServiceProvider serviceProvider; + + private bool detached; + + public AdvancedDbCollectionView(IList source, IServiceProvider serviceProvider) + : base(source) + { + this.serviceProvider = serviceProvider; + } + + public void Detach() + { + detached = true; + } + + protected override void OnCurrentChangedOverride() + { + if (serviceProvider is null || detached) + { + return; + } + + TEntityAccess? currentItem = CurrentItem; + + foreach (TEntityAccess item in Source) + { + item.Entity.IsSelected = ReferenceEquals(item, currentItem); + } + + using (IServiceScope scope = serviceProvider.CreateScope()) + { + AppDbContext dbContext = scope.ServiceProvider.GetRequiredService(); + dbContext.Set().ExecuteUpdate(update => update.SetProperty(entity => entity.IsSelected, false)); + + if (currentItem is not null) + { + dbContext.Set().UpdateAndSave(currentItem.Entity); + } + } } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Database/ObservableReorderableDbCollection.cs b/src/Snap.Hutao/Snap.Hutao/Core/Database/ObservableReorderableDbCollection.cs index 3b1e1b7a..7c55b3ae 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Database/ObservableReorderableDbCollection.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Database/ObservableReorderableDbCollection.cs @@ -64,13 +64,13 @@ internal sealed class ObservableReorderableDbCollection : ObservableCol } [SuppressMessage("", "SA1402")] -internal sealed class ObservableReorderableDbCollection : ObservableCollection - where TEntityOnly : class, IEntityAccess +internal sealed class ObservableReorderableDbCollection : ObservableCollection + where TEntityAccess : class, IEntityAccess where TEntity : class, IReorderable { private readonly IServiceProvider serviceProvider; - public ObservableReorderableDbCollection(List items, IServiceProvider serviceProvider) + public ObservableReorderableDbCollection(List items, IServiceProvider serviceProvider) : base(AdjustIndex(items.SortBy(x => x.Entity.Index))) { this.serviceProvider = serviceProvider; @@ -89,12 +89,12 @@ internal sealed class ObservableReorderableDbCollection : } } - private static List AdjustIndex(List list) + private static List AdjustIndex(List list) { - Span span = CollectionsMarshal.AsSpan(list); + Span span = CollectionsMarshal.AsSpan(list); for (int i = 0; i < list.Count; i++) { - ref readonly TEntityOnly item = ref span[i]; + ref readonly TEntityAccess item = ref span[i]; item.Entity.Index = i; } @@ -103,14 +103,14 @@ internal sealed class ObservableReorderableDbCollection : private void OnReorder() { - AdjustIndex((List)Items); + AdjustIndex((List)Items); using (IServiceScope scope = serviceProvider.CreateScope()) { AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); DbSet dbSet = appDbContext.Set(); - foreach (ref readonly TEntityOnly item in CollectionsMarshal.AsSpan((List)Items)) + foreach (ref readonly TEntityAccess item in CollectionsMarshal.AsSpan((List)Items)) { dbSet.UpdateAndSave(item.Entity); } diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Database/ScopedDbCurrent.cs b/src/Snap.Hutao/Snap.Hutao/Core/Database/ScopedDbCurrent.cs index a3f95a98..e0c58fd9 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Database/ScopedDbCurrent.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Database/ScopedDbCurrent.cs @@ -9,6 +9,7 @@ using Snap.Hutao.Model.Entity.Database; namespace Snap.Hutao.Core.Database; +[Obsolete] [ConstructorGenerated] internal sealed partial class ScopedDbCurrent where TEntity : class, ISelectable @@ -63,6 +64,7 @@ internal sealed partial class ScopedDbCurrent } } +[Obsolete] [ConstructorGenerated] internal sealed partial class ScopedDbCurrent where TEntityOnly : class, IEntityAccess diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Diagnostics/CodeAnalysis/AlsoAsyncSetsAttribute.cs b/src/Snap.Hutao/Snap.Hutao/Core/Diagnostics/CodeAnalysis/AlsoAsyncSetsAttribute.cs deleted file mode 100644 index 1016cb69..00000000 --- a/src/Snap.Hutao/Snap.Hutao/Core/Diagnostics/CodeAnalysis/AlsoAsyncSetsAttribute.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -namespace Snap.Hutao.Core.Diagnostics.CodeAnalysis; - -/// -/// 指示此特性附加的属性会在属性改变后会异步地设置的其他属性 -/// -[Obsolete] -[AttributeUsage(AttributeTargets.Property, Inherited = false)] -internal sealed class AlsoAsyncSetsAttribute : Attribute -{ - public AlsoAsyncSetsAttribute(string propertyName) - { - } - - public AlsoAsyncSetsAttribute(string propertyName1, string propertyName2) - { - } - - public AlsoAsyncSetsAttribute(params string[] propertyNames) - { - } -} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Diagnostics/CodeAnalysis/AlsoSetsAttribute.cs b/src/Snap.Hutao/Snap.Hutao/Core/Diagnostics/CodeAnalysis/AlsoSetsAttribute.cs deleted file mode 100644 index 29f4f6cc..00000000 --- a/src/Snap.Hutao/Snap.Hutao/Core/Diagnostics/CodeAnalysis/AlsoSetsAttribute.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -namespace Snap.Hutao.Core.Diagnostics.CodeAnalysis; - -/// -/// 指示此特性附加的属性会在属性改变后会设置的其他属性 -/// -[Obsolete] -[AttributeUsage(AttributeTargets.Property, Inherited = false)] -internal sealed class AlsoSetsAttribute : Attribute -{ - public AlsoSetsAttribute(string propertyName) - { - } - - public AlsoSetsAttribute(string propertyName1, string propertyName2) - { - } - - public AlsoSetsAttribute(params string[] propertyNames) - { - } -} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Core/IO/TempFileStream.cs b/src/Snap.Hutao/Snap.Hutao/Core/IO/TempFileStream.cs index 0c2d3266..aad509a0 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/IO/TempFileStream.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/IO/TempFileStream.cs @@ -58,5 +58,7 @@ internal sealed class TempFileStream : Stream stream.Dispose(); File.Delete(path); } + + base.Dispose(disposing); } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/TaskExtension.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/TaskExtension.cs index 44b06918..10dc53a5 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Threading/TaskExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Threading/TaskExtension.cs @@ -24,6 +24,7 @@ internal static class TaskExtension return new(task); } + [Obsolete("SafeForget without logger is not recommended.")] public static async void SafeForget(this Task task) { try @@ -100,6 +101,7 @@ internal static class TaskExtension } } + [Obsolete("SafeForget without logger is not recommended.")] public static async void SafeForget(this ValueTask task) { try diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/ListExtension.cs b/src/Snap.Hutao/Snap.Hutao/Extension/ListExtension.cs index e68e77f5..e6dd8f41 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/ListExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Extension/ListExtension.cs @@ -78,23 +78,6 @@ internal static class ListExtension return true; } - public static bool RemoveFirstWhere(this List list, Func shouldRemovePredicate) - { - Span span = CollectionsMarshal.AsSpan(list); - ref T reference = ref MemoryMarshal.GetReference(span); - - for (int i = 0; i < span.Length; i++) - { - if (shouldRemovePredicate.Invoke(Unsafe.Add(ref reference, i))) - { - list.RemoveAt(i); - return true; - } - } - - return false; - } - public static void RemoveLast(this IList collection) { collection.RemoveAt(collection.Count - 1); diff --git a/src/Snap.Hutao/Snap.Hutao/Message/AchievementArchiveChangedMessage.cs b/src/Snap.Hutao/Snap.Hutao/Message/AchievementArchiveChangedMessage.cs deleted file mode 100644 index 03ffaf8e..00000000 --- a/src/Snap.Hutao/Snap.Hutao/Message/AchievementArchiveChangedMessage.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using Snap.Hutao.Model.Entity; - -namespace Snap.Hutao.Message; - -/// -/// 成就存档切换消息 -/// -[HighQuality] -[Obsolete] -internal sealed class AchievementArchiveChangedMessage : ValueChangedMessage -{ -} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/AchievementArchive.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/AchievementArchive.cs index 82de2729..2a6465b7 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/AchievementArchive.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/AchievementArchive.cs @@ -3,6 +3,7 @@ using Snap.Hutao.Core.Abstraction; using Snap.Hutao.Core.Database.Abstraction; +using Snap.Hutao.UI.Xaml.Data; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -12,7 +13,9 @@ namespace Snap.Hutao.Model.Entity; /// 成就存档 /// [Table("achievement_archives")] -internal sealed class AchievementArchive : ISelectable, IMappingFrom +internal sealed class AchievementArchive : ISelectable, + IAdvancedCollectionViewItem, + IMappingFrom { /// /// 内部Id @@ -40,4 +43,12 @@ internal sealed class AchievementArchive : ISelectable, IMappingFrom default!, + }; + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/AppDbServiceExtension.cs b/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/AppDbServiceExtension.cs index 7d0bd691..8585d818 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/AppDbServiceExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/AppDbServiceExtension.cs @@ -66,6 +66,7 @@ internal static class AppDbServiceExtension return service.Execute(dbset => dbset.AddAndSave(entity)); } + [Obsolete] public static ValueTask AddAsync(this IAppDbService service, TEntity entity, CancellationToken token = default) where TEntity : class { @@ -78,6 +79,7 @@ internal static class AppDbServiceExtension return service.Execute(dbset => dbset.AddRangeAndSave(entities)); } + [Obsolete] public static ValueTask AddRangeAsync(this IAppDbService service, IEnumerable entities, CancellationToken token = default) where TEntity : class { @@ -144,6 +146,7 @@ internal static class AppDbServiceExtension return service.Execute(dbset => dbset.UpdateAndSave(entity)); } + [Obsolete] public static ValueTask UpdateAsync(this IAppDbService service, TEntity entity, CancellationToken token = default) where TEntity : class { @@ -162,6 +165,7 @@ internal static class AppDbServiceExtension return service.Execute(dbset => dbset.Where(predicate).ExecuteDelete()); } + [Obsolete] public static ValueTask DeleteAsync(this IAppDbService service, TEntity entity, CancellationToken token = default) where TEntity : class { diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementService.cs index 55e9083d..0f19858e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementService.cs @@ -8,7 +8,6 @@ using Snap.Hutao.Model.Entity; using Snap.Hutao.Model.InterChange.Achievement; using Snap.Hutao.Model.Primitive; using Snap.Hutao.ViewModel.Achievement; -using System.Collections.ObjectModel; using EntityAchievement = Snap.Hutao.Model.Entity.Achievement; namespace Snap.Hutao.Service.Achievement; @@ -18,32 +17,17 @@ namespace Snap.Hutao.Service.Achievement; [Injection(InjectAs.Scoped, typeof(IAchievementService))] internal sealed partial class AchievementService : IAchievementService { - private readonly ScopedDbCurrent dbCurrent; private readonly AchievementDbBulkOperation achievementDbBulkOperation; private readonly IAchievementDbService achievementDbService; + private readonly IServiceProvider serviceProvider; private readonly RuntimeOptions runtimeOptions; private readonly ITaskContext taskContext; - private ObservableCollection? archiveCollection; + private AdvancedDbCollectionView? archivesView; - public AchievementArchive? CurrentArchive + public AdvancedDbCollectionView Archives { - get => dbCurrent.Current; - set => dbCurrent.Current = value; - } - - public ObservableCollection ArchiveCollection - { - get - { - if (archiveCollection is null) - { - archiveCollection = achievementDbService.GetAchievementArchiveCollection(); - CurrentArchive = archiveCollection.SelectedOrDefault(); - } - - return archiveCollection; - } + get => archivesView ??= new(achievementDbService.GetAchievementArchiveCollection(), serviceProvider); } public List GetAchievementViewList(AchievementArchive archive, AchievementServiceMetadataContext context) @@ -69,31 +53,27 @@ internal sealed partial class AchievementService : IAchievementService return ArchiveAddResultKind.InvalidName; } - ArgumentNullException.ThrowIfNull(archiveCollection); + ArgumentNullException.ThrowIfNull(archivesView); - if (archiveCollection.Any(a => a.Name == newArchive.Name)) + if (archivesView.SourceCollection.Any(a => a.Name == newArchive.Name)) { return ArchiveAddResultKind.AlreadyExists; } - // Sync cache await taskContext.SwitchToMainThreadAsync(); - archiveCollection.Add(newArchive); - - // Sync database - await taskContext.SwitchToBackgroundAsync(); - CurrentArchive = newArchive; + archivesView.Add(newArchive); + archivesView.MoveCurrentTo(newArchive); return ArchiveAddResultKind.Added; } public async ValueTask RemoveArchiveAsync(AchievementArchive archive) { - ArgumentNullException.ThrowIfNull(archiveCollection); + ArgumentNullException.ThrowIfNull(archivesView); // Sync cache await taskContext.SwitchToMainThreadAsync(); - archiveCollection.Remove(archive); + archivesView.Remove(archive); // Sync database await taskContext.SwitchToBackgroundAsync(); diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/IAchievementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/IAchievementService.cs index 77e7e814..8625e8df 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/IAchievementService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/IAchievementService.cs @@ -1,64 +1,26 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using Snap.Hutao.Core.Database; using Snap.Hutao.Model.InterChange.Achievement; using Snap.Hutao.ViewModel.Achievement; -using System.Collections.ObjectModel; using EntityArchive = Snap.Hutao.Model.Entity.AchievementArchive; namespace Snap.Hutao.Service.Achievement; -/// -/// 成就服务抽象 -/// -[HighQuality] internal interface IAchievementService { - /// - /// 当前存档 - /// - EntityArchive? CurrentArchive { get; set; } + AdvancedDbCollectionView Archives { get; } - /// - /// 获取用于绑定的成就存档集合 - /// - ObservableCollection ArchiveCollection { get; } - - /// - /// 异步导出到UIAF - /// - /// 存档 - /// UIAF ValueTask ExportToUIAFAsync(EntityArchive selectedArchive); List GetAchievementViewList(EntityArchive archive, AchievementServiceMetadataContext context); - /// - /// 异步导入UIAF数据 - /// - /// 用户 - /// UIAF数据 - /// 选项 - /// 导入结果 ValueTask ImportFromUIAFAsync(EntityArchive archive, List list, ImportStrategyKind strategy); - /// - /// 异步移除存档 - /// - /// 待移除的存档 - /// 任务 ValueTask RemoveArchiveAsync(EntityArchive archive); - /// - /// 保存单个成就 - /// - /// 成就 void SaveAchievement(AchievementView achievement); - /// - /// 尝试添加存档 - /// - /// 新存档 - /// 存档添加结果 ValueTask AddArchiveAsync(EntityArchive newArchive); } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj index 3218c423..0beac2a7 100644 --- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj +++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj @@ -314,7 +314,7 @@ all runtime; build; native; contentfiles; analyzers - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/ScopedPage.cs b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/ScopedPage.cs index 88659ac4..4837e461 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/ScopedPage.cs +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/ScopedPage.cs @@ -53,7 +53,7 @@ internal class ScopedPage : Page TViewModel viewModel = pageScope.ServiceProvider.GetRequiredService(); using (viewModel.DisposeLock.Enter()) { - viewModel.IsViewDisposed = false; + viewModel.Resurrect(); viewModel.CancellationToken = viewCancellationTokenSource.Token; viewModel.DeferContentLoader = new DeferContentLoader(this); } @@ -106,10 +106,10 @@ internal class ScopedPage : Page viewCancellationTokenSource.Cancel(); IViewModel viewModel = (IViewModel)DataContext; + // Wait to ensure viewmodel operation is completed using (viewModel.DisposeLock.Enter()) { - // Wait to ensure viewmodel operation is completed - viewModel.IsViewDisposed = true; + viewModel.Uninitialize(); // Dispose the scope pageScope.Dispose(); diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Data/AdvancedCollectionView.cs b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Data/AdvancedCollectionView.cs index fbd6b514..4a88d390 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Data/AdvancedCollectionView.cs +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Data/AdvancedCollectionView.cs @@ -689,9 +689,9 @@ internal class AdvancedCollectionView : IAdvancedCollectionView, INotifyPr return; } + OnCurrentChangedOverride(); CurrentChanged?.Invoke(this, default!); OnPropertyChanged(nameof(CurrentItem)); - OnCurrentChangedOverride(); } private void OnVectorChanged(IVectorChangedEventArgs e) diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/AchievementCard.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/AchievementCard.xaml index 2cf822dd..05a41fb6 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/AchievementCard.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/AchievementCard.xaml @@ -21,7 +21,7 @@ Style="{ThemeResource DefaultButtonStyle}" mc:Ignorable="d"> - + diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/DailyNoteCard.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/DailyNoteCard.xaml index 4b4d64ff..40fafb7b 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/DailyNoteCard.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/DailyNoteCard.xaml @@ -24,7 +24,7 @@ mc:Ignorable="d"> - + diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/GachaStatisticsCard.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/GachaStatisticsCard.xaml index e36283c6..0876994f 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/GachaStatisticsCard.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/GachaStatisticsCard.xaml @@ -23,7 +23,7 @@ mc:Ignorable="d"> - + diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/LaunchGameCard.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/LaunchGameCard.xaml index bb57d1bf..9d125ecb 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/LaunchGameCard.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Card/LaunchGameCard.xaml @@ -23,7 +23,7 @@ Style="{ThemeResource DefaultButtonStyle}" mc:Ignorable="d"> - + diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/GuideView.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/GuideView.xaml index 9d3374a9..292b14ef 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/GuideView.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/GuideView.xaml @@ -14,7 +14,7 @@ mc:Ignorable="d"> - + diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/AchievementPage.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/AchievementPage.xaml index 5673d1a6..1a5696a2 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/AchievementPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/AchievementPage.xaml @@ -182,17 +182,17 @@ x:Key="AchievementListViewItemStyle" BasedOn="{StaticResource DefaultListViewItemStyle}" TargetType="ListViewItem"> - + - + - + @@ -261,7 +261,7 @@ @@ -294,7 +294,6 @@ Icon="{shuxm:FontIcon Glyph=}" Label="{shuxm:ResourceString Name=ViewPageAchievementExportLabel}"/> - @@ -347,7 +346,7 @@ HorizontalContentAlignment="Stretch" ItemTemplate="{StaticResource AchievementGoalGridTemplate}" ItemsSource="{Binding AchievementGoals}" - SelectedItem="{Binding SelectedAchievementGoal, Mode=TwoWay}" + SelectedItem="{Binding AchievementGoals.CurrentItem, Mode=TwoWay}" SelectionMode="Single">