新增搜索功能,优化JS脚本选择窗口的用户体验

This commit is contained in:
辉鸭蛋
2025-09-07 08:14:58 +08:00
parent e9987c62b1
commit 8e196efe8e
2 changed files with 54 additions and 2 deletions

View File

@@ -52,6 +52,7 @@
CornerRadius="8">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
@@ -77,11 +78,18 @@
Padding="8,4" />
</Grid>
<!-- 搜索框 -->
<ui:TextBox Grid.Row="1"
Margin="12,0,12,8"
Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}"
PlaceholderText="搜索脚本名称或描述..."
ClearButtonEnabled="True" />
<!-- 脚本列表 -->
<ScrollViewer Grid.Row="1"
<ScrollViewer Grid.Row="2"
Margin="4,0,4,8"
VerticalScrollBarVisibility="Auto">
<ListBox ItemsSource="{Binding JsScripts}"
<ListBox ItemsSource="{Binding FilteredJsScripts}"
SelectedItem="{Binding SelectedScript}"
BorderThickness="0"
Padding="0">

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using BetterGenshinImpact.Core.Script;
using BetterGenshinImpact.Core.Script.Project;
@@ -17,9 +18,15 @@ public partial class JsScriptSelectionViewModel : ViewModel
[ObservableProperty]
private ObservableCollection<JsScriptInfo> _jsScripts = [];
[ObservableProperty]
private ObservableCollection<JsScriptInfo> _filteredJsScripts = [];
[ObservableProperty]
private JsScriptInfo? _selectedScript;
[ObservableProperty]
private string _searchText = string.Empty;
[ObservableProperty]
private string _readmeContent = string.Empty;
@@ -75,6 +82,8 @@ public partial class JsScriptSelectionViewModel : ViewModel
}
JsScripts = scripts;
ApplyFilter();
SelectFirstScript();
}
catch (Exception ex)
{
@@ -170,6 +179,41 @@ public partial class JsScriptSelectionViewModel : ViewModel
}
}
partial void OnSearchTextChanged(string value)
{
ApplyFilter();
SelectFirstScript();
}
private void ApplyFilter()
{
if (string.IsNullOrWhiteSpace(SearchText))
{
FilteredJsScripts = new ObservableCollection<JsScriptInfo>(JsScripts);
}
else
{
var filtered = JsScripts.Where(script =>
script.FolderName.Contains(SearchText, StringComparison.OrdinalIgnoreCase) ||
script.Manifest.Name.Contains(SearchText, StringComparison.OrdinalIgnoreCase) ||
script.Description.Contains(SearchText, StringComparison.OrdinalIgnoreCase)
).ToList();
FilteredJsScripts = new ObservableCollection<JsScriptInfo>(filtered);
}
}
private void SelectFirstScript()
{
if (FilteredJsScripts.Count > 0)
{
SelectedScript = FilteredJsScripts[0];
}
else
{
SelectedScript = null;
}
}
[RelayCommand]
private void RefreshScripts()
{