在代码隐藏中修改后,日历显示日期在年度视图中不正确

本文关键字:不正确 日期 显示 视图 代码 隐藏 修改 日历 | 更新日期: 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理念的设计将使用路由命令进行导航,在这种情况下,您可以简单地启动适当的命令。但这种设计似乎只处理模板中特定按钮的点击和键盘手势。恐怕你可能运气不好。

如果你真的需要让它发挥作用,这样你就可以达到一个里程碑,你可以总是使用反射来调用日历的MoveDisplayToOnNextClickOnPreviousClick方法,但我不建议你在发布时这样做。最好不要这种行为,或者改用更灵活的日历控制。