From 6999103aaabdfc1febd8ca7ed1bb6338a4ca943a Mon Sep 17 00:00:00 2001 From: DismissedLight <1686188646@qq.com> Date: Sun, 26 Nov 2023 14:35:33 +0800 Subject: [PATCH] refine wiki avatar page ui --- .../Control/Image/CompositionImage.cs | 18 - .../Snap.Hutao/Control/Image/MonoChrome.cs | 10 - .../Control/Layout/UniformStaggeredLayout.cs | 5 +- .../Layout/UniformStaggeredLayoutState.cs | 4 +- .../Snap.Hutao/Control/Theme/FontStyle.xaml | 15 + .../Control/Theme/ItemsPanelTemplate.xaml | 3 + src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs | 4 +- src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj | 6 + .../View/Card/Primitive/HorizontalCard.xaml | 24 + .../Card/Primitive/HorizontalCard.xaml.cs | 17 + .../View/Control/BaseValueSlider.xaml | 66 +- .../View/Control/DescParamComboBox.xaml | 40 +- .../View/Control/DescParamComboBox.xaml.cs | 12 +- .../Snap.Hutao/View/Control/SkillPivot.xaml | 23 +- .../View/Control/SkillPivot.xaml.cs | 21 +- .../Snap.Hutao/View/Page/WikiAvatarPage.xaml | 853 ++++++++++-------- .../ViewModel/Complex/ReliquarySetView.cs | 12 +- 17 files changed, 653 insertions(+), 480 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/View/Card/Primitive/HorizontalCard.xaml create mode 100644 src/Snap.Hutao/Snap.Hutao/View/Card/Primitive/HorizontalCard.xaml.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs b/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs index 9cbc5d20..c049e8aa 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs @@ -30,7 +30,6 @@ internal abstract partial class CompositionImage : Microsoft.UI.Xaml.Controls.Co private readonly IServiceProvider serviceProvider; - private readonly RoutedEventHandler unloadEventHandler; private readonly SizeChangedEventHandler sizeChangedEventHandler; private readonly TypedEventHandler loadedImageSourceLoadCompletedEventHandler; @@ -46,9 +45,6 @@ internal abstract partial class CompositionImage : Microsoft.UI.Xaml.Controls.Co serviceProvider = this.ServiceProvider(); this.DisableInteraction(); - unloadEventHandler = OnUnload; - Unloaded += unloadEventHandler; - sizeChangedEventHandler = OnSizeChanged; SizeChanged += sizeChangedEventHandler; @@ -67,10 +63,6 @@ internal abstract partial class CompositionImage : Microsoft.UI.Xaml.Controls.Co { } - protected virtual void Unloading() - { - } - /// /// 更新视觉对象 /// @@ -240,14 +232,4 @@ internal abstract partial class CompositionImage : Microsoft.UI.Xaml.Controls.Co UpdateVisual(spriteVisual); } } - - private void OnUnload(object sender, RoutedEventArgs e) - { - Unloading(); - spriteVisual?.Dispose(); - spriteVisual = null; - - SizeChanged -= sizeChangedEventHandler; - Unloaded -= unloadEventHandler; - } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Image/MonoChrome.cs b/src/Snap.Hutao/Snap.Hutao/Control/Image/MonoChrome.cs index ac491620..f7fac999 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Image/MonoChrome.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Image/MonoChrome.cs @@ -45,16 +45,6 @@ internal sealed class MonoChrome : CompositionImage return compositor.CompositeSpriteVisual(alphaMaskEffectBrush); } - protected override void Unloading() - { - ActualThemeChanged -= actualThemeChangedEventHandler; - - backgroundBrush?.Dispose(); - backgroundBrush = null; - - base.Unloading(); - } - private void OnActualThemeChanged(FrameworkElement sender, object args) { if (backgroundBrush is not null) diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayout.cs b/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayout.cs index 58b31d1a..96f69e44 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayout.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayout.cs @@ -202,11 +202,8 @@ internal sealed partial class UniformStaggeredLayout : VirtualizingLayout for (int columnIndex = 0; columnIndex < state.NumberOfColumns; columnIndex++) { UniformStaggeredColumnLayout layout = state.GetColumnLayout(columnIndex); - Span layoutSpan = CollectionsMarshal.AsSpan(layout); - for (int i = 0; i < layoutSpan.Length; i++) + foreach (ref readonly UniformStaggeredItem item in CollectionsMarshal.AsSpan(layout)) { - ref readonly UniformStaggeredItem item = ref layoutSpan[i]; - double bottom = item.Top + item.Height; if (bottom < context.RealizationRect.Top) { diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayoutState.cs b/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayoutState.cs index e39662f3..31f8a0ab 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayoutState.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Layout/UniformStaggeredLayoutState.cs @@ -62,11 +62,9 @@ internal sealed class UniformStaggeredLayoutState } } - [SuppressMessage("", "SH007")] internal UniformStaggeredColumnLayout GetColumnLayout(int columnIndex) { - this.columnLayout.TryGetValue(columnIndex, out UniformStaggeredColumnLayout? columnLayout); - return columnLayout!; + return columnLayout[columnIndex]; } /// diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Theme/FontStyle.xaml b/src/Snap.Hutao/Snap.Hutao/Control/Theme/FontStyle.xaml index df613a0d..bffb9f4e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Theme/FontStyle.xaml +++ b/src/Snap.Hutao/Snap.Hutao/Control/Theme/FontStyle.xaml @@ -93,4 +93,19 @@ + + + 1,0 + \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Theme/ItemsPanelTemplate.xaml b/src/Snap.Hutao/Snap.Hutao/Control/Theme/ItemsPanelTemplate.xaml index 28a32452..2778290c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Theme/ItemsPanelTemplate.xaml +++ b/src/Snap.Hutao/Snap.Hutao/Control/Theme/ItemsPanelTemplate.xaml @@ -17,6 +17,9 @@ + + + logger; diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj index 55b4bf4e..8400f6ce 100644 --- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj +++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj @@ -135,6 +135,7 @@ + @@ -318,6 +319,11 @@ + + + MSBuild:Compile + + MSBuild:Compile diff --git a/src/Snap.Hutao/Snap.Hutao/View/Card/Primitive/HorizontalCard.xaml b/src/Snap.Hutao/Snap.Hutao/View/Card/Primitive/HorizontalCard.xaml new file mode 100644 index 00000000..14c6d654 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/View/Card/Primitive/HorizontalCard.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Card/Primitive/HorizontalCard.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Card/Primitive/HorizontalCard.xaml.cs new file mode 100644 index 00000000..b31a5606 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/View/Card/Primitive/HorizontalCard.xaml.cs @@ -0,0 +1,17 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +namespace Snap.Hutao.View.Card.Primitive; + +[DependencyProperty("Left", typeof(UIElement), default!)] +[DependencyProperty("Right", typeof(UIElement), default!)] +internal sealed partial class HorizontalCard : UserControl +{ + public HorizontalCard() + { + InitializeComponent(); + } +} diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/BaseValueSlider.xaml b/src/Snap.Hutao/Snap.Hutao/View/Control/BaseValueSlider.xaml index d50800c2..aeb7ba4b 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Control/BaseValueSlider.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Control/BaseValueSlider.xaml @@ -13,44 +13,44 @@ 0 - + - - - - - - - - - + + + + + + - - diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/DescParamComboBox.xaml b/src/Snap.Hutao/Snap.Hutao/View/Control/DescParamComboBox.xaml index 7b6262a2..a48d31d2 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Control/DescParamComboBox.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Control/DescParamComboBox.xaml @@ -12,31 +12,31 @@ 16,8 0 + 0 + 0 - + - - - - - - - - - - - + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/DescParamComboBox.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Control/DescParamComboBox.xaml.cs index 9f76e5aa..9a33c89c 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Control/DescParamComboBox.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Control/DescParamComboBox.xaml.cs @@ -30,8 +30,16 @@ internal sealed partial class DescParamComboBox : UserControl { if (args.NewValue != args.OldValue && args.NewValue is List> list) { - descParamComboBox.SelectedItem = list.ElementAtOrLastOrDefault(descParamComboBox.PreferredSelectedIndex); + LevelParameters? target = list.ElementAtOrLastOrDefault(descParamComboBox.PreferredSelectedIndex); + descParamComboBox.SelectedItem = target; + descParamComboBox.LevelSelectorComboBox.ItemsSource = list; + descParamComboBox.LevelSelectorComboBox.SelectedItem = target; } } } -} + + private void OnLevelSelectorComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e) + { + SelectedItem = (LevelParameters)((ComboBox)sender).SelectedItem; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/SkillPivot.xaml b/src/Snap.Hutao/Snap.Hutao/View/Control/SkillPivot.xaml index 709ee786..ada71d01 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Control/SkillPivot.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Control/SkillPivot.xaml @@ -2,6 +2,7 @@ x:Class="Snap.Hutao.View.Control.SkillPivot" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:cwc="using:CommunityToolkit.WinUI.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:shch="using:Snap.Hutao.Control.Helper" @@ -17,22 +18,18 @@ - + - - - + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/SkillPivot.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Control/SkillPivot.xaml.cs index deb26f50..b8f2cf13 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Control/SkillPivot.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Control/SkillPivot.xaml.cs @@ -1,6 +1,7 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using CommunityToolkit.WinUI.Controls; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using System.Collections; @@ -11,7 +12,7 @@ namespace Snap.Hutao.View.Control; /// 技能展柜 /// [HighQuality] -[DependencyProperty("Skills", typeof(IList))] +[DependencyProperty("Skills", typeof(IList), null, nameof(OnSkillsChanged))] [DependencyProperty("Selected", typeof(object))] [DependencyProperty("ItemTemplate", typeof(DataTemplate))] internal sealed partial class SkillPivot : UserControl @@ -23,4 +24,22 @@ internal sealed partial class SkillPivot : UserControl { InitializeComponent(); } + + private static void OnSkillsChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) + { + if (sender is SkillPivot skillPivot) + { + if (args.OldValue != args.NewValue && args.NewValue as IList is [object target, ..] list) + { + skillPivot.Selected = target; + skillPivot.SkillSelectorSegmented.ItemsSource = list; + skillPivot.SkillSelectorSegmented.SelectedItem = target; + } + } + } + + private void OnSkillSelectorSegmentedSelectionChanged(object sender, SelectionChangedEventArgs e) + { + Selected = ((Segmented)sender).SelectedItem; + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/WikiAvatarPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/WikiAvatarPage.xaml index 42aaf799..5dc419d4 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/WikiAvatarPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/WikiAvatarPage.xaml @@ -15,6 +15,7 @@ xmlns:shcp="using:Snap.Hutao.Control.Panel" xmlns:shct="using:Snap.Hutao.Control.Text" xmlns:shvc="using:Snap.Hutao.View.Control" + xmlns:shvcp="using:Snap.Hutao.View.Card.Primitive" xmlns:shvw="using:Snap.Hutao.ViewModel.Wiki" d:DataContext="{d:DesignInstance Type=shvw:WikiAvatarViewModel}" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" @@ -24,21 +25,27 @@ - - - - - - - - - + + + + + + + + + + + @@ -80,66 +87,110 @@ - - - + + + + + + + + - - - + + + + + + + + + + + - - - - - 0 - - - - - - - - 1 - - - - - - - - 2 - - - - - - - - - + + + + + + 0 + + + + + + + + 1 + + + + + + + + 2 + + + + + + + + + + + + + + + + @@ -169,14 +220,11 @@ - - - - - + + + + + @@ -194,7 +242,7 @@ @@ -239,7 +287,7 @@ DisplayMode="Inline" IsPaneOpen="True" OpenPaneLength="{StaticResource CompatSplitViewOpenPaneLength}" - PaneBackground="{StaticResource CardBackgroundFillColorSecondaryBrush}"> + PaneBackground="{ThemeResource CardBackgroundFillColorSecondaryBrush}"> + Padding="32" + HorizontalAlignment="Left" + Spacing="16"> - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - + + + Style="{StaticResource BaseTextBlockStyle}" + Text="{shcm:ResourceString Name=ViewPageWiKiAvatarWeaponCombinationHeader}"/> + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Complex/ReliquarySetView.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Complex/ReliquarySetView.cs index 541345c1..d69be780 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Complex/ReliquarySetView.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Complex/ReliquarySetView.cs @@ -27,20 +27,14 @@ internal sealed class ReliquarySetView { StringBuilder nameBuilder = new(); List icons = new(2); - foreach (ReliquarySet set in CollectionsMarshal.AsSpan(sets)) + foreach (ref readonly ReliquarySet set in CollectionsMarshal.AsSpan(sets)) { Model.Metadata.Reliquary.ReliquarySet metaSet = idReliquarySetMap[set.EquipAffixId]; - - if (nameBuilder.Length > 0) - { - nameBuilder.AppendLine(); - } - - nameBuilder.Append(set.Count).Append('×').Append(metaSet.Name); + nameBuilder.Append(set.Count).Append('×').Append(metaSet.Name).Append('+'); icons.Add(RelicIconConverter.IconNameToUri(metaSet.Icon)); } - Name = nameBuilder.ToString(); + Name = nameBuilder.ToString(0, nameBuilder.Length - 1); Icons = icons; } else