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))