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

C# 在代码隐藏中修改后,日历显示日期在年度视图中不正确,c#,wpf,datetime,calendar,C#,Wpf,Datetime,Calendar,我在WPF和C工作。在使用日历控件时,我遇到了以下问题: 如果我在代码隐藏中修改了DisplayDate,单击月份标题将进入年份视图,但显示的日期不正确 在进行一些测试时,我注意到,只要按下月份标题,DisplayDate就会更改回代码隐藏更改之前的状态 有没有办法在代码隐藏中更改显示日期并使其“保持不变” 下面是重现问题的快速代码片段: <Grid> <StackPanel HorizontalAlignment="Center" VerticalAlignmen

我在WPF和C工作。在使用日历控件时,我遇到了以下问题:

如果我在代码隐藏中修改了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);
  }

私有无效btnPrev_单击(对象发送方,路由目标)
{
this.ChangeDisplayDate(this.myCalendar.DisplayDate.AddMonths(-1));
}
私有void btnNext_单击(对象发送者,路由目标e)
{
this.ChangeDisplayDate(this.myCalendar.DisplayDate.AddMonths(1));
}
私有void ChangeDisplayDate(DateTime newDate)
{
//方法1
//this.myCalendar.DisplayDate=newDate;
//方法2
this.myCalendar.ClearValue(Calendar.DisplayDateProperty);
this.myCalendar.SetValue(Calendar.DisplayDateProperty,newDate);
}
ChangeDisplayDate()中显示的两种方法都将更改DisplayDate,但不会阻止它在单击月份标题时返回。

尝试同时设置和属性:

myCalendar.DisplayDate = newDate;
myCalendar.SelectedDate = newDate;

在您的代码隐藏中。

查看
日历
的代码,似乎无法通过编程方式导航到其他“页面”,例如月份视图。内部用于导航的日期似乎是
CurrentDate
,但该属性被标记为
internal
,操作该属性的导航方法也无法访问。似乎
DisplayDate
仅控制初始页面/日期,即在
SelectedDate
null
开头的情况下确定导航起点。显示日历后,更改该属性无效

这似乎是一个设计非常糟糕的控件。采用WPF理念的设计将使用路由命令进行导航,在这种情况下,您只需启动适当的命令即可。但这种设计似乎只处理模板中特定按钮的点击和键盘手势。恐怕你运气不好


如果您真的需要使用反射来实现这一点,以便实现一个里程碑,那么您可以随时调用日历的
MoveDisplayTo
OnNextClick
,或者
OnPreviousClick
方法,但我不建议您在发布时使用反射。最好不要使用这种行为或切换到更灵活的日历控件。

但我不想更改所选日期,我只想更改日历中显示的月份。与用户手动单击右/左箭头更改月份时相同。该操作不会更改SelectedDate,只更改DisplayedDate。最后,我想做的事情与单击这些按钮相当,但改为单击代码隐藏。单击下一步按钮确实会更改
DisplayDate
。您可以通过向XAML代码添加
来查看它。