【问题标题】:DatePicker with Decade Calendar to select only year带有十年日历的 DatePicker 仅选择年份
【发布时间】:2019-10-30 14:02:32
【问题描述】:

有没有办法强制 DatePicker 的 Calendar 只使用 Decade DisplayMode,当点击 Calendar 时,在 DatePicker 的 Textbox 中输入 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;
        }
    }

这成功打开了 DatePicker 的日历,DisplayMode = CalendarMode.Decade。但是,一旦我单击日历,它就会将 DisplayMode 更改为 Month(再单击一次更改为 Days)。

我想要关闭日历并在 DatePicker 的文本框中输入年份值,而不是其他。这可能吗?

【问题讨论】:

  • thread 对您有帮助吗?
  • @Pavel Anikhouski,正如我在这个线程中看到的答案,对显示日历做同样的事情。但它不涉及单击/关闭日历和更新日期选择器的选定年份值的部分。我没有看到任何日历点击事件,这就是我问的原因。
  • 您是否考虑过使用可编辑的 ComboBox 代替?如果目标只是简单地选择一年,那么(对您和您的用户)这样做似乎更有意义。
  • @Keithernet,“可编辑”是什么意思?...我的问题是用户可以选择任何年份,所以我不能只为所有可能的年份添加组合框...但是如果我问的是不可能的,然后我将添加 Texbox - 用户将输入年份,后面的代码将检查如果文本真的是一年(日期)......但这不是用户想要的......
  • 年份代表什么?约会出生?历史上的一个点?您通常不会遇到年份范围不受限制的情况。无论如何,我认为您可以模仿一些行为并以非常好的方式显示您想要的。请参阅下面的答案。

标签: c# wpf datepicker


【解决方案1】:

您可以使用可编辑的 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2020-02-07
    相关资源
    最近更新 更多