带十年日历的DatePicker仅选择年份

时间:2019-10-30 14:02:32

标签: c# wpf datepicker

是否有一种方法可以强制DatePicker的日历仅使用Decade DisplayMode,并且当单击Calendar上的year时,在DatePicker的文本框中输入year的值?

这是我到目前为止所拥有的:

XAML:

   <DatePicker x:Name="Dtp_Date" HorizontalAlignment="Left" Margin="117,221,0,0" VerticalAlignment="Top" CalendarOpened="Dtp_Datum_CalendarOpened">
            <DatePicker.Resources>
                <Style TargetType="DatePickerTextBox">
                    <Setter Property="Text" Value="Choose year..."/>
                </Style>
            </DatePicker.Resources>
        </DatePicker>

后面的代码:

private void Dtp_Date_CalendarOpened(object sender, RoutedEventArgs e)
    {
        //Change drop-down of Calendar to Decade
        DatePicker datepicker = (DatePicker)sender;
        Popup popup = (Popup)datepicker.Template.FindName("PART_Popup", datepicker);
        if (popup != null)
        {
            Calendar cal = (Calendar)popup.Child;
            if (cal != null) cal.DisplayMode = CalendarMode.Decade;
        }
    }

这将成功打开显示模式为CalendarMode.Decade的DatePicker的日历。但是,一旦我单击Calendar,它将DisplayMode更改为Month(更改为Days,再单击一次则更改为Days)。

相反,我希望关闭Calendar并在DatePicker的“文本框”中输入年份值。这可能吗?

1 个答案:

答案 0 :(得分:0)

您可以使用可编辑的ComboBox来模拟一些您想做的事情。

ComboBox是可编辑的,这意味着用户只需输入年份就可以验证它,或者他们可以打开下拉列表并查看类似于DatePicker控件中年份显示的列表。

此示例仅绑定到年份列表。

<ComboBox
    Width="100"
    Height="20"
    HorizontalAlignment="Center"
    VerticalAlignment="Center"
    IsEditable="True"
    ItemsSource="{Binding Years}"
    MaxDropDownHeight="168">
    <ComboBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel
                MaxWidth="200"
                Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ComboBox.ItemsPanel>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Grid
                Width="40"
                Height="42">
                <TextBlock
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    Text="{Binding}" />
            </Grid>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>