Calendar是只读日历视图,需用DisplayDate、BlackoutDates等配置;DatePicker/CalendarDatePicker是带输入框的复合控件,须绑定SelectedDate并设置DisplayFormat;Ursa DateTimePicker支持时分秒,需同时设DisplayFormat和PanelFormat。
Avalonia 中的 Calendar 和 DatePicker(包括 CalendarDatePicker)是两个常用但用途不同的日期控件:前者是纯日历视图,后者是带文本输入 + 下拉日历的复合控件。正确使用需注意模板、样式、绑定和常见陷阱。
Calendar 是一个只读日历面板,不自带输入框,适合嵌入仪表板或作为独立日历展示:
,支持单选、多选、范围选等模式DisplayDate 属性指定初始显示日期BlackoutDates 集合,例如:
SelectedDatesChanged 或绑定 SelectedDate
Avalonia 官方推荐的是 CalendarDatePicker(常简称为 DatePicker),它由文本框 + 下拉弹窗组成,但默认行为较“轻”,需手动补全关键配置才能稳定工作:
,必须绑定 SelectedDate 才能双向生效DisplayFormat(仅影响文本框内显示),如:DisplayFormat="yyyy-MM-dd";若未设,可能显示为系统默认短格式(如 “12/15/2025”)DisplayMode="Year" 或在代码中预设如果需要年月日 + 时分秒一体化选择,官方 CalendarDatePicker 不支持时间部分,此时推荐 Ursa 主题的 DateTimePicker:
Semi.Avalonia 和 Ursa.Avalonia
App.axaml 中声明命名空间:xmlns:ursa="https://irihi.tech/ursa"
DisplayFormat(文本显示)、PanelFormat(弹窗内格式)、Watermark(占位提示)
PanelFormat 可能导致时间选择器顺序错乱(如秒在前、时在后)遇到样式不符、关闭异常或输入失效等问题,多数源于底层实现细节:
TextBox 无法输入空格——需重写 Calendar_KeyDown 或改用其他触发方式MonthFormat 不刷新界面,必须同步触发 SelectedDate 更新(哪怕赋值自身)才能重绘

ControlTemplate,尤其注意 Popup 的 IsOpen 绑定和关闭逻辑,原生控件缺少外部点击关闭机制Width="Auto" 在 Avalonia 中非法,设为 Width="{Binding ActualWidth, ElementName=Parent}" 或直接给固定值更稳妥