wpf datepicker,突出显示日期

时间:2011-06-16 13:47:51

标签: wpf datepicker

在WPF DatePicker中,有一些方法可以突出显示List中的日期,例如BlackoutDates但可选择吗?

我想向用户介绍我在数据库中有一些数据的日子。

2 个答案:

答案 0 :(得分:3)

这是实现它的一种方法,只需要很少的努力:

继承Calendar和CalendarDayButton的默认样式并进行一些小改动:

<local:DateIsInListConverter x:Key="DateIsInListConverter" />

<Style x:Key="CustomCalendarDayButtonStyle" TargetType="{x:Type CalendarDayButton}" BasedOn="{StaticResource {x:Type CalendarDayButton}}">    
    <Style.Triggers>
        <DataTrigger Value="True">
            <DataTrigger.Binding>
                <MultiBinding Converter="{StaticResource DateIsInListConverter}">
                    <Binding />
                    <Binding ElementName="MyWindow" Path="HighlightedDates" />
                </MultiBinding>
            </DataTrigger.Binding>
            <Setter Property="Background" Value="Orange" />
        </DataTrigger>
    </Style.Triggers>
</Style>

<Style x:Key="CustomCalendarStyle" TargetType="{x:Type Calendar}" BasedOn="{StaticResource {x:Type Calendar}}">
    <Setter Property="CalendarDayButtonStyle" Value="{StaticResource CustomCalendarDayButtonStyle}" />
</Style>

MultiBinding中的第二个Binding是你感兴趣的日期列表,这里是DateIsInListConverter的实现:

public class DateIsInListConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Length < 2 || !(values[0] is DateTime) || !(values[1] is IEnumerable<DateTime>))
            return false;

        var date = (DateTime) values[0];
        var dateList = (IEnumerable<DateTime>) values[1];

        return dateList.Contains(date);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

现在在DatePicker上使用CustomCalendarStyle,你就完成了:

<DatePicker CalendarStyle="{StaticResource CustomCalendarStyle}" />

有关可重复使用的HighlightDatePicker的完整示例,请查看我的GitHub仓库:https://github.com/cmyksvoll/HighlightDatePicker

答案 1 :(得分:0)

您必须覆盖DayButton的控件模板,并添加一个数据触发器,用于查找要突出显示的属性。