- 重构版主提示词(14 parts,面向 ClassHelper 灵动岛重构) - ClassIsland 全量规格提示词(20 parts,含分卷与逐章版本) - 投喂指南、分卷、逐节文件 - 调研记录、一致性基线、生成与质检脚本
19 KiB
19 KiB
analysis/windows.md — Part 10(设置中心)与 Part 11(其它窗口)的工作底稿
负责人:windows(Part 10 / Part 11) 工作方式:只读静态分析。未构建、未运行、未截图。所有结论来自源码文本与行号。
1. 已读文件清单(含读取范围)
1.1 设置中心(Part 10 证据)
| 文件 | 行数 | 读取范围 | 用途 |
|---|---|---|---|
repos/ClassIsland/ClassIsland/Views/SettingsWindowNew.axaml |
266 | 全量 | 窗口尺寸、标题栏、导航、抽屉、遮罩、菜单 |
repos/ClassIsland/ClassIsland/Views/SettingsWindowNew.axaml.cs |
883 | 全量 | 导航构建、过滤、缓存、关闭/重启、URI、菜单动作 |
repos/ClassIsland/ClassIsland/Models/Settings.cs |
2655 | 1–900 精读 + 全部字段声明 grep(32–222、1836–1875) | 所有设置默认值 |
Views/SettingPages/GeneralSettingsPage.axaml(.cs) |
315 / 100 | 全量 | 基本页 |
Views/SettingPages/AppearanceSettingsPage.axaml(.cs) |
595 / 57 | 全量 | 外观页 |
Views/SettingPages/WindowSettingsPage.axaml |
276 | 全量 | 窗口页 |
Views/SettingPages/ClockSettingsPage.axaml |
95 | 全量 | 时钟页 |
Views/SettingPages/StorageSettingsPage.axaml |
111 | 全量 | 存储页 |
Views/SettingPages/PrivacySettingsPage.axaml |
42 | 全量 | 隐私页 |
Views/SettingPages/AdvancedSettingsPage.axaml |
77 | 全量 | 高级页 |
Views/SettingPages/ErrorSettingsPage.axaml |
35 | 全量 | 错误页 |
Views/SettingPages/TestSettingsPage.axaml |
17 | 全量 | 调试测试页 |
Views/SettingPages/RefreshingSettingsPage.axaml |
159 | 全量 | 翻新与迎新页 |
Views/SettingPages/ManagementSettingsPage.axaml |
117 | 全量 | 集控页 |
Views/SettingPages/ManagementPolicySettingsPage.axaml |
113 | 全量 | 集控策略页 |
Views/SettingPages/ManagementCredentialsSettingsPage.axaml |
101 | 全量 | 集控凭据页 |
Views/SettingPages/AboutSettingsPage.axaml |
319 | 全量 | 关于页 |
Views/SettingPages/WeatherSettingsPage.axaml |
332 | 全量 | 天气页 |
Views/SettingPages/UpdateSettingsPage.axaml |
403 | 全量 | 更新页 |
Views/SettingPages/ThemesSettingsPage.axaml |
368 | 全量 | 主题页 |
Views/SettingPages/NotificationSettingsPage.axaml |
497 | 全量 | 提醒页 |
Views/SettingPages/ComponentsSettingsPage.axaml |
644 | 全量 | 组件页 |
Views/SettingPages/AutomationSettingsPage.axaml |
402 | 全量 | 自动化页 |
Views/SettingPages/PluginsSettingsPage.axaml(.cs) |
884 / 680 | axaml 全量;cs 1–80 | 插件页 |
Views/SettingPages/DebugPage.axaml |
133 | 全量 | 调试页 |
ClassIsland.Core/Abstractions/Controls/SettingsPageBase.cs |
79 | 全量 | 页面基类、抽屉/重启命令 |
ClassIsland.Core/Extensions/Registry/SettingsWindowRegistryExtensions.cs |
81 | 全量 | 页面/分组注册机制 |
ClassIsland.Core/Services/Registry/SettingsWindowRegistryService.cs |
21 | 全量 | 注册表 |
ClassIsland.Core/Attributes/SettingsPageInfo.cs |
47 | 全量 | 页面元数据定义 |
ClassIsland.Core/Enums/SettingsWindow/SettingsPageCategory.cs |
24 | 全量 | 分类枚举与排序 |
ClassIsland.Core/Attributes/GroupAttribute.cs |
13 | 全量 | 分组 id |
ClassIsland.Core/StylesBase.axaml |
341 | 1–340 | settings-container、cardContainer、Slider tooltip、动画级别相关样式 |
ClassIsland.Core/ThemeBase.axaml |
57 | 全量 | SettingsContainerWidth=960、导航图标尺寸 20、开关默认「开/关」 |
ClassIsland.Core/Controls/ListDetailView.axaml(.cs) |
72 / 91 | 全量 | 设置页两栏布局、压缩阈值 800 |
ClassIsland.Core/Controls/DrawerHost.axaml(.cs) |
87 / 133 | 全量 | 设置抽屉宽度/动画/交互 |
ClassIsland.Core/Controls/MyWindow.cs |
244 | 全量 | 窗口基类、Mica、F3/F6/F7、Toast adorner |
ClassIsland/App.Services.xaml.cs |
326 | 130–209 | 页面注册顺序、分组、Excel/窗口 DI |
ClassIsland/ViewModels/SettingsNewViewModel.cs |
207 | 全量 | 窗口 VM 字段 |
ClassIsland/Services/SettingsService.cs |
294 | 100–294 | 即时保存、设置叠层、迁移 |
ClassIsland/Views/SettingPages/PluginsSettingsPage.axaml.cs |
680 | 1–80 | 插件市场首次刷新策略(7 天) |
1.2 其它窗口(Part 11 证据)
| 文件 | 行数 | 读取范围 |
|---|---|---|
Views/WelcomeWindow.axaml(.cs) |
30 / 244 | 全量 |
Views/WelcomePages/WelcomePage.axaml(.cs) |
102 / 70 | 全量 |
Views/WelcomePages/LicensePage.axaml |
44 | 全量 |
Views/WelcomePages/RefreshingPage.axaml |
91 | 全量 |
Views/WelcomePages/GeneralPage.axaml |
50 | 全量 |
Views/WelcomePages/ColorThemePage.axaml |
81 | 全量 |
Views/WelcomePages/AppearancePage.axaml |
80 | 全量 |
Views/WelcomePages/SystemPage.axaml |
101 | 全量 |
Views/WelcomePages/FinishPage.axaml |
99 | 全量 |
Controls/OobeIntroAnimationControl.axaml(.cs) |
144 / 165 | 全量 |
Views/SplashWindow.axaml(.cs) |
100 / 131 | 全量 |
Services/SplashService.cs |
93 | 全量 |
Views/CrashWindow.axaml(.cs) |
99 / 86 | 全量 |
Views/RecoveryWindow.axaml |
22 | 全量 |
Views/RecoveryPages/HomePage.axaml |
85 | 全量 |
Views/RecoveryPages/RecoverBackupPage.axaml |
45 | 全量 |
Views/UpdateProgressWindow.xaml |
39 | 全量 |
Views/TimeAdjustmentWindow.axaml |
101 | 全量(cs 未读) |
Views/ClassChangingWindow.axaml(.cs) |
273 / 193 | 全量 |
Views/ClassPlanDetailsWindow.axaml |
199 | 全量(cs 未读) |
Views/ExcelImportWindow.xaml |
992 | 全量 |
Views/ExcelImportWindow.xaml.cs |
824 | 1–45、320–429、735–824 + grep(整文件被 #if false 包裹) |
Views/ExcelExportWindow.xaml |
301 | 全量 |
Views/ExcelExportWindow.xaml.cs |
539 | 1–30(#if false,未读其余) |
Views/DataTransferWindow.axaml(.cs) |
20 / 57 | 全量 |
Views/DataTransferPage.axaml |
273 | 全量 |
Views/DataTransferPage.axaml.cs |
803 | 1–120 + grep(ImportDescription) |
Views/TutorialCenterWindow.axaml(.cs) |
249 / 85 | 全量 |
Views/TutorialControllerWindow.axaml |
46 | 全量(cs 未读) |
Views/TutorialEditorWindow.axaml |
378 | 全量(cs 未读) |
Views/TutorialScriptEditWindow.axaml |
29 | 全量(cs 未读) |
Views/AuthorizeWindow.axaml |
153 | 全量(cs 未读) |
Controls/AuthorizeProvider/PasswordAuthorizeProvider.axaml |
67 | 全量 |
Controls/JoinManagementDialog.axaml |
64 | 全量 |
Views/AppLogsWindow.axaml |
178 | 全量(cs 未读) |
Views/ConfigErrorsWindow.xaml |
106 | 全量 |
Views/InstanceExistedWindow.xaml |
54 | 全量 |
Views/WindowsPicker.xaml |
150 | 全量 |
Views/WallpaperPreviewWindow.xaml |
74 | 全量 |
Views/TopmostEffectWindow.axaml |
35 | 全量 |
Views/ClearNotificationButtonWindow.xaml |
15 | 全量 |
Views/RefreshingScopesConfigDialog.axaml |
60 | 全量 |
Views/WindowRuleDebugWindow.axaml |
30 | 全量 |
Views/ScreenshotHelperWindow.axaml |
37 | 全量 |
Views/FeatureDebugWindow.xaml |
246 | 1–120(其余为内部测试页签) |
Views/DevPortalWindow.axaml |
269 | 全量 |
Views/ProfileSettingsWindow.axaml |
2004 | 1–80(仅窗口外壳;内容归 part 06) |
2. 设置页面清单(导航顺序 = 注册顺序,证据 App.Services.xaml.cs:156-184、SettingsWindowNew.axaml.cs:145-227)
| # | id | 名称 | category | 分组 | 图标(未选/选中) | 关键策略过滤 |
|---|---|---|---|---|---|---|
| 1 | general | 基本 | Internal | classisland.general(通用) | EF27/EF26(默认) | DisableSettingsEditing |
| 2 | clock | 时钟 | Internal | 通用 | E4C4/E4C3 | 同上 |
| 3 | storage | 存储 | Internal | 通用 | E6B7/E6B6 | 同上 |
| 4 | privacy | 隐私 | Internal | 通用 | EF65/EF64 | 同上 |
| 5 | refreshing | 翻新与迎新 | Internal | 通用 | E0B8/E0B9 | 同上 |
| 6 | advanced | 高级 | Internal | 通用 | F49F/F49E | 同上 |
| 7 | components | 组件 | Internal | classisland.mainwindow(主界面) | E06F/E06F | 同上 |
| 8 | appearance | 外观 | Internal | 主界面 | E51E/E51D | 同上 |
| 9 | window | 窗口 | Internal | 主界面 | F485/F484 | 同上 |
| 10 | notification | 提醒 | Internal | — | E02B/E02A | 同上 |
| 11 | weather | 天气 | Internal | — | F44F/F44E | 同上 |
| 12 | automation | 自动化 | Internal | — | EEF1/EEF0 | 同上 |
| 13 | update | 更新 | Internal | — | E161/E160 | 注册条件:AllowedPackageTypes |
| 14 | classisland.plugins | 插件 | External | — | E071/E071 | FullWidthPage;DisableSettingsEditing |
| 15 | classisland.themes | 主题 | External | — | E6AF/E6AE | 同上 |
| 16 | test-settings-page | 测试页面 | Debug | — | 默认 | DisableDebugMenu / IsDebugOptionsEnabled |
| 17 | debug | 调试 | Debug | — | E2C8/E2C7 | 同上 |
| 18 | about | 关于 ClassIsland | About | — | E9E4/E9E3 | 无(始终可见) |
| 19 | management | 集控 | About | — | 默认 | hideDefault |
| 20 | management.credentials | 集控凭据设置 | About | — | 默认 | hideDefault |
| 21 | management.policy | 集控策略 | About | — | 默认 | hideDefault |
| 22 | _error | 出错啦! | About | — | 默认 | hideDefault(错误页) |
设置窗口:1240×550,MinWidth=560,导航窗格 OpenPaneLength=283,内容限宽 960,压缩阈值 800,标题栏高 48(SettingsWindowNew.axaml:16-22、:52-60、:92-104、.cs:135、:437-446)。
3. 窗口清单表
| 窗口/页面 | 尺寸 (W×H) | 最小/最大 | 模态/单例 | 关键样式 | 证据 |
|---|---|---|---|---|---|
| 设置窗口 SettingsWindowNew | 1240×550 | MinW 560 | 非模态单例 | Mica、自定义标题栏 48、导航 283 | SettingsWindowNew.axaml:16-22 |
| 欢迎向导 WelcomeWindow | 800×600 | 不可缩放 | 模态(ShowAsDialog) | Mica、CenterScreen | WelcomeWindow.axaml:14-20 |
| 闪屏 SplashWindow | 400×100 | — | 非模态、置顶 | 无边框、背景透明、Acrylic、暗色 | SplashWindow.axaml:12-23 |
| 崩溃 CrashWindow | 800×450 | — | 独立 | Mica | CrashWindow.axaml:13-16 |
| 恢复 RecoveryWindow | 450×600 | — | 主窗口(-m -r) | 无 Mica 声明 | RecoveryWindow.axaml:14 |
| 更新进度 UpdateProgressWindow | 300×100 | 不可缩放 | 置顶/手动定位 | 纯色 | UpdateProgressWindow.xaml:9-24 |
| 对齐铃声 TimeAdjustmentWindow | 600×330 | 不可缩放 | CenterOwner | Mica | TimeAdjustmentWindow.axaml:11-16 |
| 换课 ClassChangingWindow | 600×250(SizeToContent) | Min 730×175 | CenterScreen | Mica | ClassChangingWindow.axaml:17-26 |
| 课表详细信息 ClassPlanDetailsWindow | 800×500 | — | 独立 | Mica、三列 1*/5px/2* | ClassPlanDetailsWindow.axaml:14-23 |
| Excel 导入 | 最大化(设计 800×450) | — | 模态 | 源码停用,本实现 P1 重建(xlsx) | ExcelImportWindow.xaml:27-34 |
| Excel 导出 | 1400×700、最大化 | — | 独立 | 源码停用,本实现 P1 重建(xlsx) | ExcelExportWindow.xaml:14-25 |
| 数据迁移 DataTransferWindow | 800×600 | 不可缩放 | 模态(ShowAsDialog) | Mica | DataTransferWindow.axaml:9-18 |
| 授权 AuthorizeWindow | 500×SizeToContent | MinH 300 / MaxH 700 | 模态、置顶 | — | AuthorizeWindow.axaml:14-24 |
| 加入管理 JoinManagementDialog | 400×Auto | 不可缩放 | 对话框 | — | JoinManagementDialog.axaml:12-15 |
| 教学中心 TutorialCenterWindow | 1240×550 | — | 非模态单例 | Mica、SplitView 328 | TutorialCenterWindow.axaml:14、:58-63 |
| 教程控制条 TutorialControllerWindow | SizeToContent | 不可缩放 | 置顶无边框 | Acrylic、透明 | TutorialControllerWindow.axaml:10-17 |
| 教程编辑器 TutorialEditorWindow | 最大化 | — | 独立 | 五列 220/Auto/*/Auto/328 | TutorialEditorWindow.axaml:15、:239 |
| 教程脚本编辑 TutorialScriptEditWindow | 800×520 | 480×320 | 独立 | 深色代码编辑器 | TutorialScriptEditWindow.axaml:9-11 |
| 日志 AppLogsWindow | 1200×600 | — | 非模态单例 | Mica | AppLogsWindow.axaml:15 |
| 配置错误 ConfigErrorsWindow | 1200×600 | — | 独立 | 纯色 | ConfigErrorsWindow.xaml:18 |
| 实例已存在 InstanceExistedWindow | 800×450 | 不可缩放 | 独立 | 纯色 | InstanceExistedWindow.xaml:20-22 |
| 窗口选择 WindowsPicker | 1300×600 | — | 对话框 | MaterialDesign 混合 | WindowsPicker.xaml:13 |
| 壁纸预览 WallpaperPreviewWindow | 800×450 | — | CenterOwner | 纯色 | WallpaperPreviewWindow.xaml:11 |
| 顶层特效 TopmostEffectWindow | 1×1(运行时全屏) | 不可缩放 | 置顶无边框 | 透明 | TopmostEffectWindow.axaml:8-15 |
| 清除通知按钮 ClearNotificationButtonWindow | SizeToContent | — | 不实现(源码 #if false) |
空按钮遗留 | ClearNotificationButtonWindow.xaml:8-11 |
| 翻新范围 RefreshingScopesConfigDialog | 400×600 | 不可缩放 | 模态 | — | RefreshingScopesConfigDialog.axaml:9-14 |
| 窗口规则调试 WindowRuleDebugWindow | 400×Auto | — | 置顶 | Mica | WindowRuleDebugWindow.axaml:9-14 |
| 截图辅助 ScreenshotHelperWindow | 未设(Auto) | — | 独立 | — | ScreenshotHelperWindow.axaml:1-10 |
| 功能调试 FeatureDebugWindow | 800×450 | — | 独立(开发) | 纯色 | FeatureDebugWindow.xaml:28 |
| DevPortal | 1200×700 | — | 独立(开发) | Mica | DevPortalWindow.axaml:17-21 |
| OOBE 各页 | 800×600 内 | — | 导航页 | settings-container 限宽 600 | 各 WelcomePages/*.axaml |
| 数据迁移页 | 800×600 内 | — | Carousel 5 页 | 限宽 600 | DataTransferPage.axaml:17-23 |
| 恢复子页 | 450×600 内 | — | Frame | — | RecoveryPages/*.axaml |
4. 关键判定与发现
- 设置持久化是「逐属性即时写盘」:
SettingsService.SettingsChanged在每个属性变化后调用SaveSettings(propertyName)(Services/SettingsService.cs:261-280、:171-179);[JsonIgnore]字段(IsSentryEnabled、ShowSellingAnnouncement)不写Settings.json(Models/Settings.cs:518-535、:2615-2628)。 - 设置叠层:
SettingsOverlaysJSON 键名为SettingsOverlay;叠层用"@"保存原始值,guid为各写入者(Models/Settings.cs:263-273、SettingsService.cs:191-259)。用户在 UI 改任意属性会清掉该属性全部叠层。 - 页面缓存:
SettingsPagesCachePolicy仅在两处使用(SettingsWindowNew.axaml.cs:425-428、:513-516);0不缓存、1窗口内缓存、>=2跨窗口缓存为推断。 - OOBE 实际为 8 页(
WelcomeWindow.axaml.cs:64-73),不是任务描述中的「9 页」;页序为 欢迎/许可/翻新/基本/颜色主题/外观/系统/完成,且按 isRefreshing/isOnboarding 条件裁剪。 - Excel 导入/导出源码为停用遗留:两个 code-behind 文件整体被
#if false包裹(ExcelImportWindow.xaml.cs:1、ExcelExportWindow.xaml.cs:1),DI 注册被注释(App.Services.xaml.cs:204-205),且原实现依赖 WPF/ReoGrid/System.Windows.Forms。Lead 最终裁决:本实现按 P1 必须实现(用xlsx重建,ReoGrid/WPF 仅作参考),与 part 06 口径一致;Part 11 已按此改写并给出xlsx/Vue 网格技术约束。 - 无通知中心窗口:全仓库
Views/下不存在通知中心类窗口;提醒呈现依赖主界面行 + 强提醒特效(part 07 范围)。Lead 已确认该结论并在 part 01 修正提法;Part 11 明确「不得创建通知中心窗口」。 6b. ClearNotificationButtonWindow 为#if false遗留(内容仅空按钮):Lead 裁决不实现,清除提醒改由主界面右键菜单「清除全部提醒」承担(归 part 04/07)。Part 11 已改写为「不实现」,不再列为实现窗口。 - 设置抽屉:统一为右侧抽屉,动画
250ms cubic-bezier(0,0,0,1),Esc/点遮罩关闭,只有IThemeService.AnimationLevel>=1才启用动画(DrawerHost.axaml:42-59、.cs:70-72、:78-118)。不同页面抽屉宽度:实验性 332、城市搜索 320、主题排序 300、主题错误 450、插件源 500、插件更新 320、更新下载 450、更新日志 500、提醒源 500、规则集 600。 - 响应式:设置窗口
<800px进入压缩模式;ListDetailView 自身也有<800px(MinCompressWidth=800)压缩阈值,因此提醒/插件/自动化页在 800px 附近会二次压缩。 - 标题栏右侧「金刚键空位」140px 与 macOS 左侧 60px 是 FluentAvalonia AppWindow 的窗口控制区预留(
SettingsWindowNew.axaml:120-126、:252)。 - 调试快捷键:F3/F6/F7 是窗口基类统一行为,不限于设置窗口(
MyWindow.cs:115-166)。
5. 未决问题 / 缺口(交给 Lead 决策)
- FluentAvalonia 控件自带几何值缺失:
SettingsExpander/SettingsExpanderItem的行高、内边距、圆角、图标槽宽度来自 FluentAvalonia 主题包,仓库中只有覆盖样式(如MinHeight调整、CornerRadius覆盖),没有完整数值。Part 10 中相关数值已标注【推断】(建议实现时取min-height: 64px、padding: 16px、圆角 4–7px)。 SettingsPagesCachePolicy = 2的语义为推断(源码只区分>=1与<=1)。若 Lead 有 1.x 文档可确认。- 部分设置页的 .cs 行为未读(
WindowSettingsPage.axaml.cs、NotificationSettingsPage.axaml.cs、UpdateSettingsPage.axaml.cs等):其「立即生效 vs 重启」结论主要来自 XAML 绑定 +RequestRestart调用点。已确认需重启:AnimationLevel、IsWaitForTransientDisabled;其余(渲染模式、系统标题栏、Qt 缩放)标注为推断。 - ProfileSettingsWindow(档案编辑,2004 行)与 EditModeView(编辑模式) 只记录了窗口外壳参数(
MinWidth=750、1100×600、Mica、标题「档案编辑」),内容归 part 06 / part 04。若 Lead 希望 Part 11 覆盖其内部三栏布局,需要追加分配。 - TimeAdjustmentWindow 的校准数学、TopmostEffectWindow 的全屏放置逻辑、TutorialControllerWindow 的定位逻辑均在未读的 .cs 中(分别为 .cs 6173/4461/2568 字节),本文只给出 UI 规格与推断行为;如需精确算法需再读这三个文件。
- Excel 功能已裁决:Lead 定为 P1 必须实现(xlsx 重建;ReoGrid/WPF 仅参考),与 part 06 同步;Part 11 已删除「可选/遗留、默认不实现」措辞并补齐技术约束与验收项。
- 通知中心(简报 §6 中 part 11 的关键词)在源码中不存在;建议 Lead 在 part 07 中说明提醒的呈现位置,并在总纲中更正该关键词。
- OOBE 页数与简报不一致(8 vs 9);建议以源码为准。
- 「搜索设置」功能不存在:任务描述提到「设置中心:导航/搜索」,但
SettingsWindowNew无搜索框。Part 10 已注明不得编造。 - 多语言/本地化:设置页与窗口文案在源码中为硬编码中文(未走
Localization资源)。Lead 裁决:保留中文字面量作为规格,但要求集中到常量文件(Part 10 §10.5 第 8 条、Part 11 §11.1 第 6 条已写入)。