RadDateTimePicker时间可见不可编辑,仅允许修改日期的实现方案咨询
实现RadDateTimePicker仅允许修改日期、时间固定可见不可编辑
当然能实现这个效果!下面给你两种实用的方案,你可以根据项目场景灵活选择:
方案一:通过事件自动保留时间(最简单)
这种方式不用改控件模板,只需要在后台监听日期变更事件,把原来的时间部分“粘”到新选的日期上就行。
第一步:给控件绑定事件并设置初始值
先在XAML里给你的RadDateTimePicker加上事件绑定,同时设置好初始的日期时间:
<telerik:RadDateTimePicker x:Name="MyDateTimePicker" Margin="0,0,10,0" Grid.Column="0" Grid.ColumnSpan="2" SelectedDateChanged="MyDateTimePicker_SelectedDateChanged" SelectedDate="2017-03-18T10:30:00"/>
第二步:后台处理日期变更
在代码里写事件逻辑,提取原时间,拼到新日期上:
private void MyDateTimePicker_SelectedDateChanged(object sender, Telerik.Windows.Controls.SelectedDateChangedEventArgs e) { // 首次加载或者没有新选择的日期时直接返回 if (e.NewSelectedDate == null || e.OldSelectedDate == null) return; // 把原来的时间部分拆出来 var originalTime = e.OldSelectedDate.Value.TimeOfDay; // 组合新日期+旧时间 var updatedDateTime = new DateTime( e.NewSelectedDate.Value.Year, e.NewSelectedDate.Value.Month, e.NewSelectedDate.Value.Day, originalTime.Hours, originalTime.Minutes, originalTime.Seconds ); // 临时取消事件绑定,避免递归触发 MyDateTimePicker.SelectedDateChanged -= MyDateTimePicker_SelectedDateChanged; MyDateTimePicker.SelectedDate = updatedDateTime; MyDateTimePicker.SelectedDateChanged += MyDateTimePicker_SelectedDateChanged; }
这样用户选完新日期后,时间会自动回到10:30,就算用户手动输入时间,这个逻辑也会把时间纠正回去,完全符合你的需求。
方案二:自定义模板从UI层面禁用时间编辑
如果你想彻底让时间部分不能被点击/输入,就可以自定义控件模板,把时间选择器直接禁用。
你可以用Blend工具提取RadDateTimePicker的默认模板,然后找到模板里的PART_TimePicker控件,给它加上IsEnabled="False":
<telerik:RadTimePicker x:Name="PART_TimePicker" IsEnabled="False" <!-- 其他原有属性保持不变 -->/>
这样时间选择区域就会变成不可交互状态,用户只能操作日期选择部分,时间会一直显示初始的10:30。
小提示
- 用方案一的话,一定要确保初始的
SelectedDate已经设置了正确的时间值,不然后续没有可以保留的时间基准。 - 方案二更适合完全不想让用户碰时间的场景,从根源上阻止时间修改;方案一则更灵活,允许用户临时输入时间但最终会被纠正回去。
内容的提问来源于stack exchange,提问作者Stefano Aquila
相关产品推荐
相关产品推荐

