diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs b/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs
index dc77c05c..a9ec0f49 100644
--- a/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs
@@ -121,19 +121,27 @@ public abstract class CompositionImage : Microsoft.UI.Xaml.Controls.Control
{
await HideAsync(token);
+ LoadedImageSurface? imageSurface = null;
+ Compositor compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;
+
if (uri != null)
{
- StorageFile storageFile = await imageCache.GetFileFromCacheAsync(uri);
- Compositor compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;
-
- LoadedImageSurface? imageSurface = null;
- try
+ if (uri.Scheme == "ms-appx")
{
- imageSurface = await LoadImageSurfaceAsync(storageFile, token);
+ imageSurface = LoadedImageSurface.StartLoadFromUri(uri);
}
- catch (COMException)
+ else
{
- await imageCache.RemoveAsync(uri.Enumerate());
+ StorageFile storageFile = await imageCache.GetFileFromCacheAsync(uri);
+
+ try
+ {
+ imageSurface = await LoadImageSurfaceAsync(storageFile, token);
+ }
+ catch (COMException)
+ {
+ await imageCache.RemoveAsync(uri.Enumerate());
+ }
}
if (imageSurface != null)
diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Markup/UriExtension.cs b/src/Snap.Hutao/Snap.Hutao/Control/Markup/UriExtension.cs
new file mode 100644
index 00000000..08e46afa
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Control/Markup/UriExtension.cs
@@ -0,0 +1,32 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Microsoft.UI.Xaml.Controls;
+using Microsoft.UI.Xaml.Markup;
+
+namespace Snap.Hutao.Control.Markup;
+
+///
+/// Uri扩展
+///
+[MarkupExtensionReturnType(ReturnType = typeof(Uri))]
+public sealed class UriExtension : MarkupExtension
+{
+ ///
+ /// 构造一个新的Uri扩展
+ ///
+ public UriExtension()
+ {
+ }
+
+ ///
+ /// 地址
+ ///
+ public string? Value { get; set; }
+
+ ///
+ protected override object ProvideValue()
+ {
+ return new Uri(Value ?? string.Empty);
+ }
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Text/DescriptionTextBlock.cs b/src/Snap.Hutao/Snap.Hutao/Control/Text/DescriptionTextBlock.cs
index 91636fc1..6f660209 100644
--- a/src/Snap.Hutao/Snap.Hutao/Control/Text/DescriptionTextBlock.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Control/Text/DescriptionTextBlock.cs
@@ -102,7 +102,7 @@ public class DescriptionTextBlock : ContentControl
if (i == description.Length - 1)
{
- AppendText(text, description[last..i]);
+ AppendText(text, description[last..(i + 1)]);
}
}
}
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/AvatarProperty/Weapon.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/AvatarProperty/Weapon.cs
index 46de596b..8079dc66 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/AvatarProperty/Weapon.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/AvatarProperty/Weapon.cs
@@ -16,7 +16,7 @@ public class Weapon : EquipBase
///
/// 精炼属性
///
- public int AffixLevel { get; set; }
+ public string AffixLevel { get; set; } = default!;
///
/// 精炼名称
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/DescParamDescriptor.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/DescParamDescriptor.cs
index aa3276ab..753800d4 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/DescParamDescriptor.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/DescParamDescriptor.cs
@@ -28,7 +28,7 @@ internal sealed class DescParamDescriptor : ValueConverterBase param = from.Parameters.Single(param => param.Level == level);
- return new LevelParam(param.Level.ToString(), GetParameterInfos(formats, param.Parameters));
+ return new LevelParam($"Lv.{param.Level}", GetParameterInfos(formats, param.Parameters));
}
///
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/QualityColorConverter.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/QualityColorConverter.cs
new file mode 100644
index 00000000..ff014fbe
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/QualityColorConverter.cs
@@ -0,0 +1,28 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Control;
+using Snap.Hutao.Model.Intrinsic;
+using Windows.UI;
+
+namespace Snap.Hutao.Model.Metadata.Converter;
+
+///
+/// 品质颜色转换器
+///
+internal class QualityColorConverter : ValueConverterBase
+{
+ ///
+ public override Color Convert(ItemQuality from)
+ {
+ return from switch
+ {
+ ItemQuality.QUALITY_WHITE => Color.FromArgb(0xFF, 0x72, 0x77, 0x8B),
+ ItemQuality.QUALITY_GREEN => Color.FromArgb(0xFF, 0x2A, 0x8F, 0x72),
+ ItemQuality.QUALITY_BLUE => Color.FromArgb(0xFF, 0x51, 0x80, 0xCB),
+ ItemQuality.QUALITY_PURPLE => Color.FromArgb(0xFF, 0xA1, 0x56, 0xE0),
+ ItemQuality.QUALITY_ORANGE or ItemQuality.QUALITY_ORANGE_SP => Color.FromArgb(0xFF, 0xBC, 0x69, 0x32),
+ _ => Color.FromArgb(0x00, 0x00, 0x00, 0x00),
+ };
+ }
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_Icon_Locked.png b/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_Icon_Locked.png
new file mode 100644
index 00000000..db6ba038
Binary files /dev/null and b/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_Icon_Locked.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/Factory/SummaryFactory.cs b/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/Factory/SummaryFactory.cs
index f2dcc4f1..240b6e5c 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/Factory/SummaryFactory.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/Factory/SummaryFactory.cs
@@ -5,7 +5,6 @@ using Snap.Hutao.Extension;
using Snap.Hutao.Model;
using Snap.Hutao.Model.Binding.AvatarProperty;
using Snap.Hutao.Model.Intrinsic;
-using Snap.Hutao.Model.Metadata.Annotation;
using Snap.Hutao.Model.Metadata.Converter;
using Snap.Hutao.Model.Metadata.Reliquary;
using Snap.Hutao.Service.Metadata;
@@ -144,7 +143,7 @@ internal class SummaryFactory : ISummaryFactory
Description = reliquary.Description,
// EquipBase
- Level = $"+ {equip.Reliquary!.Level - 1}",
+ Level = $"+{equip.Reliquary!.Level - 1}",
Quality = reliquary.RankLevel,
MainProperty = CreateReliquaryMainProperty(equip.Reliquary.MainPropId, reliquary.RankLevel, equip.Reliquary.Level),
@@ -182,13 +181,13 @@ internal class SummaryFactory : ISummaryFactory
Description = weapon.Description,
// EquipBase
- Level = $"{equip.Weapon!.Level}",
+ Level = $"Lv.{equip.Weapon!.Level}",
Quality = weapon.Quality,
MainProperty = new(string.Empty, string.Empty), // TODO
// Weapon
SubProperty = new(string.Empty, string.Empty), // TODO
- AffixLevel = level + 1,
+ AffixLevel = $"精炼{level + 1}",
AffixName = weapon.Affix?.Name ?? string.Empty,
AffixDescription = weapon.Affix?.Descriptions.Single(a => a.Level == level).Description ?? string.Empty,
};
diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj
index c7e68e11..98e200cc 100644
--- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj
+++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj
@@ -39,6 +39,7 @@
+
@@ -87,6 +88,7 @@
+
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/AvatarPropertyPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/AvatarPropertyPage.xaml
index 39340d11..215da3b8 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Page/AvatarPropertyPage.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/View/Page/AvatarPropertyPage.xaml
@@ -12,8 +12,12 @@
xmlns:shcb="using:Snap.Hutao.Control.Behavior"
xmlns:shci="using:Snap.Hutao.Control.Image"
xmlns:shcm="using:Snap.Hutao.Control.Markup"
- xmlns:shvc="using:Snap.Hutao.View.Control"
+ xmlns:shct="using:Snap.Hutao.Control.Text"
+ xmlns:shmmc="using:Snap.Hutao.Model.Metadata.Converter"
+ xmlns:shvconv="using:Snap.Hutao.View.Converter"
xmlns:shv="using:Snap.Hutao.ViewModel"
+ xmlns:sc="using:SettingsUI.Controls"
+ xmlns:shvcont="using:Snap.Hutao.View.Control"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
d:DataContext="{d:DesignInstance shv:AvatarPropertyViewModel}">
@@ -28,9 +32,11 @@
1
- 0.3
+ 0.5
+
+
@@ -140,15 +146,6 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -196,25 +224,126 @@
Background="Transparent"
BorderBrush="{x:Null}"
Margin="2,2,0,2">
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -254,61 +384,90 @@
-
+
+
+
+
-
-
+
+
+
+
+
+
+
-
+
+
-
-
-
-
-
+
+
-
-
-
+
+
-
-
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -320,7 +479,7 @@
-
+