diff --git a/src/BD.WTTS.Client.Avalonia/Converters/StringFormatConverter.cs b/src/BD.WTTS.Client.Avalonia/Converters/StringFormatConverter.cs index abe1e9778..e83912e95 100644 --- a/src/BD.WTTS.Client.Avalonia/Converters/StringFormatConverter.cs +++ b/src/BD.WTTS.Client.Avalonia/Converters/StringFormatConverter.cs @@ -40,7 +40,7 @@ public sealed class StringFormatConverter : IValueConverter, IMultiValueConverte var res = Strings.ResourceManager.GetString(para, Strings.Culture); if (!string.IsNullOrEmpty(res)) return res.Format(str); - return para.Format(str); + return str.Format(para); } else { diff --git a/src/BD.WTTS.Client.Avalonia/UI/Styling/Controls/AppItem.axaml b/src/BD.WTTS.Client.Avalonia/UI/Styling/Controls/AppItem.axaml index c5538b11a..205007435 100644 --- a/src/BD.WTTS.Client.Avalonia/UI/Styling/Controls/AppItem.axaml +++ b/src/BD.WTTS.Client.Avalonia/UI/Styling/Controls/AppItem.axaml @@ -123,10 +123,10 @@ BorderBrush="{DynamicResource ControlFillColorDefaultBrush}" ClipToBounds="True" CornerRadius="{StaticResource ControlCornerRadius}"> - @@ -270,7 +270,12 @@ Converter={StaticResource IsNullConverter}, ConverterParameter=invert}"> - + - diff --git a/src/BD.WTTS.Client.Avalonia/UI/Styling/Controls/PageBase.axaml b/src/BD.WTTS.Client.Avalonia/UI/Styling/Controls/PageBase.axaml index de0d300f2..31a9312bb 100644 --- a/src/BD.WTTS.Client.Avalonia/UI/Styling/Controls/PageBase.axaml +++ b/src/BD.WTTS.Client.Avalonia/UI/Styling/Controls/PageBase.axaml @@ -216,7 +216,8 @@ diff --git a/src/BD.WTTS.Client.Avalonia/UI/Views/Controls/AppItem.cs b/src/BD.WTTS.Client.Avalonia/UI/Views/Controls/AppItem.cs index bdfcdbdb6..252e5bacc 100644 --- a/src/BD.WTTS.Client.Avalonia/UI/Views/Controls/AppItem.cs +++ b/src/BD.WTTS.Client.Avalonia/UI/Views/Controls/AppItem.cs @@ -12,8 +12,8 @@ public class AppItem : TemplatedControl public static readonly StyledProperty DescriptionProperty = AvaloniaProperty.Register(nameof(Description)); - public static readonly StyledProperty StatusProperty = - AvaloniaProperty.Register(nameof(Status)); + public static readonly StyledProperty StatusProperty = + ContentControl.ContentProperty.AddOwner(); public static readonly StyledProperty ImageProperty = AvaloniaProperty.Register(nameof(Image)); @@ -45,7 +45,7 @@ public class AppItem : TemplatedControl set => SetValue(DescriptionProperty, value); } - public string Status + public object? Status { get => GetValue(StatusProperty); set => SetValue(StatusProperty, value); diff --git a/src/BD.WTTS.Client.Avalonia/UI/Views/Controls/SnackbarManager.cs b/src/BD.WTTS.Client.Avalonia/UI/Views/Controls/SnackbarManager.cs index 1d096f779..3d77d0571 100644 --- a/src/BD.WTTS.Client.Avalonia/UI/Views/Controls/SnackbarManager.cs +++ b/src/BD.WTTS.Client.Avalonia/UI/Views/Controls/SnackbarManager.cs @@ -95,7 +95,7 @@ public class SnackbarManager : TemplatedControl, IManagedNotificationManager var infoBarControl = new Snackbar { - MaxWidth = 450, + MaxWidth = 500, IsOpen = true, IsClosable = true, Severity = InfoBarSeverity.Informational, diff --git a/src/BD.WTTS.Client.Avalonia/UI/Views/Pages/About/AboutPage.axaml b/src/BD.WTTS.Client.Avalonia/UI/Views/Pages/About/AboutPage.axaml index 8e2876623..0d6c18069 100644 --- a/src/BD.WTTS.Client.Avalonia/UI/Views/Pages/About/AboutPage.axaml +++ b/src/BD.WTTS.Client.Avalonia/UI/Views/Pages/About/AboutPage.axaml @@ -14,7 +14,12 @@ mc:Ignorable="d"> - + - - - + + + + + + @@ -206,32 +213,91 @@ - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/src/BD.WTTS.Client.Plugins.Accelerator/Services/Mvvm/ProxyService.Operate.cs b/src/BD.WTTS.Client.Plugins.Accelerator/Services/Mvvm/ProxyService.Operate.cs index 0b8ccbafe..ee0e179bc 100644 --- a/src/BD.WTTS.Client.Plugins.Accelerator/Services/Mvvm/ProxyService.Operate.cs +++ b/src/BD.WTTS.Client.Plugins.Accelerator/Services/Mvvm/ProxyService.Operate.cs @@ -260,19 +260,17 @@ partial class ProxyService [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool OnStartedShowToastReturnProxyStatus() { - string? text; bool proxyStatus; if (string.IsNullOrWhiteSpace(Error)) { - text = Strings.CommunityFix_StartProxySuccess; + Toast.Show(ToastIcon.Success, Strings.CommunityFix_StartProxySuccess); proxyStatus = true; } else { - text = Error; + Toast.Show(ToastIcon.Error, Error); proxyStatus = false; } - Toast.Show(text); return proxyStatus; } @@ -282,7 +280,7 @@ partial class ProxyService bool proxyStatus = default; if (!string.IsNullOrWhiteSpace(Error)) { - Toast.Show(Error); + Toast.Show(ToastIcon.Error, Error); proxyStatus = true; } return proxyStatus; diff --git a/src/BD.WTTS.Client.Plugins.Accelerator/Services/Mvvm/ProxyService.cs b/src/BD.WTTS.Client.Plugins.Accelerator/Services/Mvvm/ProxyService.cs index 34215bc86..bab0dca9e 100644 --- a/src/BD.WTTS.Client.Plugins.Accelerator/Services/Mvvm/ProxyService.cs +++ b/src/BD.WTTS.Client.Plugins.Accelerator/Services/Mvvm/ProxyService.cs @@ -239,7 +239,7 @@ public sealed partial class ProxyService { if (ProxySettings.SupportProxyServicesStatus.Value.Contains(item.Id.ToString())) { - item.Checked = true; + item.ThreeStateEnable = true; } } } @@ -249,13 +249,13 @@ public sealed partial class ProxyService LoadOrSaveLocalAccelerate(); - if (IsLoadImage && ProxyDomains.Items.Any_Nullable()) - { - foreach (var item in ProxyDomains.Items) - { - //item.ImageStream = ImageChannelType.AccelerateGroup.GetImageAsync(ImageUrlHelper.GetImageApiUrlById(item.ImageId)); - } - } + //if (IsLoadImage && ProxyDomains.Items.Any_Nullable()) + //{ + // foreach (var item in ProxyDomains.Items) + // { + // item.ImageStream = ImageChannelType.AccelerateGroup.GetImageAsync(ImageUrlHelper.GetImageApiUrlById(item.ImageId)); + // } + //} this.WhenAnyValue(v => v.ProxyDomainsList) .Subscribe(domain => domain? diff --git a/src/BD.WTTS.Client.Plugins.Accelerator/UI/Views/Pages/AcceleratorPage.axaml b/src/BD.WTTS.Client.Plugins.Accelerator/UI/Views/Pages/AcceleratorPage.axaml index c92c35237..89a7230b6 100644 --- a/src/BD.WTTS.Client.Plugins.Accelerator/UI/Views/Pages/AcceleratorPage.axaml +++ b/src/BD.WTTS.Client.Plugins.Accelerator/UI/Views/Pages/AcceleratorPage.axaml @@ -281,7 +281,7 @@ - + diff --git a/src/BD.WTTS.Client.Plugins.GameAccount/UI/ViewModels/GameAccountPageViewModel.props.cs b/src/BD.WTTS.Client.Plugins.GameAccount/UI/ViewModels/GameAccountPageViewModel.props.cs index 708b712ea..c61f8d9c6 100644 --- a/src/BD.WTTS.Client.Plugins.GameAccount/UI/ViewModels/GameAccountPageViewModel.props.cs +++ b/src/BD.WTTS.Client.Plugins.GameAccount/UI/ViewModels/GameAccountPageViewModel.props.cs @@ -4,7 +4,7 @@ namespace BD.WTTS.UI.ViewModels; public sealed partial class GameAccountPageViewModel : TabItemViewModel { - readonly Uri PlatformsPath = new("avares://BD.WTTS.Client.Plugins.GameAccount/UI/Assets/Platforms.json"); + readonly static Uri PlatformsPath = new("avares://BD.WTTS.Client.Plugins.GameAccount/UI/Assets/Platforms.json"); public override string Name => Strings.Welcome; diff --git a/src/BD.WTTS.Client.Plugins.GameAccount/UI/Views/Controls/AccountItems.axaml b/src/BD.WTTS.Client.Plugins.GameAccount/UI/Views/Controls/AccountItems.axaml index 42472b816..94a6f22ad 100644 --- a/src/BD.WTTS.Client.Plugins.GameAccount/UI/Views/Controls/AccountItems.axaml +++ b/src/BD.WTTS.Client.Plugins.GameAccount/UI/Views/Controls/AccountItems.axaml @@ -35,7 +35,9 @@ MaxWidth="128" Classes="Vertical" Description="{Binding LastLoginTime}" - Status="最近登录"> + Status="{ReflectionBinding Path=Res.UserChange_RecentLogin, + Mode=OneWay, + Source={x:Static s:ResourceService.Current}}"> - + diff --git a/src/BD.WTTS.Client.Plugins.GameAccount/UI/Views/Pages/GameAccountPage.axaml b/src/BD.WTTS.Client.Plugins.GameAccount/UI/Views/Pages/GameAccountPage.axaml index 00dc27c55..166065f06 100644 --- a/src/BD.WTTS.Client.Plugins.GameAccount/UI/Views/Pages/GameAccountPage.axaml +++ b/src/BD.WTTS.Client.Plugins.GameAccount/UI/Views/Pages/GameAccountPage.axaml @@ -92,7 +92,7 @@ Width="16" Height="16" HorizontalAlignment="Left"> - + var cancel = !File.Exists(ViewModel.SelectedPlatform.PlatformSetting?.PlatformPath); if (cancel) { - Toast.Show($"{ViewModel.SelectedPlatform.FullName} 平台路径没有正确选择"); + Toast.Show(ToastIcon.Error, $"{ViewModel.SelectedPlatform.FullName} 平台路径没有正确选择"); } return cancel; }); @@ -56,14 +56,14 @@ public partial class GameAccountPage : PageBase var cancel = !File.Exists(platform.PlatformSetting?.PlatformPath); if (cancel) { - Toast.Show($"{platform.FullName} 平台路径没有正确选择"); + Toast.Show(ToastIcon.Error, $"{platform.FullName} 平台路径没有正确选择"); } return cancel; })) { if (!File.Exists(platform.PlatformSetting?.PlatformPath)) { - Toast.Show($"路径没有正确选择,{platform.FullName} 平台账号切换功能无法使用"); + Toast.Show(ToastIcon.Error, $"路径没有正确选择,{platform.FullName} 平台账号切换功能无法使用"); } } } diff --git a/src/BD.WTTS.Client.Plugins.GameList/UI/Views/Pages/GameListPage.axaml b/src/BD.WTTS.Client.Plugins.GameList/UI/Views/Pages/GameListPage.axaml index 4135995da..0e7798df3 100644 --- a/src/BD.WTTS.Client.Plugins.GameList/UI/Views/Pages/GameListPage.axaml +++ b/src/BD.WTTS.Client.Plugins.GameList/UI/Views/Pages/GameListPage.axaml @@ -158,7 +158,7 @@ + /// 查找类似 已找到 {0} 个应用 的本地化字符串。 + /// + public static string GameList_FindAppsText { + get { + return ResourceManager.GetString("GameList_FindAppsText", resourceCulture); + } + } + /// /// 查找类似 全部选中 的本地化字符串。 /// diff --git a/src/BD.WTTS.Client/Resources/Strings.resx b/src/BD.WTTS.Client/Resources/Strings.resx index a1c960c9c..d8d3a8dee 100644 --- a/src/BD.WTTS.Client/Resources/Strings.resx +++ b/src/BD.WTTS.Client/Resources/Strings.resx @@ -2448,5 +2448,8 @@ AAAAA-BBBBB-CCCC3 插件商店 + + + 已找到 {0} 个应用 \ No newline at end of file diff --git a/src/BD.WTTS.Client/Services/Mvvm/Identity/UserService.cs b/src/BD.WTTS.Client/Services/Mvvm/Identity/UserService.cs index 52c1a8971..61acdc816 100644 --- a/src/BD.WTTS.Client/Services/Mvvm/Identity/UserService.cs +++ b/src/BD.WTTS.Client/Services/Mvvm/Identity/UserService.cs @@ -15,6 +15,32 @@ public sealed class UserService : ReactiveObject readonly ISteamworksWebApiService steamworksWebApiService = ISteamworksWebApiService.Instance; readonly IWindowManager windowManager = IWindowManager.Instance; + [Reactive] + public IdentityUserInfoDTO? User { get; set; } + + /// + /// 指示当前用户是否已通过身份验证(已登录) + /// + public bool IsAuthenticated => User != null; + + [Reactive] + public SteamUser? CurrentSteamUser { get; set; } + + [Reactive] + public object? AvatarPath { get; set; } + + /// + /// 当前登录用户是否有手机号码 + /// + [Reactive] + public bool HasPhoneNumber { get; set; } + + /// + /// 用于 UI 显示的当前登录用户的手机号码(隐藏中间四位) + /// + [Reactive] + public string PhoneNumber { get; set; } = string.Empty; + public async void ShowWindow() { var cUser = await userManager.GetCurrentUserAsync(); @@ -102,25 +128,6 @@ public sealed class UserService : ReactiveObject await userManager.SignOutAsync(); } - [Reactive] - public IdentityUserInfoDTO? User { get; set; } - - /// - /// 指示当前用户是否已通过身份验证(已登录) - /// - public bool IsAuthenticated => User != null; - - [Reactive] - public SteamUser? CurrentSteamUser { get; set; } - - object? _AvatarPath; - - public object? AvatarPath - { - get => _AvatarPath; - set => this.RaiseAndSetIfChanged(ref _AvatarPath, value); - } - private UserService() { mCurrent = this; @@ -143,23 +150,6 @@ public sealed class UserService : ReactiveObject await RefreshUserAsync(); } - [Reactive] - /// - /// 当前登录用户是否有手机号码 - /// - public bool HasPhoneNumber { get; set; } - - string _PhoneNumber = string.Empty; - - /// - /// 用于 UI 显示的当前登录用户的手机号码(隐藏中间四位) - /// - public string PhoneNumber - { - get => _PhoneNumber; - set => this.RaiseAndSetIfChanged(ref _PhoneNumber, value); - } - static string GetCurrentUserPhoneNumber(CurrentUser? user, bool notHideMiddleFour = false) { var phone_number = user?.PhoneNumber;