# 天气组件 Material Design 重设计计划
> **目标:** 全面重构阑山桌面天气组件的视觉设计,遵循 Material Design 3 规范,参考 Google Weather、几何天气、Breez 天气和柠檬天气的设计语言。
---
## 当前状态分析
### 现有组件
1. **WeatherWidget** - 基础天气(温度+天气状况+位置)
2. **ExtendedWeatherWidget** - 扩展天气(含指标、逐小时、逐日预报)
3. **HourlyWeatherWidget** - 逐小时天气
4. **MultiDayWeatherWidget** - 多日天气
5. **WeatherClockWidget** - 天气时钟
### 现有问题
- 排版层次不清晰,文字大小对比不够
- 布局过于紧凑,缺乏呼吸感
- 内部卡片使用简单纯色背景,缺乏 Material 风格
- 背景场景和前景内容缺乏深度分离
- 圆角和间距不统一
### 现有视觉系统
- 4套调色板:Google(默认)、Geometric、Breezy、LemonFlutter
- 动态背景场景:MaterialWeatherSceneControl 绘制渐变+装饰
- 图标系统:WeatherIconView + WeatherIconAssetResolver
---
## 设计方向
### 核心原则
1. **Material Design 3** - 使用 M3 的排版、颜色、间距和形状规范
2. **信息层级清晰** - 大字体温度、次要信息弱化
3. **呼吸感** - 合理的间距和留白
4. **深度感** - 前景卡片与背景场景分离
5. **圆角一致性** - 遵循 DesignCornerRadius 规范
### 参考风格
- **Google Weather** - 大字体温度、清晰层级、圆角卡片、柔和渐变
- **几何天气** - 几何装饰、现代感
- **Breez** - 清新留白、柔和色彩
- **柠檬天气** - 活泼明亮
---
## 具体改动计划
### Task 1: 优化 MaterialWeatherPalette 和调色板系统
**文件:** `LanMountainDesktop/Views/Components/MaterialWeatherVisualTheme.cs`
**改动:**
- 调整所有调色板的对比度,确保文字可读性
- 优化背景渐变色彩,更加柔和自然
- 统一文字主色和次色的对比度比例
- 为每个风格增加 `SurfaceColor` 和 `SurfaceVariantColor` 用于卡片背景
**当前调色板字段:**
```csharp
public sealed record MaterialWeatherPalette(
Color BackgroundTop,
Color BackgroundBottom,
Color PrimaryShape,
Color SecondaryShape,
Color AccentShape,
Color TextPrimary,
Color TextSecondary,
Color SurfaceTint,
Color OverlayTint);
```
**新增字段:**
```csharp
Color SurfaceColor, // 卡片表面色(低透明度白色/黑色)
Color SurfaceVariantColor, // 变体表面色
Color OutlineColor // 分割线/边框色
```
---
### Task 2: 重构 WeatherWidget(基础天气组件)
**文件:**
- `LanMountainDesktop/Views/Components/WeatherWidget.axaml`
- `LanMountainDesktop/Views/Components/WeatherWidget.axaml.cs`
**设计目标:**
- 大字体温度显示(类似 Google Weather)
- 天气状况文字清晰可读
- 位置和温度范围弱化显示
- 图标与文字对齐优化
**XAML 改动:**
```xml
```
**CS 改动:**
- 调整响应式布局的字体缩放比例
- 更新颜色绑定使用新的调色板字段
---
### Task 3: 重构 ExtendedWeatherWidget(扩展天气组件)
**文件:**
- `LanMountainDesktop/Views/Components/ExtendedWeatherWidget.axaml`
- `LanMountainDesktop/Views/Components/ExtendedWeatherWidget.axaml.cs`
**设计目标:**
- 顶部区域:位置+温度+图标横向排列
- 指标区域:使用 Material 3 风格的标签卡片
- 逐小时预报:水平滚动卡片,时间+图标+温度
- 逐日预报:列表式布局,日期+图标+高低温
**XAML 改动:**
```xml
```
**CS 改动:**
- `CreateMetric` 方法:使用圆角卡片,Material 3 风格标签
- `BuildHourlyItems` 方法:改进卡片样式,统一圆角
- `BuildDailyItems` 方法:改进卡片样式,统一圆角
---
### Task 4: 重构 HourlyWeatherWidget(逐小时天气组件)
**文件:**
- `LanMountainDesktop/Views/Components/HourlyWeatherWidget.axaml`
- `LanMountainDesktop/Views/Components/HourlyWeatherWidget.axaml.cs`
**设计目标:**
- 顶部简洁信息栏
- 逐小时预报使用 Material 卡片风格
- 时间、图标、温度垂直排列
**XAML 改动:**
```xml
```
---
### Task 5: 重构 MultiDayWeatherWidget(多日天气组件)
**文件:**
- `LanMountainDesktop/Views/Components/MultiDayWeatherWidget.axaml`
- `LanMountainDesktop/Views/Components/MultiDayWeatherWidget.axaml.cs`
**设计目标:**
- 左侧:当前天气信息(图标+温度+状况+位置)
- 右侧:多日预报列表,使用行式布局
**XAML 改动:**
```xml
```
---
### Task 6: 重构 WeatherClockWidget(天气时钟组件)
**文件:**
- `LanMountainDesktop/Views/Components/WeatherClockWidget.axaml`
- `LanMountainDesktop/Views/Components/WeatherClockWidget.axaml.cs`
**设计目标:**
- 左侧:大字体时间+日期
- 右侧:天气图标+温度+状况
- 信息层级清晰
**XAML 改动:**
```xml
```
---
### Task 7: 更新 ExtendedWeatherWidget 的代码后置文件
**文件:** `LanMountainDesktop/Views/Components/ExtendedWeatherWidget.axaml.cs`
**改动:**
- `CreateMetric` 方法改进:
- 使用 `DesignCornerRadiusSm` 圆角
- 使用新的 `SurfaceColor` 作为卡片背景
- 优化字体大小和间距
- `BuildHourlyItems` 方法改进:
- 使用 `DesignCornerRadiusSm` 圆角
- 使用 `SurfaceColor` 作为卡片背景
- 时间、图标、温度垂直排列,居中对齐
- `BuildDailyItems` 方法改进:
- 使用 `DesignCornerRadiusSm` 圆角
- 使用 `SurfaceColor` 作为卡片背景
- 日期、图标、高低温垂直排列
---
### Task 8: 更新 HourlyWeatherWidget 的代码后置文件
**文件:** `LanMountainDesktop/Views/Components/HourlyWeatherWidget.axaml.cs`
**改动:**
- `CreateChip` 方法改进:
- 使用 `DesignCornerRadiusSm` 圆角
- 使用 `SurfaceColor` 作为卡片背景
- 优化垂直排列的间距
---
### Task 9: 更新 MultiDayWeatherWidget 的代码后置文件
**文件:** `LanMountainDesktop/Views/Components/MultiDayWeatherWidget.axaml.cs`
**改动:**
- `CreateRow` 方法改进:
- 添加底部分割线(除最后一行)
- 优化列间距和对齐
- 高低温使用不同透明度区分
---
### Task 10: 更新 MaterialWeatherVisualTheme 调色板
**文件:** `LanMountainDesktop/Views/Components/MaterialWeatherVisualTheme.cs`
**改动:**
- 为 `MaterialWeatherPalette` 添加新字段:
- `SurfaceColor` - 用于卡片表面
- `SurfaceVariantColor` - 用于变体表面
- `OutlineColor` - 用于分割线
- 更新所有调色板生成方法:
- `ResolveGooglePalette`
- `ResolveGeometricPalette`
- `ResolveBreezyPalette`
- `ResolveLemonPalette`
- 每个调色板需要为白天/夜晚模式提供合适的 SurfaceColor:
- 白天:低透明度白色(如 `#14FFFFFF`)
- 夜晚:低透明度黑色(如 `#1A000000`)
---
### Task 11: 构建和测试
**命令:**
```bash
dotnet build LanMountainDesktop.slnx -c Debug
dotnet test LanMountainDesktop.slnx -c Debug
```
**验证清单:**
- [ ] 所有天气组件正常编译
- [ ] 运行时无异常
- [ ] 4套视觉风格正常切换
- [ ] 响应式布局正常工作
- [ ] 圆角资源正确应用
---
## 文件改动汇总
| 文件 | 改动类型 | 说明 |
|------|---------|------|
| `MaterialWeatherVisualTheme.cs` | 修改 | 添加 SurfaceColor 等字段,更新所有调色板 |
| `WeatherWidget.axaml` | 修改 | 重构布局,优化排版 |
| `WeatherWidget.axaml.cs` | 修改 | 调整响应式布局和颜色绑定 |
| `ExtendedWeatherWidget.axaml` | 修改 | 重构布局,添加卡片容器 |
| `ExtendedWeatherWidget.axaml.cs` | 修改 | 改进卡片创建方法 |
| `HourlyWeatherWidget.axaml` | 修改 | 重构布局,添加卡片容器 |
| `HourlyWeatherWidget.axaml.cs` | 修改 | 改进卡片创建方法 |
| `MultiDayWeatherWidget.axaml` | 修改 | 重构布局,添加卡片容器 |
| `MultiDayWeatherWidget.axaml.cs` | 修改 | 改进行创建方法 |
| `WeatherClockWidget.axaml` | 修改 | 重构布局,优化排版 |
| `WeatherClockWidget.axaml.cs` | 修改 | 调整响应式布局 |
---
## 设计规范检查清单
- [ ] 所有组件根容器使用 `DesignCornerRadiusComponent`
- [ ] 内部卡片使用 `DesignCornerRadiusMd` 或 `DesignCornerRadiusSm`
- [ ] 不使用硬编码圆角值
- [ ] 文字对比度符合 VISUAL_SPEC 要求
- [ ] 间距使用一致的倍数(4px 基线)
- [ ] 字体层级:温度(64-72px) > 状况(16-18px) > 位置/范围(12-13px)