如何在 DatePicker 中将颜色设置为多天?

How to set color to multiple days in DatePicker?

我想知道是否可以将特定颜色设置为 DatePicker 的特定日期,假设我想告诉用户这些天:5, 10, 11, 20, 30 有一些数据可供使用看。我需要指定一种特定的颜色,例如蓝色,这可能吗?

文档中没有任何依据。

谢谢。

DatePickerCalendar 都对不适用日期提供开箱即用的支持。您可以利用此功能来确定哪些日期是可选的。然后就是重新设计日历日按钮的样式,使其看起来像您想要的样子。默认情况下,不适用日期有一个 'X',但应用彩色阴影可能更好。

首先,给定一些 'selectable' 日期范围,计算倒数范围。这些是不可可选择的日期,即停电日期。

public void SetSelectableDates(IEnumerable<DateTime> times)
{
    var selectableDates = times.Select(d => d.Date).Distinct().OrderBy(o => o).ToList();
    var blackoutRanges = new List<CalendarDateRange>();

    _datePicker.BlackoutDates.Clear();

    if (selectableDates.Count == 0)
    {
        _datePicker.BlackoutDates.Add(
            new CalendarDateRange(DateTime.MinValue, DateTime.MaxValue));
        return;
    }

    var start = DateTime.MinValue;

    foreach (var date in selectableDates)
    {
        var end = date.AddDays(-1);

        if (date != start)
            blackoutRanges.Add(new CalendarDateRange(start, end));

        start = date.AddDays(1);
    }

    blackoutRanges.Add(new CalendarDateRange(start, DateTime.MaxValue));

    foreach (var range in blackoutRanges)
        _datePicker.BlackoutDates.Add(range);
}

接下来,设置应用自定义 CalendarDayButtonStyleCalendarStyle 以覆盖可选择和不可选择日期在弹出窗口中的显示方式:

<DatePicker.CalendarStyle>
  <Style TargetType="Calendar">
    <Setter Property="CalendarDayButtonStyle">
      <Setter.Value>
        <Style TargetType="CalendarDayButton">
          <Setter Property="MinWidth"
                  Value="5" />
          <Setter Property="MinHeight"
                  Value="5" />
          <Setter Property="FontSize"
                  Value="10" />
          <Setter Property="Padding"
                  Value="5,1,5,1" />
          <Setter Property="HorizontalContentAlignment"
                  Value="Center" />
          <Setter Property="VerticalContentAlignment"
                  Value="Center" />
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="CalendarDayButton">
                <Border x:Name="border"
                        BorderBrush="Transparent"
                        BorderThickness="1"
                        Padding="{TemplateBinding Padding}"
                        Background="{TemplateBinding Background}">
                  <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                </Border>
                <ControlTemplate.Triggers>
                  <!--Trigger Property="IsToday" Value="True">
                    <Setter TargetName="border" Property="Background" Value="#FFAAAAAA" />
                  </Trigger-->
                  <Trigger Property="IsSelected" Value="True">
                    <Setter TargetName="border" Property="Background" Value="#FFBADDE9" />
                  </Trigger>
                  <Trigger Property="IsBlackedOut" Value="True">
                    <Setter TargetName="border" Property="TextBlock.Foreground" Value="#FFCCCCCC" />
                  </Trigger>
                  <Trigger Property="IsFocused" Value="True">
                    <Setter TargetName="border" Property="BorderBrush" Value="#FF45D6FA" />
                  </Trigger>
                </ControlTemplate.Triggers>
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style>
      </Setter.Value>
    </Setter>
  </Style>
</DatePicker.CalendarStyle>

通常的样式规则适用:您需要使用适合您的应用程序主题(或系统主题)的画笔。

结果: