Files
better-genshin-impact/BetterGenshinImpact/View/Windows/GearTask/AddTriggerDialog.xaml
辉鸭蛋 71833a32ff feat(gear-task): 为定时触发器添加可视化 Cron 表达式选择器
引入新的 CronSchedulePicker 控件,提供预设(每日/每周)和手动两种输入模式,改善用户体验。用户可通过直观界面选择执行时间,无需手动编写复杂的 Cron 表达式。同时更新了默认触发时间并优化了相关验证逻辑。
2026-05-04 16:05:04 +08:00

168 lines
8.7 KiB
XML

<ui:FluentWindow x:Class="BetterGenshinImpact.View.Windows.GearTask.AddTriggerDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
xmlns:gearTask="clr-namespace:BetterGenshinImpact.ViewModel.Windows.GearTask"
xmlns:converters="clr-namespace:BetterGenshinImpact.View.Converters"
xmlns:hotKey="clr-namespace:BetterGenshinImpact.View.Controls.HotKey"
xmlns:controls="clr-namespace:BetterGenshinImpact.View.Controls"
d:DataContext="{d:DesignInstance Type=gearTask:AddTriggerDialogViewModel}"
Width="500"
Height="450"
MinWidth="450"
MinHeight="400"
ui:Design.Background="{DynamicResource ApplicationBackgroundBrush}"
ui:Design.Foreground="{DynamicResource TextFillColorPrimaryBrush}"
ExtendsContentIntoTitleBar="True"
FontFamily="{DynamicResource TextThemeFontFamily}"
ResizeMode="NoResize"
WindowStartupLocation="CenterOwner"
WindowStyle="SingleBorderWindow"
WindowBackdropType="Auto"
mc:Ignorable="d">
<ui:FluentWindow.Resources>
<converters:EnumToVisibilityConverter x:Key="EnumToVisibilityConverter" />
</ui:FluentWindow.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- 标题栏 -->
<ui:TitleBar Grid.Row="0" Title="{Binding DialogTitle}">
<ui:TitleBar.Icon>
<ui:ImageIcon Source="pack://application:,,,/Resources/Images/logo.png" />
</ui:TitleBar.Icon>
</ui:TitleBar>
<!-- 主要内容 -->
<ScrollViewer Grid.Row="1" Margin="20" VerticalScrollBarVisibility="Auto">
<StackPanel>
<!-- 触发器名称 -->
<StackPanel>
<ui:TextBlock Text="触发器名称" FontWeight="SemiBold" Margin="0,0,0,8" />
<ui:TextBox x:Name="TriggerNameTextBox"
Text="{Binding TriggerName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
PlaceholderText="请输入触发器名称" />
</StackPanel>
<!-- 触发器类型 -->
<StackPanel Margin="0,16,0,0">
<ui:TextBlock Text="触发器类型" FontWeight="SemiBold" Margin="0,0,0,8" />
<ComboBox ItemsSource="{Binding TriggerTypes}"
SelectedValue="{Binding SelectedTriggerType, Mode=TwoWay}"
SelectedValuePath="Value"
DisplayMemberPath="DisplayName"
IsEnabled="{Binding IsTriggerTypeSelectionEnabled}" />
</StackPanel>
<!-- 定时触发设置 -->
<StackPanel Margin="0,16,0,0"
Visibility="{Binding SelectedTriggerType, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter=Timed}">
<ui:TextBlock Text="定时规则" FontWeight="SemiBold" Margin="0,0,0,8" />
<ComboBox ItemsSource="{Binding CronInputModes}"
SelectedValue="{Binding SelectedCronInputMode, Mode=TwoWay}"
SelectedValuePath="Value"
DisplayMemberPath="DisplayName" />
<StackPanel Margin="0,8,0,0"
Visibility="{Binding SelectedCronInputMode, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter=Preset}">
<controls:CronSchedulePicker CronExpression="{Binding CronExpression, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
<StackPanel Margin="0,8,0,0"
Visibility="{Binding SelectedCronInputMode, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter=Manual}">
<ui:TextBox Text="{Binding CronExpression, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
PlaceholderText="例如: 0 0 8 * * ? (每天8点)"
FontFamily="Consolas" />
</StackPanel>
<ui:TextBlock Text="最终格式: 秒 分 时 日 月 星期 [年]"
FontSize="12"
Foreground="{DynamicResource TextFillColorSecondaryBrush}"
Margin="0,4,0,0" />
</StackPanel>
<!-- 热键触发设置 -->
<StackPanel Margin="0,16,0,0"
Visibility="{Binding SelectedTriggerType, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter=Hotkey}">
<ui:TextBlock Text="快捷键设置" FontWeight="SemiBold" Margin="0,0,0,8" />
<!-- 快捷键类型选择 -->
<Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ui:TextBlock Grid.Column="0"
Text="快捷键类型"
VerticalAlignment="Center" />
<ui:Button Grid.Column="1"
Height="33"
HorizontalAlignment="Left"
Command="{Binding SwitchHotKeyTypeCommand}"
Content="{Binding HotkeyTypeName, Mode=OneWay}"
MinWidth="100" />
</Grid>
<!-- 快捷键配置 -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ui:TextBlock Grid.Column="0"
Text="配置快捷键"
VerticalAlignment="Center" />
<hotKey:HotKeyTextBox Grid.Column="1"
Padding="16,6,16,6"
VerticalAlignment="Center"
HotKeyTypeName="{Binding HotkeyTypeName, Mode=OneWay}"
Hotkey="{Binding SelectedHotkey}"
Style="{StaticResource DefaultTextBoxStyle}"
TextAlignment="Center" />
</Grid>
</StackPanel>
<!-- 关联任务 -->
<StackPanel Margin="0,16,0,0">
<ui:TextBlock Text="关联任务定义" FontWeight="SemiBold" Margin="0,0,0,8" />
<ComboBox ItemsSource="{Binding AvailableTaskDefinitions}"
SelectedItem="{Binding SelectedTaskDefinitionName, Mode=TwoWay}"
IsEditable="True" />
</StackPanel>
</StackPanel>
</ScrollViewer>
<!-- 按钮栏 -->
<Border Grid.Row="2"
BorderBrush="{DynamicResource ControlStrokeColorDefaultBrush}"
BorderThickness="0,1,0,0"
Padding="20,16">
<StackPanel Orientation="Horizontal"
HorizontalAlignment="Right">
<ui:Button Content="取消"
Command="{Binding CancelCommand}"
Appearance="Secondary"
MinWidth="80" />
<ui:Button Content="确定"
Command="{Binding ConfirmCommand}"
Appearance="Primary"
MinWidth="80" />
</StackPanel>
</Border>
</Grid>
</ui:FluentWindow>