Files
LanMountainDesktop/.trae/specs/window-slide-transition/tasks.md
2026-04-15 10:49:04 +08:00

2.7 KiB
Raw Blame History

Tasks

  • Task 1: 在 AppSettingsSnapshot 中添加 EnableSlideTransition 字段

    • 添加 public bool EnableSlideTransition { get; set; } = false;
    • Clone() 方法中无需特殊处理bool 是值类型)
  • Task 2: 在 MainWindow.axamlDesktopPage 上添加 TranslateTransform 和过渡动画

    • 添加 <TranslateTransform />
    • Grid.Transitions 中添加 TranslateTransform.XDoubleTransition,使用 FluttermotionToken.Duration.Intro 和 DecelerateBezier 缓动
  • Task 3: 在 MainWindow.axaml.cs 中实现退场动画逻辑

    • 添加 _isSlideAnimationActive 标志位
    • 修改 OnMinimizeClick,调用新的 SlideOutAndMinimizeAsync 方法
    • 实现 SlideOutAndMinimizeAsync:读取设置 → 播放退场动画Opacity + 可选滑动)→ 等动画完成 → 最小化 → 重置位置
    • 动画期间设置 DesktopPage.IsHitTestVisible = false
  • Task 4: 在 MainWindow.axaml.cs 中实现入场动画逻辑

    • 添加 public void PrepareEnterAnimation() 方法:禁用过渡 → 设置初始位置Opacity=0, X=屏幕宽度或0→ 重新启用过渡
    • 添加 public void PlayEnterAnimation() 方法触发入场动画Opacity=1, X=0
    • 添加 private bool IsSlideTransitionEnabled() 方法,从设置中读取
  • Task 5: 修改 App.axaml.csRestoreOrCreateMainWindow

    • 在窗口状态切换前调用 mainWindow.PrepareEnterAnimation()
    • 在 FullScreen 状态生效后调用 mainWindow.PlayEnterAnimation()
  • Task 6: 修改 MainWindow.axaml.csOnWindowPropertyChanged

    • _isSlideAnimationActive 为 true 时跳过强制全屏逻辑
  • Task 7: 在 GeneralSettingsPageViewModel 中添加 EnableSlideTransition 属性

    • 添加 [ObservableProperty] private bool _enableSlideTransition;
    • 添加 OnEnableSlideTransitionChanged 持久化方法
    • 在构造函数和 OnSettingsChanged 中加载/同步该设置
    • 添加 IsSlideTransitionAvailable 平台检测属性
  • Task 8: 在 GeneralSettingsPage.axaml 中添加"滑入滑出过渡效果"开关

    • 在"运行时设置"分组中添加 SettingsExpander
    • 仅 Windows 平台显示(使用 IsVisible 绑定到 IsSlideTransitionAvailable
    • 图标使用 ArrowRight
  • Task 9: 构建验证

    • 执行 dotnet build 确保无编译错误

Task Dependencies

  • [Task 2] depends on [Task 1]
  • [Task 3] depends on [Task 1, Task 2]
  • [Task 4] depends on [Task 1, Task 2]
  • [Task 5] depends on [Task 4]
  • [Task 6] depends on [Task 3]
  • [Task 7] depends on [Task 1]
  • [Task 8] depends on [Task 7]
  • [Task 9] depends on [Task 3, Task 4, Task 5, Task 6, Task 7, Task 8]