Элементы управления в WPF. Calendar и DatePicker — работа с датами

Для работы с датами в WPF используются два элемента управления — это Calendar и DatePicker. При этом, Calendar представляет собой сетку с календарем, а DatePicker — поле ввода (как ComboBox) в котором мы можем вручную задать дату или, кликнув по элементу, открыть сетку календаря и выбрать необходимую дату.

Элементы Calendar и DatePicker имеют достаточно много общих свойств. По сути, Calendar — это выпадающая часть списка DatePicker, которую можно использовать как самостоятельный элемент управления. Поэтому ниже мы рассмотрим свойства, которые мы можем использовать для обоих элементов управления.

Свойства Calendar и DatePicker

Свойства, которые одновременно могут использоваться в элементах Calendar и DatePicker представлены ниже:

Свойство Тип Описание
BlackoutDates CalendarBlackoutDatesCollection Список дат в календаре, которые нельзя выбрать. Такие даты будут перечеркнуты
DisplayDate DateTime Отображаемая дата
DisplayDateEnd DateTime? Эти свойства в паре создают диапазон дат в календаре, которые пользователь может выбрать.
DisplayDateStart DateTime?
FirstDayOfWeek DayOfWeek Задает день, который будет считаться началом недели
IsTodayHighlighted bool Определяет будет ли выделена текущая дата в календаре
SelectedDate DateTime? Выбранная в календаре дата

Рассмотрим действия этих свойств на примере элемента управления Calendar:

<Calendar IsTodayHighlighted="True"
          DisplayDateStart="5/1/2025"
          DisplayDateEnd="6/30/2025"
          FirstDayOfWeek="Saturday">
    <Calendar.BlackoutDates>
        <CalendarDateRange Start="6/2/2025" End="6/4/2025"/>
        <CalendarDateRange Start="6/9/2025" End="6/9/2025"/>
        <CalendarDateRange Start="6/16/2025" End="6/16/2025"/>
        <CalendarDateRange Start="6/23/2025" End="6/25/2025"/>
        <CalendarDateRange Start="6/30/2025" End="6/30/2025"/>
    </Calendar.BlackoutDates>
</Calendar>

Здесь мы ограничиваем просмотр дат в календаре датами с 01 мая 2025 года по 30 июня 2025 года, подсвечиваем текущую дату, а первым дрем недели задаем субботу. При этом, обратите внимание на то, как мы определяем в XAML свойство BlackoutDates. Для этого мы используем элемент CalendarDateRange в котором указываем начальную и конечные даты. В первой записи мы запрещаем выбор дат с 02.06.2025 по 04.06.2025:

<CalendarDateRange Start="6/2/2025" End="6/4/2025"/>

а далее — каждая запись содержит по одному дню так как свойства Start и End у CalendarDateRange совпадают. Запустим приложение и посмотрим на результат:

Calendar и DatePicker WPF

Свойства Calendar

Элемент управления Calendar предоставляет нам следующие свойства:

Свойство Тип Описание
DisplayMode CalendarMode Определяет, что отображается по умолчанию в календаре — Month (месяц), Year (год), Decade (десятилетие)
SelectedDates SelectedDatesCollection Коллекция выбранных в данный момент в календаре дат
SelectionMode CalendarSelectionMode Определяет способ выбора дат в календаре: отдельная дата (SingleDate), один непрерывный диапазон дат ( SingleRange), несколько диапазонов дат (MultipleRange), выбирать даты нельзя (None)

Изменим код нашего календаря следующим образом:

<Calendar xmlns:sys="clr-namespace:System;assembly=mscorlib"
          IsTodayHighlighted="True"
          DisplayDateStart="5/1/2025"
          DisplayDateEnd="6/30/2025"
          FirstDayOfWeek="Saturday" 
          DisplayMode="Month"
          SelectionMode="MultipleRange">
    <Calendar.SelectedDates>
        <sys:DateTime>6/12/2025</sys:DateTime>
        <sys:DateTime>6/14/2025</sys:DateTime>
        <sys:DateTime>6/13/2025</sys:DateTime>
        <sys:DateTime>6/15/2025</sys:DateTime>
    </Calendar.SelectedDates>
</Calendar>

Теперь запустим приложение, чтобы убедиться, что в календаре по умолчанию выбран диапазон дат с 12 до 15 июня и мы можем, зажав клавишу Ctrl, выбирать несколько диапазонов дат:

Calendar WPF

Свойства DatePicker

В свою очередь, элемент управления DatePicker предоставляет нам следующие свойства:

Свойство Тип Описание
IsDropDownOpen bool Указывает, открыт или закрыт раскрывающийся элемент управления
Text string Текст, отображаемый элементом управления DatePicker. Значение по умолчанию — пустая строка.
SelectedDateFormat DatePickerFormat Формат, используемый для отображения выбранной даты.

Также, DatePicker предоставляет нам следующие события:

Событие Описание
public event System.Windows.RoutedEventHandler CalendarClosed;
Генерируется при закрытии раскрывающегося элемента DatePicker
public event System.Windows.RoutedEventHandler CalendarOpened;
Генерируется при показе раскрывающегося элемента DatePicker
public event EventHandler<System.Windows.Controls.DatePickerDateValidationErrorEventArgs> DateValidationError;
Происходит, если свойству Text присвоено значение, которое не может быть интерпретировано как дата, или когда дату невозможно выбрать.
public event EventHandler<System.Windows.Controls.SelectionChangedEventArgs> SelectedDateChanged;
Генерируется при изменении значения свойства SelectedDate

Рассмотрим следующий пример использования элемента DatePicker.  XAML-разметка MainWindow.xaml будет следующая:

<Window x:Class="WpfApp9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp9"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel Orientation="Horizontal" Margin="10">
        <DatePicker Margin="10"
                    VerticalAlignment="Top"
                    SelectedDateFormat="Short" 
                    CalendarOpened="DatePicker_CalendarOpened"
                    CalendarClosed="DatePicker_CalendarClosed"
                    SelectedDateChanged="DatePicker_SelectedDateChanged"/>
        <TextBlock Margin="10" x:Name="Status"/>
        <TextBlock Margin="10" x:Name="Data"/>
    </StackPanel>
</Window>

Здесь мы разместили элемент DatePicker у которого определили обработчики событий, а также формат отображаемой даты. А также — два элемента TextBlock для вывода информации:

<TextBlock Margin="10" x:Name="Status"/> 
<TextBlock Margin="10" x:Name="Data"/>

Обработчики событий DatePicker в файле MainWindow.xaml.cs будут следующими:

private void DatePicker_CalendarOpened(object sender, RoutedEventArgs e)
{
    Status.Text = "Календарь раскрыт";
}

private void DatePicker_CalendarClosed(object sender, RoutedEventArgs e)
{
    Status.Text = "Календарь закрыт";
}

private void DatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
{
    Data.Text = $"Выбрана дата {(e.Source as DatePicker).SelectedDate}";
}

Запустим приложение и проверим результат работы:

DatePicker WPF

Итого

Элементы Calendar и DatePicker представляют собой элементы для выбора даты. При этом, DatePicker — это элемент со встроенным Calendar. Об этих элемента имеют достаточно много общих свойств.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии