WPF日期选择器与突出显示的日期

4
在WPF DatePicker中,有一些方法可以突出显示在列表中的日期,例如BlackoutDates,但是可以选择吗?
我想向用户呈现我在数据库中拥有某些数据的日期。
2个回答

5
这里有一种简单的方法来实现它:
继承默认的日历(Calender)和日历日期按钮(CalenderDayButton)样式,并进行一些小的更改:
<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中的第二个绑定是您感兴趣日期的列表,下面是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


非常好的答案和示例(带有样本)!新增了一个功能,即每个日期的高亮刷子,以不同颜色分组不同类型的日期。在HighlightedDate类中添加了新的刷子属性和HighlightedDateBrushConverter转换器。 - knockando
如何使用HighlightDatePicker获取SelectedDateChanged事件并在主代码中运行我的方法(而不是在HighlightDatePicker类中)。我遇到了以下错误: ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type - michal
@michal 你是指这样的吗(?): MainWindow.xaml: SelectedDateChanged="DatePicker_OnSelectedDateChanged"MainWindow.xaml.cs: private void DatePicker_OnSelectedDateChanged(object sender, SelectionChangedEventArgs e) { Console.WriteLine("选定日期已更改"); } - Christian Myksvoll

0

您需要重写 DayButton 的控件模板,并添加一个数据触发器,以查找您的属性并将其突出显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接