Для работы с датами в 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
Элемент управления 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, выбирать несколько диапазонов дат:
Свойства 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}"; }
Запустим приложение и проверим результат работы:
Итого
Элементы Calendar
и DatePicker
представляют собой элементы для выбора даты. При этом, DatePicker
— это элемент со встроенным Calendar
. Об этих элемента имеют достаточно много общих свойств.