WPF Datepicker仅生成可选日期列表

时间:2013-02-18 09:01:23

标签: wpf wpf-controls datepicker

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

我需要确保使用只能从一定数量的日期中选择。我可以使用下拉列表执行此操作,但使用日期选择器会更好。

有什么想法吗?

3 个答案:

答案 0 :(得分:9)

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可能会更好。

答案 1 :(得分:3)

您可以使用BlackoutDates集合执行所需操作,以防止用户选择您要避免的所有日期。

代码:

myDatePicker.BlackoutDates.Add(myCalendarDateRange);

XAML:

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

答案 2 :(得分:0)

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

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