WPF 4 - DatePicker - Как установить DisplayMode в Decade? - PullRequest
1 голос
/ 25 августа 2010

Этот код делает фон календаря оранжевым, но для DisplayMode он по умолчанию не устанавливается.Кто-нибудь знает почему?Что я могу сделать, чтобы установить значение по умолчанию «Десятилетие»?

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

Ответы [ 2 ]

4 голосов
/ 26 августа 2010

Элемент управления DatePicker устанавливает CalendarMode в явное значение месяц, когда открывается всплывающее окно, которое переопределяет значение из вашего стиля.От Reflector:

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" и установить его обратно в Decade в коде, выполнив что-то вроде этого:

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;
        }
    }
}

(я пробовал это с WPF Toolkit DatePicker в 3.5, поэтому я необещаю, что это работает в 4.0.)

0 голосов
/ 06 июня 2019

Ответ Quartermeister кажется самым чистым способом. Но это не сработало для меня. Datepicker.Template.FindName всегда возвращал ноль. Так что я сделал это немного по-другому в 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;
        }
    }
...