6.0 KiB
Epic 1 Details: Foundation & Theme Infrastructure
Epic Goal
建立 Penguin.AvaloniaUI 控件库项目的完整基础设施,实现基于苹果颜色系统的主题框架。该 Epic 交付一个可运行的示例应用,演示浅色和暗色主题的流畅切换,为后续控件开发提供样式和颜色基础。通过该 Epic,验证技术栈选择(Avalonia、ReactiveUI、Semi.Avalonia)的可行性。
Story 1.1: 项目基础设施搭建并初始化示例应用
As a 控件库开发者, I want 建立完整的项目结构和依赖配置,并创建一个可运行的示例应用, so that 我可以在稳定的基础设施上开始控件开发,并有一个测试载体来验证功能。
Acceptance Criteria
-
创建 Monorepo 目录结构,包含以下项目:
src/Penguin.AvaloniaUI/(核心控件库,.NET 8 类库)src/Example/(示例应用,Avalonia 桌面应用)src/Penguin.AvaloniaUI.Tests/(单元测试项目,xUnit)
-
配置
Penguin.AvaloniaUI项目的核心依赖:- Avalonia 11.x(最新稳定版)
- Avalonia.ReactiveUI
- Semi.Avalonia(如果评估后可用)
-
配置
Example项目引用Penguin.AvaloniaUI项目 -
Example 应用能够成功启动,显示一个基础窗口,包含:
- 标题:"Penguin.AvaloniaUI Demo"
- 一个 TextBlock 显示 "Hello World"
- 窗口大小:800x600
-
项目能够在 Windows 平台成功编译和运行
-
创建基础的
.gitignore和README.md -
快速评估 Semi.Avalonia 的可用性:
- 如果 Semi.Avalonia 可用,在 Example 中应用其基础样式
- 如果不可用或过于复杂,记录决策并准备自定义样式系统
Story 1.2: 实现浅色主题和颜色系统
As a 控件库开发者, I want 定义基于苹果颜色系统的语义化颜色,并实现浅色主题, so that 后续开发的控件可以使用一致的颜色语义,且示例应用有专业的视觉呈现。
Acceptance Criteria
-
在
Penguin.AvaloniaUI/Themes/ColorSystem/下创建颜色系统定义:- 定义语义化颜色资源(ResourceDictionary),包含至少以下颜色:
- Primary(主色)
- Secondary(次要色)
- Success(成功)
- Warning(警告)
- Error(错误)
- Background(背景)
- Surface(表面)
- TextPrimary(主要文本)
- TextSecondary(次要文本)
- 定义语义化颜色资源(ResourceDictionary),包含至少以下颜色:
-
在
Penguin.AvaloniaUI/Themes/下创建LightTheme.axaml(浅色主题资源字典):- 为每个语义化颜色定义浅色主题的具体色值
- 确保颜色对比度足够(文本与背景对比度 ≥ 4.5:1)
-
将浅色主题应用到 Example 应用:
- 在
App.axaml中引用LightTheme.axaml - 示例窗口的背景色使用
Background颜色 - TextBlock 的文本色使用
TextPrimary颜色
- 在
-
在 Example 中添加一个演示页面,展示所有语义化颜色:
- 显示每个颜色的名称和色块(使用 Border 或 Rectangle)
- 色块大小:至少 100x50 像素
-
浅色主题下,示例应用视觉呈现专业、清晰,无明显的配色问题
-
在
README.md中添加颜色系统的简要说明
Story 1.3: 实现暗色主题
As a 控件库开发者, I want 基于颜色系统创建暗色主题, so that 控件库可以支持暗色模式,满足长时间使用场景的需求。
Acceptance Criteria
-
在
Penguin.AvaloniaUI/Themes/下创建DarkTheme.axaml(暗色主题资源字典):- 为每个语义化颜色定义暗色主题的具体色值
- 确保颜色对比度足够(文本与背景对比度 ≥ 4.5:1)
- 暗色主题的背景色应较深(避免纯黑 #000000,推荐深灰色系)
-
暗色主题的颜色定义应与浅色主题在语义上对应:
- Primary 在两种主题下都表示"强调色",但色值可以不同
- Background 在浅色主题下是浅色,在暗色主题下是深色
-
修改 Example 应用,支持手动切换到暗色主题:
- 在
App.axaml中暂时保留浅色主题为默认 - 提供注释说明如何切换到暗色主题(修改
App.axaml中的资源引用)
- 在
-
在暗色主题下,颜色演示页面能够正确显示所有暗色主题的颜色
-
暗色主题视觉呈现舒适,无过度刺眼或过暗的问题
-
两种主题下的颜色演示页面应使用相同的 XAML 代码(通过语义化颜色资源绑定)
Story 1.4: 实现运行时主题切换
As a 示例应用的用户, I want 通过 UI 按钮动态切换浅色和暗色主题, so that 我可以快速验证控件库在不同主题下的视觉效果,无需修改代码和重启应用。
Acceptance Criteria
-
在
Penguin.AvaloniaUI/Themes/下创建ThemeManager.cs类:- 提供
ApplyTheme(ThemeType theme)方法,支持动态加载主题资源 - ThemeType 枚举包含
Light和Dark - 主题切换通过替换
Application.Current.Resources中的资源字典实现
- 提供
-
提供一个 ReactiveUI Command:
SwitchThemeCommand- 接受
ThemeType参数 - 调用
ThemeManager.ApplyTheme()切换主题
- 接受
-
在 Example 应用的主窗口添加主题切换按钮:
- 两个按钮:"浅色主题" 和 "暗色主题"(或一个 ToggleButton)
- 按钮绑定到
SwitchThemeCommand - 按钮样式使用当前主题的颜色系统
-
主题切换应流畅无闪烁:
- 切换时间 < 100ms(符合 NFR4)
- 所有使用语义化颜色的控件应自动更新外观
-
主题切换后,颜色演示页面应立即反映新主题的颜色
-
主题状态应持久化(可选,MVP 可以每次启动默认浅色主题)
-
在 Example 中添加一个简单的测试页面,包含多种控件(Button、TextBox、CheckBox),验证主题切换对不同控件的影响