【问题标题】:How do create a DatePicker with only Sundays enabled?如何创建仅启用星期日的 DatePicker?
【发布时间】:2011-11-26 15:27:51
【问题描述】:

我需要允许用户从我的日期选择器中只选择星期天,所以我需要禁用其他列。但我找不到任何解决方案。目前我只是签入选择更改的事件,如果日期无效,则清除日期。如何完全禁用非星期日?

【问题讨论】:

    标签: wpf wpf-controls datepicker


    【解决方案1】:

    @kalyan's suggested link 中的相关部分涉及不适用日期,以及 DatePicker 的 BlackoutDates 属性,它允许您指定用户无法选择的日期范围。

    该属性的类型为CalendarBlackoutDatesCollection,它是ObservableCollection<CalendarDateRange> 的子类。了解这一点后,您可以以编程方式将包括周一到周六的范围添加到此集合中,以便在日历上显示所有周。

    MSDN 页面上描述了BlackoutDates 属性的一个重要注意事项:

    在该集合已被选中时向该集合添加日期或添加 超出 DisplayDateStart 指定范围的日期和 DisplayDateEnd 将导致 ArgumentOutOfRangeException。

    因此,请确保您知道这两个属性是如何定义的。

    一个简单的例子:

    //Code assumes a DateTimePicker declared in XAML with its Name property set to "calendar"
    var minDate = calendar.DisplayDateStart ?? DateTime.MinValue;
    var maxDate = calendar.DisplayDateEnd ?? DateTime.MaxValue;
    
    //pardon the somewhat clunky DateTime.MaxValue handling here; it prevents an overflow
    //when actually adding dates near the maximum
    for (var d = minDate; d <= maxDate && (DateTime.MaxValue - d.AddDays(7)).Days > 7; d = d.AddDays(7))
    {
        var range = new CalendarDateRange(d, d.AddDays(5));
        calendar.BlackoutDates.Add(range);
    }
    

    请注意: 默认情况下,DateTimePicker 的 DisplayDateStart/End 属性设置为 null。因此,上面的代码将除星期日之外的所有日子(从公元 0001 年 1 月 1 日到 9999 年 12 月 31 日)涂黑。这会导致在显示日历控件并与之交互时非常性能很差。因此,如果您要使用这种技术,我强烈建议您将选择器的开始和结束日期(以及中断日期范围的数量)限制在合理的范围内。

    【讨论】:

    • 感谢 djacobson,您的回答很好。 DateTime.MinValue 和 DateTime.MaxValue 有点慢所以我改变了它们然后它工作正常。再次感谢。
    • @janitheshan 不客气 - 如果有机会,不要忘记将答案标记为已接受,如果它适合您的话。谢谢。 :)
    【解决方案2】:

    【讨论】:

    • yes kalyan,但我找不到与我的问题相关的任何内容。无论如何感谢您的回复。
    猜你喜欢
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多