【问题标题】:WPF 4 - DatePicker - How to set DisplayMode to Decade?WPF 4 - DatePicker - 如何将 DisplayMode 设置为十年?
【发布时间】:2010-08-25 19:54:20
【问题描述】:

此代码使日历的背景变为橙色,但并未将 DisplayMode 默认设置为 Decade。有人知道为什么吗?我该怎么做才能将其默认为“十年”?

<DatePicker SelectedDate="{Binding TheDate}">
    <DatePicker.CalendarStyle>
        <Style TargetType="Calendar">
            <Setter Property="DisplayMode" Value="Decade"/>
            <Setter Property="Background" Value="Orange"/>
        </Style>
    </DatePicker.CalendarStyle>
</DatePicker>

【问题讨论】:

    标签: wpf calendar datepicker


    【解决方案1】:

    当弹出窗口打开时,DatePicker 控件将 CalendarMode 显式设置为月份,这会覆盖您样式中的值。来自反射器:

    private void PopUp_Opened(object sender, EventArgs e)
    {
        if (!this.IsDropDownOpen)
        {
            this.IsDropDownOpen = true;
        }
        if (this._calendar != null)
        {
            this._calendar.DisplayMode = CalendarMode.Month;
            this._calendar.MoveFocus(
                new TraversalRequest(FocusNavigationDirection.First));
        }
        this.OnCalendarOpened(new RoutedEventArgs());
    }
    

    我认为您无法在 XAML 中覆盖它,因为它正在显式设置一个值。您可以添加一个处理程序CalendarOpened="DatePicker_CalendarOpened" 并通过执行以下操作在后面的代码中将其设置回十年:

    private void DatePicker_CalendarOpened(object sender, RoutedEventArgs e)
    {
        var datepicker = sender as DatePicker;
        if (datepicker != null)
        {
            var popup = datepicker.Template.FindName(
                "PART_Popup", datepicker) as Popup;
            if (popup != null && popup.Child is Calendar)
            {
                ((Calendar)popup.Child).DisplayMode = CalendarMode.Decade;
            }
        }
    }
    

    (我在 3.5 中使用 WPF Toolkit DatePicker 尝试过这个,所以我不保证它在 4.0 中有效。)

    【讨论】:

      【解决方案2】:

      Quartermeister 的回答似乎是最干净的方式。但这对我不起作用。 datepicker.Template.FindName 始终返回 null。所以我在 4.6.1 中的做法略有不同。

          private void DatePicker_CalendarOpened(object sender, RoutedEventArgs e)
          {
              DatePicker datepicker = (DatePicker)sender;
              Popup popup = (Popup)datepicker.Template.FindName("PART_Popup", datepicker);
              if (popup != null)
              {
                  System.Windows.Controls.Calendar cal = (System.Windows.Controls.Calendar)popup.Child;
                  if (cal != null) cal.DisplayMode = System.Windows.Controls.CalendarMode.Decade;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2014-06-01
        • 1970-01-01
        • 2023-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多