摘要
日历控件用于创建可视日历,让用户选择日期并在选择日期时触发事件。Calendar 控件在 System.Windows.Controls 命名空间中定义。
正文
**显示模式 **
Calendar类的DisplayMode属性表示Calendar的显示格式,可以是月、年或年。默认模式为“月”。将DisplayMode设置为Year和Decade。
DisplayDateStart 指定日期视图起始显示范围
DisplayDateEnd 指定日期视图结尾显示范围
FirstDayOfWeek 指定某一天作为一个星期的第一天
SelectionMode 允许控件是否可以多选日期
CalendarSelectionMode
None  | 不允许选择。  | 
SingleDate  | 通过设置 SelectedDate 或 SelectedDates 中的第一个值,只能选择一个日期。不能使用 AddRange。  | 
SingleRange  | 可以选择单个日期范围。设置 SelectedDate、将日期单独添加到 SelectedDates 或使用 AddRange 将清除 SelectedDates 中的所有先前值。  | 
MultipleRange  | 可以选择多个不连续的日期范围。将日期单独添加到 SelectedDates 或使用 AddRange 不会清除 SelectedDates。设置 SelectedDate 仍将清除 SelectedDates,但可以添加其他日期或范围。添加包含一些已选择日期或与另一个范围重叠的日期的范围会导致这些范围的并集,并且不会导致异常。  | 
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="auto"></RowDefinition>
    </Grid.RowDefinitions>
    <Calendar DisplayMode="Month" x:Name="cad1" SelectedDatesChanged="cad1_SelectedDatesChanged" SelectionMode="MultipleRange"></Calendar>
    <Button Grid.Row="1" Content="切换显示模式" Margin="10" Click="Button_Click"></Button>
    <TextBlock x:Name="txtInfo" Margin="10" Foreground="Red" Grid.Row="2"></TextBlock>
</Grid>int idx = 0;
private void Button_Click(object sender, RoutedEventArgs e)
{
    cad1.DisplayMode = (CalendarMode)(idx % 3);
    idx++;
}
private void cad1_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
{
    txtInfo.Text = "";
    for (int i = 0; i < cad1.SelectedDates.Count; i++)
    {
        txtInfo.Text += cad1.SelectedDates[i].ToString("yyyy-MM-dd")+System.Environment.NewLine;
    }
   
}BlackoutDates
Calendar类的BlackoutDates属性表示不可用于选择的日期集合。所有非选择日期都用叉号标记。
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Calendar x:Name="cal" Grid.Column="0" Margin="10">
        <Calendar.BlackoutDates>
            <CalendarDateRange Start="2022-5-1" End="2022-5-10"></CalendarDateRange>
        </Calendar.BlackoutDates>
    </Calendar>
    <StackPanel Grid.Column="1" Margin="10">
        <ListBox x:Name="lstDate" Height="200" Margin="10"></ListBox>
        <Button x:Name="btnDisable" Content="停用" Margin="10" Click="btnDisable_Click"></Button>
    </StackPanel>
</Grid>private void LoadDate()
{
    var curMonth = cal.DisplayDate;
    var minDate = curMonth.AddDays(1 - curMonth.Day).Date;
    var maxDate = curMonth.AddDays(1 - curMonth.Day).Date.AddMonths(1).AddSeconds(-1);
    for (DateTime i = minDate; i < maxDate; i=i.AddDays(1))
    {
        lstDate.Items.Add(i);
    }
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    LoadDate();
}
private void btnDisable_Click(object sender, RoutedEventArgs e)
{
    cal.BlackoutDates.Add(new CalendarDateRange((DateTime)lstDate.SelectedItem));
}DatePicker基本功能与Calendar一样的,只有一点不同,DatePicker可以手动输入
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="auto"></RowDefinition>
    </Grid.RowDefinitions>
    <DatePicker Name="dtp" IsDropDownOpen="True" SelectedDateChanged="dtp_SelectedDateChanged"></DatePicker>
    <TextBlock x:Name="txt" Grid.Row="1"></TextBlock>
</Grid>public Window2()
{
    InitializeComponent();
    dtp.BlackoutDates.Add(new CalendarDateRange(DateTime.Parse("2022-06-18"), DateTime.Parse("2022-06-20")));
}
private void dtp_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
{
    txt.Text = dtp.Text;
}
    
