在代码隐藏中修改后,日历显示日期在年度视图中不正确
本文关键字:不正确 日期 显示 视图 代码 隐藏 修改 日历 | 更新日期: 2023-09-27 18:27:25
我在WPF和C#中工作。在使用日历控件时,我遇到了以下问题:
如果我在代码后面修改DisplayDate,单击月份标题将转到年份视图,但显示的日期不正确。
在进行一些测试时,我注意到,只要按下月份标题,DisplayDate就会变回代码隐藏更改之前的状态。
有没有办法在代码后面更改DisplayDate并将其"粘贴"?
以下是重现问题的快速代码片段:
<Grid>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<Calendar x:Name="myCalendar" />
<Button Content="Prev" Click="btnPrev_Click" />
<Button Content="Next" Click="btnNext_Click" />
</StackPanel>
</Grid>
private void btnPrev_Click(object sender, RoutedEventArgs e)
{
this.ChangeDisplayDate(this.myCalendar.DisplayDate.AddMonths(-1));
}
private void btnNext_Click(object sender, RoutedEventArgs e)
{
this.ChangeDisplayDate(this.myCalendar.DisplayDate.AddMonths(1));
}
private void ChangeDisplayDate(DateTime newDate)
{
// Method 1
//this.myCalendar.DisplayDate = newDate;
// Method 2
this.myCalendar.ClearValue(Calendar.DisplayDateProperty);
this.myCalendar.SetValue(Calendar.DisplayDateProperty, newDate);
}
ChangeDisplayDate()中显示的两个方法都会更改DisplayDate,但不会阻止它在单击月份标题时返回。
尝试设置DisplayDate和SelectedDate属性:
myCalendar.DisplayDate = newDate;
myCalendar.SelectedDate = newDate;
在你的代码后面。
查看Calendar
的代码,似乎没有办法以编程方式导航到不同的"页面",例如月视图。内部用于导航的日期似乎是CurrentDate
,但该属性标记为internal
,并且操作该属性的导航方法也不可访问。DisplayDate
似乎只管理初始页面/日期,即在SelectedDate
开始为null
的情况下确定导航起点。显示日历后,更改该属性将无效。
这似乎是一个设计非常糟糕的控件。采用WPF理念的设计将使用路由命令进行导航,在这种情况下,您可以简单地启动适当的命令。但这种设计似乎只处理模板中特定按钮的点击和键盘手势。恐怕你可能运气不好。
如果你真的需要让它发挥作用,这样你就可以达到一个里程碑,你可以总是使用反射来调用日历的MoveDisplayTo
、OnNextClick
或OnPreviousClick
方法,但我不建议你在发布时这样做。最好不要这种行为,或者改用更灵活的日历控制。