Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF 4-日期选择器-如何将显示模式设置为十年?_Wpf_Calendar_Datepicker - Fatal编程技术网

WPF 4-日期选择器-如何将显示模式设置为十年?

WPF 4-日期选择器-如何将显示模式设置为十年?,wpf,calendar,datepicker,Wpf,Calendar,Datepicker,此代码使日历的背景为橙色,但不会将显示模式默认为“十年”。有人知道为什么吗?我该怎么做才能将其默认为十年 <DatePicker SelectedDate="{Binding TheDate}"> <DatePicker.CalendarStyle> <Style TargetType="Calendar"> <Setter Property="DisplayMode" Value="Decade"/>

此代码使日历的背景为橙色,但不会将显示模式默认为“十年”。有人知道为什么吗?我该怎么做才能将其默认为十年

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

当弹出窗口打开时,DatePicker控件将CalendarMode显式设置为month,这将覆盖样式中的值。从反射器:

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\u 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工具包DatePicker,所以我不保证它在4.0中可以工作

当弹出窗口打开时,DatePicker控件将CalendarMode显式设置为month,这将覆盖样式中的值。从反射器:

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\u 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工具包DatePicker,所以我不保证它在4.0中可以工作

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

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