diff --git a/src/Snap.Hutao/Snap.Hutao/App.xaml b/src/Snap.Hutao/Snap.Hutao/App.xaml
index 8d40cc811..84b7b5a81 100644
--- a/src/Snap.Hutao/Snap.Hutao/App.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/App.xaml
@@ -7,7 +7,6 @@
-
@@ -30,6 +29,7 @@
+
diff --git a/src/Snap.Hutao/Snap.Hutao/Control/AutoSuggestBox/AutoSuggestTokenBox.cs b/src/Snap.Hutao/Snap.Hutao/Control/AutoSuggestBox/AutoSuggestTokenBox.cs
index 00a5a25c4..b39db50d1 100644
--- a/src/Snap.Hutao/Snap.Hutao/Control/AutoSuggestBox/AutoSuggestTokenBox.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Control/AutoSuggestBox/AutoSuggestTokenBox.cs
@@ -1,12 +1,10 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
-using CommunityToolkit.WinUI;
-using CommunityToolkit.WinUI.Controls;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
-using Microsoft.UI.Xaml.Controls.Primitives;
using Snap.Hutao.Control.Extension;
+using Snap.Hutao.Control.TokenizingTextBox;
using System.Collections;
namespace Snap.Hutao.Control.AutoSuggestBox;
@@ -14,33 +12,16 @@ namespace Snap.Hutao.Control.AutoSuggestBox;
[DependencyProperty("FilterCommand", typeof(ICommand))]
[DependencyProperty("FilterCommandParameter", typeof(object))]
[DependencyProperty("AvailableTokens", typeof(IReadOnlyDictionary))]
-internal sealed partial class AutoSuggestTokenBox : TokenizingTextBox
+internal sealed partial class AutoSuggestTokenBox : TokenizingTextBox.TokenizingTextBox
{
public AutoSuggestTokenBox()
{
- DefaultStyleKey = typeof(TokenizingTextBox);
+ DefaultStyleKey = typeof(TokenizingTextBox.TokenizingTextBox);
TextChanged += OnFilterSuggestionRequested;
QuerySubmitted += OnQuerySubmitted;
TokenItemAdding += OnTokenItemAdding;
TokenItemAdded += OnTokenItemCollectionChanged;
TokenItemRemoved += OnTokenItemCollectionChanged;
- Loaded += OnLoaded;
- }
-
- private void OnLoaded(object sender, RoutedEventArgs e)
- {
- if (this.FindDescendant("SuggestionsPopup") is Popup { Child: Border { Child: ListView listView } border })
- {
- IAppResourceProvider appResourceProvider = this.ServiceProvider().GetRequiredService();
-
- listView.Background = null;
- listView.Margin = appResourceProvider.GetResource("AutoSuggestListPadding");
-
- border.Background = appResourceProvider.GetResource("AutoSuggestBoxSuggestionsListBackground");
- CornerRadius overlayCornerRadius = appResourceProvider.GetResource("OverlayCornerRadius");
- CornerRadiusFilterConverter cornerRadiusFilterConverter = new() { Filter = CornerRadiusFilterKind.Bottom };
- border.CornerRadius = (CornerRadius)cornerRadiusFilterConverter.Convert(overlayCornerRadius, typeof(CornerRadius), default, default);
- }
}
private void OnFilterSuggestionRequested(Microsoft.UI.Xaml.Controls.AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
@@ -73,7 +54,7 @@ private void OnQuerySubmitted(Microsoft.UI.Xaml.Controls.AutoSuggestBox sender,
CommandInvocation.TryExecute(FilterCommand, FilterCommandParameter);
}
- private void OnTokenItemAdding(TokenizingTextBox sender, TokenItemAddingEventArgs args)
+ private void OnTokenItemAdding(TokenizingTextBox.TokenizingTextBox sender, TokenItemAddingEventArgs args)
{
if (string.IsNullOrWhiteSpace(args.TokenText))
{
@@ -90,7 +71,7 @@ private void OnTokenItemAdding(TokenizingTextBox sender, TokenItemAddingEventArg
}
}
- private void OnTokenItemCollectionChanged(TokenizingTextBox sender, object args)
+ private void OnTokenItemCollectionChanged(TokenizingTextBox.TokenizingTextBox sender, object args)
{
if (args is SearchToken { Kind: SearchTokenKind.None } token)
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Control/TokenizingTextBox/ITokenStringContainer.cs b/src/Snap.Hutao/Snap.Hutao/Control/TokenizingTextBox/ITokenStringContainer.cs
new file mode 100644
index 000000000..3d8e122e1
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Control/TokenizingTextBox/ITokenStringContainer.cs
@@ -0,0 +1,11 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Snap.Hutao.Control.TokenizingTextBox;
+
+internal interface ITokenStringContainer
+{
+ string Text { get; set; }
+
+ bool IsLast { get; }
+}
diff --git a/src/Snap.Hutao/Snap.Hutao/Control/TokenizingTextBox/InterspersedObservableCollection.cs b/src/Snap.Hutao/Snap.Hutao/Control/TokenizingTextBox/InterspersedObservableCollection.cs
new file mode 100644
index 000000000..d656ef5d2
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Control/TokenizingTextBox/InterspersedObservableCollection.cs
@@ -0,0 +1,350 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using CommunityToolkit.WinUI.Helpers;
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace Snap.Hutao.Control.TokenizingTextBox;
+
+internal sealed class InterspersedObservableCollection : IList, IEnumerable