From f59043d70819beb775cd649c49ca880248e8af6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Tue, 17 Feb 2026 21:55:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=A7=A6=E5=8F=91=E5=99=A8):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=A7=A6=E5=8F=91=E5=99=A8=E7=BC=96=E8=BE=91=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在触发器页面添加“编辑选中项”按钮 - 扩展添加触发器对话框以支持编辑模式 - 实现触发器数据的回显和更新逻辑 - 通过绑定动态更新对话框标题 --- .../View/Pages/GearTriggerPage.xaml | 12 ++++- .../Windows/GearTask/AddTriggerDialog.xaml | 4 +- .../Windows/GearTask/AddTriggerDialog.xaml.cs | 16 +++++- .../Pages/GearTriggerPageViewModel.cs | 49 ++++++++++++++++++- .../GearTask/AddTriggerDialogViewModel.cs | 35 ++++++++++++- 5 files changed, 109 insertions(+), 7 deletions(-) diff --git a/BetterGenshinImpact/View/Pages/GearTriggerPage.xaml b/BetterGenshinImpact/View/Pages/GearTriggerPage.xaml index 0704debf..dd594e44 100644 --- a/BetterGenshinImpact/View/Pages/GearTriggerPage.xaml +++ b/BetterGenshinImpact/View/Pages/GearTriggerPage.xaml @@ -362,6 +362,11 @@ Icon="{ui:SymbolIcon Add24}" Appearance="Primary" Margin="0,0,8,0" /> + + - \ No newline at end of file + diff --git a/BetterGenshinImpact/View/Windows/GearTask/AddTriggerDialog.xaml b/BetterGenshinImpact/View/Windows/GearTask/AddTriggerDialog.xaml index 368b3e5f..69214257 100644 --- a/BetterGenshinImpact/View/Windows/GearTask/AddTriggerDialog.xaml +++ b/BetterGenshinImpact/View/Windows/GearTask/AddTriggerDialog.xaml @@ -34,7 +34,7 @@ - + @@ -149,4 +149,4 @@ - \ No newline at end of file + diff --git a/BetterGenshinImpact/View/Windows/GearTask/AddTriggerDialog.xaml.cs b/BetterGenshinImpact/View/Windows/GearTask/AddTriggerDialog.xaml.cs index 3a6940e5..91c42670 100644 --- a/BetterGenshinImpact/View/Windows/GearTask/AddTriggerDialog.xaml.cs +++ b/BetterGenshinImpact/View/Windows/GearTask/AddTriggerDialog.xaml.cs @@ -82,4 +82,18 @@ public partial class AddTriggerDialog var result = dialog.ShowDialog(); return result == true ? dialog.ViewModel : null; } -} \ No newline at end of file + + public static AddTriggerDialogViewModel? ShowEditTriggerDialog(GearTriggerViewModel existingTrigger) + { + var storageService = App.GetRequiredService(); + var logger = App.GetRequiredService>(); + var viewModel = new AddTriggerDialogViewModel(storageService, logger, existingTrigger); + + var dialog = new AddTriggerDialog(viewModel) + { + Owner = Application.Current.MainWindow + }; + var result = dialog.ShowDialog(); + return result == true ? dialog.ViewModel : null; + } +} diff --git a/BetterGenshinImpact/ViewModel/Pages/GearTriggerPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/GearTriggerPageViewModel.cs index 041a746c..be605e06 100644 --- a/BetterGenshinImpact/ViewModel/Pages/GearTriggerPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/GearTriggerPageViewModel.cs @@ -27,6 +27,11 @@ public partial class GearTriggerPageViewModel : ViewModel [ObservableProperty] private GearTriggerViewModel? _selectedTrigger; + partial void OnSelectedTriggerChanged(GearTriggerViewModel? value) + { + EditTriggerCommand.NotifyCanExecuteChanged(); + } + [ObservableProperty] private GearTaskDefinitionViewModel? _selectedTaskDefinition; @@ -225,6 +230,7 @@ public partial class GearTriggerPageViewModel : ViewModel var newTrigger = new GearTriggerViewModel(dialog.TriggerName, TriggerType.Hotkey) { Hotkey = dialog.SelectedHotkey, + HotkeyType = dialog.HotkeyType, TaskDefinitionName = dialog.SelectedTaskDefinitionName, IsEnabled = true }; @@ -256,4 +262,45 @@ public partial class GearTriggerPageViewModel : ViewModel // 保存数据 _ = SaveTriggersAsync(); } -} \ No newline at end of file + + private bool CanEditTrigger() + { + return SelectedTrigger != null; + } + + [RelayCommand(CanExecute = nameof(CanEditTrigger))] + private void EditTrigger() + { + if (SelectedTrigger is not { } selectedTrigger) + { + return; + } + + var dialog = AddTriggerDialog.ShowEditTriggerDialog(selectedTrigger); + if (dialog == null) + { + return; + } + + selectedTrigger.Name = dialog.TriggerName; + selectedTrigger.IsEnabled = dialog.IsEnabled; + selectedTrigger.TaskDefinitionName = dialog.SelectedTaskDefinitionName; + + if (selectedTrigger.TriggerType == TriggerType.Timed) + { + selectedTrigger.CronExpression = dialog.CronExpression; + selectedTrigger.Hotkey = null; + } + else if (selectedTrigger.TriggerType == TriggerType.Hotkey) + { + selectedTrigger.Hotkey = dialog.SelectedHotkey; + selectedTrigger.HotkeyType = dialog.HotkeyType; + selectedTrigger.CronExpression = null; + } + + selectedTrigger.ModifiedTime = DateTime.Now; + selectedTrigger.UpdateNextRunTime(); + + _ = SaveTriggersAsync(); + } +} diff --git a/BetterGenshinImpact/ViewModel/Windows/GearTask/AddTriggerDialogViewModel.cs b/BetterGenshinImpact/ViewModel/Windows/GearTask/AddTriggerDialogViewModel.cs index 8556f8f0..9a11eeac 100644 --- a/BetterGenshinImpact/ViewModel/Windows/GearTask/AddTriggerDialogViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Windows/GearTask/AddTriggerDialogViewModel.cs @@ -21,6 +21,9 @@ public partial class AddTriggerDialogViewModel : ObservableObject private readonly GearTaskStorageService _storageService; private readonly ILogger _logger; + [ObservableProperty] + private string _dialogTitle = "新增触发器"; + [ObservableProperty] private string _triggerName = string.Empty; @@ -112,6 +115,34 @@ public partial class AddTriggerDialogViewModel : ObservableObject LoadAvailableTaskDefinitions(); } + public AddTriggerDialogViewModel(GearTaskStorageService storageService, ILogger logger, GearTriggerViewModel existingTrigger) + { + _storageService = storageService; + _logger = logger; + + DialogTitle = "编辑触发器"; + IsTriggerTypeSelectionEnabled = false; + + SelectedTriggerType = existingTrigger.TriggerType; + TriggerName = existingTrigger.Name; + IsEnabled = existingTrigger.IsEnabled; + SelectedTaskDefinitionName = existingTrigger.TaskDefinitionName; + + CronExpression = existingTrigger.TriggerType == TriggerType.Timed + ? (existingTrigger.CronExpression ?? CronExpression) + : CronExpression; + + SelectedHotkey = existingTrigger.TriggerType == TriggerType.Hotkey + ? existingTrigger.Hotkey + : null; + + HotkeyType = existingTrigger.TriggerType == TriggerType.Hotkey + ? existingTrigger.HotkeyType + : HotKeyTypeEnum.KeyboardMonitor; + + LoadAvailableTaskDefinitions(); + } + /// /// 生成默认触发器名称 /// @@ -145,7 +176,7 @@ public partial class AddTriggerDialogViewModel : ObservableObject _logger.LogInformation("已加载 {Count} 个可用的任务定义", AvailableTaskDefinitions.Count); // 如果有任务定义,默认选择第一个 - if (AvailableTaskDefinitions.Count > 0) + if (AvailableTaskDefinitions.Count > 0 && string.IsNullOrWhiteSpace(SelectedTaskDefinitionName)) { SelectedTaskDefinitionName = AvailableTaskDefinitions[0]; } @@ -244,4 +275,4 @@ public partial class AddTriggerDialogViewModel : ObservableObject // 移除旧的示例代码,现在使用HotKeyTextBox直接设置 // HotKeyTextBox会直接绑定到SelectedHotkey属性 } -} \ No newline at end of file +}