WPF Datepicker 仅制作可选择的日期列表

Posted

技术标签:

【中文标题】WPF Datepicker 仅制作可选择的日期列表【英文标题】:WPF Datepicker making only a list of dates selectable 【发布时间】:2013-02-02 15:57:27 【问题描述】:

我不确定这是否可行,但是否可以在 wpf 日期选择器中仅制作一个可选择的日期列表?

我需要确保用户只能从一定数量的日期中进行选择。我可以使用下拉列表来做到这一点,但使用日期选择器会更好。

有什么想法吗?

【问题讨论】:

【参考方案1】:

DatePicker 具有以下属性来控制应选择哪些日期:

DisplayDateStart :包含在Calendar 弹出窗口中的第一个日期。DisplayDateEnd :包含在Calendar 弹出窗口中的最后一个日期。

因此,如果您有一个包含允许日期的列表,您可以将DisplayDateStart 设置为列表中的第一项,将DisplayDateEnd 设置为列表中的最后一项。

这将阻止用户选择该范围之外的日期。

要处理允许日期列表中包含间隔的情况,您可以使用BlackoutDates 属性使日期范围不可选。

因此,要将列表中不存在的日期添加为涂黑,您可以执行以下操作。

只有列表中的日期会显示在日历弹出窗口中,不在列表中的日期会被涂黑,因此无法选择。

var dates = new List<DateTime>

    new DateTime(2013, 1, 5),
    new DateTime(2013, 1, 6),
    new DateTime(2013, 1, 7),
    new DateTime(2013, 1, 8),
    new DateTime(2013, 1, 15),
    new DateTime(2013, 1, 16),
    new DateTime(2013, 1, 28),
    new DateTime(2013, 1, 29),
    new DateTime(2013, 2, 9),
    new DateTime(2013, 2, 12),
    new DateTime(2013, 2, 13),
    new DateTime(2013, 2, 17),
    new DateTime(2013, 2, 18)
;

var firstDate = dates.First();
var lastDate = dates.Last();
var dateCounter = firstDate;

foreach (var d in dates.Skip(1))

    if (d.AddDays(-1).Date != dateCounter.Date)
    
        dtp.BlackoutDates.Add(
            new CalendarDateRange(dateCounter.AddDays(1), d.AddDays(-1)));
    

    dateCounter = d;


dtp.DisplayDateStart = firstDate;
dtp.DisplayDateEnd = lastDate;

如果允许的日期相距很远,这可能对用户不太友好,因为将 90% 的日期涂黑会很烦人。在这种情况下,ComboBox 可能会更好。

【讨论】:

我得到的日期列表可能包含空白 @GertHermans 我明白了。所以所有的缝隙都应该被涂黑。请参阅我的更新以获取解决方案。【参考方案2】:

您可以使用BlackoutDates 集合来做您想做的事情,以防止用户选择您想要避免的所有日期。

代码:

myDatePicker.BlackoutDates.Add(myCalendarDateRange);

XAML:

<DatePicker Name="myDatePicker">
    <DatePicker.BlackoutDates>
        <CalendarDateRange Start="02.20.2013" End="02.22.2013" />
    </DatePicker.BlackoutDates>
</DatePicker>

【讨论】:

这看起来很不错。但是我只需要提供几个可用的日期(这些日期在一个列表中,并且对于不同的用户来说是不同的)我将不得不关闭几乎所有的日期,也许我最好选择组合框选项。 @GertHermans 屏蔽很多日期应该不会太难。您在过去的所有日子里都有 BlackoutDates.AddDatesInPast(),或者您可以简单地添加一个 CalendarDateRange 和一个 Start 日期而不是 End 日期,以便将开始日期之后的所有日期设置为不适用日期。【参考方案3】:

您需要创建自己的 ControlTemplate。最简单的方法是采用默认模板(您可以从下面的 URL 下载它)并更改您想要的部分。

http://archive.msdn.microsoft.com/wpfsamples#themes

【讨论】:

以上是关于WPF Datepicker 仅制作可选择的日期列表的主要内容,如果未能解决你的问题,请参考以下文章

WPF 工具包 DatePicker 仅限月/年

如何创建仅启用星期日的 DatePicker?

jQuery Datepicker - 根据所选选项刷新可选择的日期

WPF 工具包 DatePicker 仅限月/年

在 WPF 的 DatePicker 中显示当前日期

怎么设置WPF的DatePicker默认显示“请选择一个日期”