Отображение даты как праздника в календаре WPF - PullRequest
0 голосов
/ 19 ноября 2018

Я использую элемент управления WPF Calendar для добавления праздников.Пользователь может выбрать дни, и выбранные дни будут вставлены в таблицу базы данных как выходные.После вставки я отображаю дни в таблице «Праздник» как BlackoutDates в календаре, как показано в следующем коде.

XAML

 <Calendar x:Name="HolidayCalendar" SelectedDatesChanged="Calendar_SelectionChanged"
    SelectionMode="MultipleRange" Loaded="Calendar_Loaded"> 

C #

DateTime now = DateTime.Now;
var startDate = new DateTime(now.Year, now.Month, 1);
var endDate = startDate.AddMonths(1).AddDays(-1);
GetHolidayService getHolidayService = new GetHolidayService();
ObservableCollection<GetHoliday> GetHolidayBaseList = new ObservableCollection<GetHoliday>();
PostHoliday postHoliday = new PostHoliday();
postHoliday.StartDate = startDate;
postHoliday.EndDate = endDate;
GetHolidayBaseList = getHolidayService.GetHolidayServiceFunction(postHoliday);
foreach (var item in GetHolidayList)
{

   HolidayCalendar.BlackoutDates.Add(new CalendarDateRange(item.HolidayDate,item.HolidayDate)) ;
}

Текущий выход

Current output

Я хочу достичькак-то так - праздники отмечены красным

Preferred output

как в этой ссылке

Любая помощьдля написания шаблона управления, необходимого для этой функции, приветствуется.

Заранее спасибо!

1 Ответ

0 голосов
/ 19 ноября 2018

Вот как вы можете это сделать,

Сначала определите пользовательский стиль для CalendarDataButton на основе стандартного стиля

    <Calendar x:Name="HolidayCalendar" SelectionMode="MultipleRange">
        <Calendar.CalendarDayButtonStyle>
            <Style TargetType="CalendarDayButton" BasedOn="{StaticResource {x:Type CalendarDayButton}}">
                <Style.Triggers>
                    <Trigger Property="IsBlackedOut" Value="True">
                        <Setter Property="Background" Value="DeepPink"/>
                        <Setter Property="local:CalenderHelper.IsBlackOutDisabled" Value="True"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Calendar.CalendarDayButtonStyle>
        <Calendar.BlackoutDates>
            <CalendarDateRange Start="21-Nov-2018" End="21-Nov-2018"/>
            <CalendarDateRange Start="25-Nov-2018" End="25-Nov-2018"/>
        </Calendar.BlackoutDates>
    </Calendar>

Чтобы убрать отметку забастовки с даты затемнения, вам нужно будет использовать нижеприведенное свойство IsBlackOutDisabled

public class CalenderHelper : DependencyObject
{
    public static readonly DependencyProperty IsBlackOutDisabledProperty =
        DependencyProperty.RegisterAttached("IsBlackOutDisabled", typeof(bool), typeof(CalenderHelper), new PropertyMetadata(false, OnIsBlackOutDisabledChanged));

    public static bool GetIsBlackOutDisabled(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsBlackOutDisabledProperty);
    }

    public static void SetIsBlackOutDisabled(DependencyObject obj, bool value)
    {
        obj.SetValue(IsBlackOutDisabledProperty, value);
    }

    private static void OnIsBlackOutDisabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        CalendarDayButton dayButton = d as CalendarDayButton;
        if (dayButton.IsLoaded)
        {
            SetBlackout(dayButton, (bool)e.NewValue);
        }
        else
        {
            dayButton.Loaded += (s, ee) =>
            {
                SetBlackout(dayButton, (bool)e.NewValue);
            };
        }
    }

    static void SetBlackout(CalendarDayButton dayButton, bool collapsed)
    {
        ControlTemplate template = dayButton.Template;
        Path blackoutPath = template.FindName("Blackout", dayButton) as Path;
        if (collapsed)
            blackoutPath.Visibility = System.Windows.Visibility.Collapsed;
        else
            blackoutPath.Visibility = System.Windows.Visibility.Visible;
    }
}

UPDATE:

Если вы хотите, чтобы цветные даты можно было выбирать с помощью Календаря, вы должны использовать другой подход. Даты затемнения не будут работать для вас.

При таком подходе конвертер раскрашивает даты.

Сначала определите пользовательский стиль для CalendarDataButton на основе стандартного стиля

<Window.Resources>
    <local:CustomLetterDayConverter x:Key="CustomLetterDayConverter" />
    <Style x:Key="CalendarDayButtonStyle" TargetType="{x:Type CalendarDayButton}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Converter={StaticResource CustomLetterDayConverter}}" Value="{x:Null}">
                <Setter Property="Background" Value="HotPink"></Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid>
    <Calendar x:Name="HolidayCalendar" SelectionMode="MultipleRange" SelectedDate="{Binding SelectedDate}"
              CalendarDayButtonStyle="{StaticResource CalendarDayButtonStyle}"
              >
    </Calendar>
</Grid>

Пользовательский конвертер

public class CustomLetterDayConverter : IValueConverter
{
    static HashSet<DateTime> dict = new HashSet<DateTime>();
    static CustomLetterDayConverter()
    {
        dict.Add(DateTime.Today);
        dict.Add(DateTime.Today.AddDays(1));
        dict.Add(DateTime.Today.AddDays(2));
        dict.Add(DateTime.Today.AddDays(5));
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string text = null;
        if (dict.Contains((DateTime)value))
            text = null;
        else
            text = "";

        return text;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...