C# 从WPF日期选择器、日历禁用周末

C# 从WPF日期选择器、日历禁用周末,c#,wpf,xaml,datepicker,C#,Wpf,Xaml,Datepicker,我在wpf应用程序中有一个简单的日期选择器。我想删除日历上显示的所有周末。 为了实现这一点,我使用了DatePicker的BlackoutDates属性 我的代码如下所示:MVVM体系结构: 这是在XAML中 <DatePicker Name="MyDatePicker"> <i:Interaction.Triggers> <i:EventTrigger EventName="CalendarOpened">

我在wpf应用程序中有一个简单的日期选择器。我想删除日历上显示的所有周末。 为了实现这一点,我使用了DatePicker的BlackoutDates属性

我的代码如下所示:MVVM体系结构:

这是在XAML中

<DatePicker Name="MyDatePicker">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="CalendarOpened">
               <Commands:EventToCommand Command="{Binding DataContext.CalenderOpenedCmd,
               RelativeSource={RelativeSource AncestorType={x:Type Window}, Mode=FindAncestor}}" 
               CommandParameter="{Binding ElementName=MyDatePicker}"/>
        </i:EventTrigger>
   </i:Interaction.Triggers>
</DatePicker>
ExecuteMyDatePicker\u RemoveSaturdays是事件

private void ExecuteMyDatePicker_RemoveSaturdays(object obj)
{
    var datePicker = obj as DatePicker;
    if (datePicker == null)
        return;
    datePicker.DisplayDateStart = new DateTime(1995, 1, 1);

    // In following 2 variables I'm deciding the range for BlackoutDates property.
    var minDate = datePicker.DisplayDateStart ?? DateTime.MinValue;  
    var maxDate = DateTime.Today;

   // In the following for loop, I'm checking every date in given range and if the day is Saturday or Sunday I'm adding them to blackoutdates to remove them form the calender.
    for (var day = minDate; day <= maxDate && DateTime.MaxValue > day; day = day.AddDays(1))
    {
        if (day.DayOfWeek == DayOfWeek.Saturday || day.DayOfWeek == DayOfWeek.Sunday)
        {
            datePicker.BlackoutDates.Add(new CalendarDateRange(day));
        }
    }
}

如果日期范围为30-40年,则上述代码执行时间过长。因此,我想知道如何优化此代码,或者以任何其他方式删除WPF的整个datepicker中的所有周末,而不管我提供的日期范围是什么。

您是否查看了其模板?当日期可视化时,您可以对其重新设置模板,以便对日期执行一些特殊的操作,例如检测日期是否为星期六/星期日,并将其隐藏。这增加了代码的时间复杂性,降低了代码的交互性。当我显示整个日历时,我必须每天检查并隐藏是否是需要时间的周日/周六。如何显示整个日历?40年约为15000天。如果您指的是以毫秒为单位的样式触发器显示/隐藏单个日期所用的时间,则您不会注意到它。当你们注意到在显示日历上创建一个巨大的黑名单所需的时间时,我的意思是,我一次就把周末从整个日历上删除了。例如,如果我的日历上显示的日期是从2000-1-1到2020-1-1,那么我将一次性删除该年的所有周末。此过程需要时间。我可能错了,但在我看来,每次触发日历打开时,您都会删除周末。也许你可以把它放到一些初始化或加载事件上。
private void ExecuteMyDatePicker_RemoveSaturdays(object obj)
{
    var datePicker = obj as DatePicker;
    if (datePicker == null)
        return;
    datePicker.DisplayDateStart = new DateTime(1995, 1, 1);

    // In following 2 variables I'm deciding the range for BlackoutDates property.
    var minDate = datePicker.DisplayDateStart ?? DateTime.MinValue;  
    var maxDate = DateTime.Today;

   // In the following for loop, I'm checking every date in given range and if the day is Saturday or Sunday I'm adding them to blackoutdates to remove them form the calender.
    for (var day = minDate; day <= maxDate && DateTime.MaxValue > day; day = day.AddDays(1))
    {
        if (day.DayOfWeek == DayOfWeek.Saturday || day.DayOfWeek == DayOfWeek.Sunday)
        {
            datePicker.BlackoutDates.Add(new CalendarDateRange(day));
        }
    }
}