diff --git a/src/Snap.Hutao/Snap.Hutao.Win32/NativeMethods.txt b/src/Snap.Hutao/Snap.Hutao.Win32/NativeMethods.txt index 6520488d..80fd8e62 100644 --- a/src/Snap.Hutao/Snap.Hutao.Win32/NativeMethods.txt +++ b/src/Snap.Hutao/Snap.Hutao.Win32/NativeMethods.txt @@ -64,6 +64,7 @@ IMemoryBufferByteAccess // Const value INFINITE +RPC_E_WRONG_THREAD MAX_PATH WM_GETMINMAXINFO WM_HOTKEY diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Image/CachedImage.xaml b/src/Snap.Hutao/Snap.Hutao/Control/Image/CachedImage.xaml index e64ab600..b9540edd 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Image/CachedImage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/Control/Image/CachedImage.xaml @@ -19,7 +19,6 @@ Name="PlaceholderImage" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}" - Opacity="1.0" Source="{TemplateBinding PlaceholderSource}" Stretch="{TemplateBinding PlaceholderStretch}"/> diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs b/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs index c049e8aa..b35ceec4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs @@ -80,19 +80,22 @@ internal abstract partial class CompositionImage : Microsoft.UI.Xaml.Controls.Co ILogger logger = serviceProvider.GetRequiredService>(); // source is valid - if (arg.NewValue is Uri inner && !string.IsNullOrEmpty(inner.OriginalString)) + if (arg.NewValue is Uri inner) { - // value is different from old one - if (inner != (arg.OldValue as Uri)) + if (!string.IsNullOrEmpty(inner.OriginalString)) { - image - .ApplyImageAsync(inner, token) - .SafeForget(logger, ex => OnApplyImageFailed(serviceProvider, inner, ex)); + // value is different from old one + if (inner != (arg.OldValue as Uri)) + { + image + .ApplyImageAsync(inner, token) + .SafeForget(logger, ex => OnApplyImageFailed(serviceProvider, inner, ex)); + } + } + else + { + image.HideAsync(token).SafeForget(logger); } - } - else - { - image.HideAsync(token).SafeForget(logger); } } @@ -130,8 +133,9 @@ internal abstract partial class CompositionImage : Microsoft.UI.Xaml.Controls.Co { imageSurface = await LoadImageSurfaceAsync(file, token).ConfigureAwait(true); } - catch (COMException) + catch (COMException ex) { + _ = ex; imageCache.Remove(uri); } catch (IOException) @@ -163,7 +167,7 @@ internal abstract partial class CompositionImage : Microsoft.UI.Xaml.Controls.Co surface.LoadCompleted += loadedImageSourceLoadCompletedEventHandler; if (surface.DecodedPhysicalSize.Size() <= 0D) { - await surfaceLoadTaskCompletionSource.Task.ConfigureAwait(true); + await Task.WhenAny(surfaceLoadTaskCompletionSource.Task, Task.Delay(5000, token)).ConfigureAwait(true); } LoadImageSurfaceCompleted(surface); diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index 1be8d96c..2ba84fb3 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -2133,7 +2133,7 @@ 预下载 - 该账号尚未绑定 UID + 该账号尚未绑定实时便笺通知 UID 绑定当前用户的角色 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs index 199ff6d3..45a51287 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AnnouncementService.cs @@ -7,6 +7,7 @@ using Snap.Hutao.Web.Hoyolab.Hk4e.Common.Announcement; using Snap.Hutao.Web.Response; using System.Globalization; using System.Runtime.InteropServices; +using System.Text; using System.Text.RegularExpressions; namespace Snap.Hutao.Service; @@ -68,9 +69,9 @@ internal sealed partial class AnnouncementService : IAnnouncementService private static void PreprocessAnnouncements(Dictionary contentMap, List announcementListWrappers) { // 将公告内容联入公告列表 - foreach (ref AnnouncementListWrapper listWrapper in CollectionsMarshal.AsSpan(announcementListWrappers)) + foreach (ref readonly AnnouncementListWrapper listWrapper in CollectionsMarshal.AsSpan(announcementListWrappers)) { - foreach (ref Announcement item in CollectionsMarshal.AsSpan(listWrapper.List)) + foreach (ref readonly Announcement item in CollectionsMarshal.AsSpan(listWrapper.List)) { contentMap.TryGetValue(item.AnnId, out string? rawContent); item.Content = rawContent ?? string.Empty; @@ -79,10 +80,11 @@ internal sealed partial class AnnouncementService : IAnnouncementService AdjustAnnouncementTime(announcementListWrappers); - foreach (ref AnnouncementListWrapper listWrapper in CollectionsMarshal.AsSpan(announcementListWrappers)) + foreach (ref readonly AnnouncementListWrapper listWrapper in CollectionsMarshal.AsSpan(announcementListWrappers)) { - foreach (ref Announcement item in CollectionsMarshal.AsSpan(listWrapper.List)) + foreach (ref readonly Announcement item in CollectionsMarshal.AsSpan(listWrapper.List)) { + item.Subtitle = new StringBuilder(item.Subtitle).Replace("\r
", string.Empty).ToString(); item.Content = AnnouncementRegex.XmlTimeTagRegex.Replace(item.Content, x => x.Groups[1].Value); } } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs index 68bbd48f..560c586b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs @@ -27,6 +27,7 @@ namespace Snap.Hutao.Service.Game.Package; internal sealed partial class PackageConverter { private const string PackageVersion = "pkg_version"; + private readonly JsonSerializerOptions options; private readonly RuntimeOptions runtimeOptions; private readonly HttpClient httpClient; diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/LaunchGameViewModelSlim.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/LaunchGameViewModelSlim.cs index aba0fd04..d18bd542 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/LaunchGameViewModelSlim.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Game/LaunchGameViewModelSlim.cs @@ -51,7 +51,7 @@ internal sealed partial class LaunchGameViewModelSlim : Abstraction.ViewModelSli } } - [Command("LaunchCommand", AllowConcurrentExecutions = true)] + [Command("LaunchCommand")] private async Task LaunchAsync() { IInfoBarService infoBarService = ServiceProvider.GetRequiredService(); diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/FolderViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/FolderViewModel.cs index 9ba5a833..14a69c72 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/FolderViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/FolderViewModel.cs @@ -21,6 +21,7 @@ internal sealed partial class FolderViewModel : ObservableObject async ValueTask SetFolderSizeAsync() { + await taskContext.SwitchToBackgroundAsync(); long totalSize = 0; foreach (string file in Directory.EnumerateFiles(folder, "*.*", SearchOption.AllDirectories))