# Calendar 使用文档 本文档介绍 AtomUI Calendar 控件的各种使用方式。 > 📖 Gallery 源码位置:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/CalendarShowCase.axaml` --- ## 前置准备 在 AXAML 中使用 Calendar,需要引入以下命名空间: ```xml xmlns:atom="https://atomui.net" ``` 在 C# 代码中引入: ```csharp using AtomUI.Desktop.Controls; // Calendar 控件及相关类型 ``` --- ## 1. 基本用法 最简单的日历,显示当前月份,默认允许单范围选择: ```xml ``` --- ## 2. 选择模式 通过 `SelectionMode` 属性设置不同的选择行为: ### 单日选择 ```xml ``` 只允许选择一个日期,点击新日期会取消之前的选择。 ### 单范围选择(默认) ```xml ``` 允许选择一个连续日期范围: - 点击第一个日期,然后 Shift+点击第二个日期 - 或按住鼠标拖动选择范围 ### 多范围选择 ```xml ``` 允许选择多个不连续的日期范围: - Ctrl+点击追加单个日期 - Ctrl+Shift+点击追加一个范围 - Ctrl+点击已选日期可取消选择 ### 禁止选择 ```xml ``` 日历仅供浏览,不允许选择任何日期。 --- ## 3. 今日高亮 默认情况下,今天的日期会显示主色调边框高亮。可通过 `IsTodayHighlighted` 关闭: ```xml ``` --- ## 4. 一周起始日 通过 `FirstDayOfWeek` 设置一周的起始日: ```xml ``` --- ## 5. 限制日期范围 通过 `DisplayDateStart` 和 `DisplayDateEnd` 限制可显示和可选择的日期: ```xml ``` ```csharp // Code-behind RangeCalendar.DisplayDateStart = DateTime.Today; RangeCalendar.DisplayDateEnd = DateTime.Today.AddDays(30); ``` --- ## 6. 禁用日期(BlackoutDates) 通过 `BlackoutDates` 集合标记不可选的日期: ```xml ``` ```csharp // Code-behind:禁用所有过去的日期 BlackoutCalendar.BlackoutDates.AddDatesInPast(); // 禁用特定日期范围(如节假日) BlackoutCalendar.BlackoutDates.Add( new CalendarDateRange(new DateTime(2025, 10, 1), new DateTime(2025, 10, 7))); // 禁用特定单日 BlackoutCalendar.BlackoutDates.Add( new CalendarDateRange(new DateTime(2025, 12, 25))); ``` --- ## 7. 指定初始显示日期 通过 `DisplayDate` 设置日历初始显示哪个月份: ```xml ``` --- ## 8. 自定义头部背景 ```xml ``` --- ## 9. 禁用状态 ```xml ``` --- ## 10. 数据绑定 Calendar 的关键属性支持双向绑定,适合 MVVM 架构: ### SelectedDate 绑定 ```xml ``` ```csharp // ViewModel public class CalendarViewModel : ReactiveObject { [Reactive] public DateTime? SelectedDate { get; set; } } ``` ### DisplayDate 绑定 ```xml ``` ```csharp // ViewModel [Reactive] public DateTime CurrentDisplayDate { get; set; } = DateTime.Today; ``` --- ## 11. 事件处理 ### 监听选中日期变化 ```xml ``` ```csharp private void OnSelectedDatesChanged(object? sender, SelectionChangedEventArgs e) { foreach (DateTime added in e.AddedItems) { Console.WriteLine($"新选中: {added:yyyy-MM-dd}"); } foreach (DateTime removed in e.RemovedItems) { Console.WriteLine($"取消选中: {removed:yyyy-MM-dd}"); } } ``` ### 监听显示日期变化 ```xml ``` ```csharp private void OnDisplayDateChanged(object? sender, CalendarDateChangedEventArgs e) { Console.WriteLine($"从 {e.RemovedDate:yyyy-MM} 切换到 {e.AddedDate:yyyy-MM}"); } ``` ### 监听显示模式变化 ```xml ``` ```csharp private void OnDisplayModeChanged(object? sender, CalendarModeChangedEventArgs e) { Console.WriteLine($"从 {e.OldMode} 切换到 {e.NewMode}"); } ``` --- ## 12. 控制动画行为 ```xml ``` --- ## 键盘导航速查 Calendar 支持完整的键盘操作: | 按键 | Month 模式 | Year/Decade 模式 | |---|---|---| | ←/→ | 前/后一天 | 前/后一个月/年 | | ↑/↓ | 前/后一周 | 前/后一行 | | PageUp | 上一年 | 上一年/十年 | | PageDown | 下一年 | 下一年/十年 | | Home | 月初 | 年首/十年首 | | End | 月末 | 年末/十年末 | | Ctrl+↑ | 切换到 Year 视图 | 切换到上级视图 | | Ctrl+↓ | — | 切换到下级视图 | | Enter/Space | — | 进入选中月/年 | | Shift+方向键 | 范围选择 | — | --- ## 常见组合模式 ### 预约日期选择器 ```xml ``` ```csharp public BookingView() { InitializeComponent(); // 禁用过去的日期 BookingCalendar.BlackoutDates.AddDatesInPast(); } private void OnBookingDateChanged(object? sender, SelectionChangedEventArgs e) { if (e.AddedItems.Count > 0) { var date = (DateTime)e.AddedItems[0]!; // 处理预约逻辑... } } ``` ### 日期范围筛选 ```xml ``` ```csharp private void OnFilterRangeChanged(object? sender, SelectionChangedEventArgs e) { if (sender is Calendar calendar && calendar.SelectedDates.Count > 0) { var startDate = calendar.SelectedDates.Min(); var endDate = calendar.SelectedDates.Max(); // 使用 startDate ~ endDate 进行数据筛选... } } ```