DatePicker 클래스를 파생하여 사용자가 DateMode (일, 월, 연도)에 따라 컨트롤을 사용할 수 있도록하는 추가 DateMode 속성을 지원합니다. 따라서 DateMode를 Year로 설정하면 해당 컨트롤이 더 자세히 드릴 다운 될 수 없으므로 해당 연도의 달과 그 이후의 달을 볼 수 있습니다. 컨트롤이 정상적으로 작동하지만 문제가 하나 있습니다. DatePicker 컨트롤에서 포커스를 잃는 즉시 FormatMod에 따라 서식을 변경하는 'PART_TextBox'컨트롤에 문자열 서식을 적용했지만 서식이 손실됩니다. 다음은 내 파생 된 DatePicker 컨트롤 코드입니다.DatePicker SelectedDate 문자열 형식
public class MyDatePicker : DatePicker
{
public string DateMode
{
get { return (string)GetValue(DateModeProperty); }
set { SetValue(DateModeProperty, value); }
}
// Using a DependencyProperty as the backing store for DateMode. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DateModeProperty =
DependencyProperty.Register("DateMode", typeof(string), typeof(MyDatePicker), new UIPropertyMetadata("Day"));
protected override void OnCalendarOpened(RoutedEventArgs e)
{
var popup = this.Template.FindName("PART_Popup", this) as Popup;
var tb = this.Template.FindName("PART_TextBox", this) as TextBox;
if (popup != null && popup.Child is System.Windows.Controls.Calendar)
{
if (DateMode == "Year")
((System.Windows.Controls.Calendar)popup.Child).DisplayMode = CalendarMode.Decade;
else if (DateMode == "Month")
((System.Windows.Controls.Calendar)popup.Child).DisplayMode = CalendarMode.Year;
else if (DateMode == "Day")
((System.Windows.Controls.Calendar)popup.Child).DisplayMode = CalendarMode.Month;
}
((System.Windows.Controls.Calendar)popup.Child).DisplayModeChanged += new EventHandler<CalendarModeChangedEventArgs>(DatePickerCo_DisplayModeChanged);
}
protected override void OnCalendarClosed(RoutedEventArgs e)
{
base.OnCalendarClosed(e);
IsDropDownOpen = false;
var popup = this.Template.FindName("PART_Popup", this) as Popup;
((System.Windows.Controls.Calendar)popup.Child).DisplayModeChanged -= new EventHandler<CalendarModeChangedEventArgs>(DatePickerCo_DisplayModeChanged);
}
private void DatePickerCo_DisplayModeChanged(object sender, CalendarModeChangedEventArgs e)
{
var popup = this.Template.FindName("PART_Popup", this) as Popup;
var tb = this.Template.FindName("PART_TextBox", this) as TextBox;
if (popup != null && popup.Child is System.Windows.Controls.Calendar)
{
var _calendar = popup.Child as System.Windows.Controls.Calendar;
if (DateMode == "Month" && _calendar.DisplayMode == CalendarMode.Month)
{
if (IsDropDownOpen)
{
this.SelectedDate = _calendar.DisplayDate;
this.IsDropDownOpen = false;
_calendar.DisplayMode = CalendarMode.Year;
}
tb.Text = this.SelectedDate.Value.ToString("MMM yyyy");
}
else if (DateMode == "Year" && _calendar.DisplayMode == CalendarMode.Year)
{
if (IsDropDownOpen)
{
this.SelectedDate = _calendar.DisplayDate;
this.IsDropDownOpen = false;
_calendar.DisplayMode = CalendarMode.Decade;
}
tb.Text = this.SelectedDate.Value.ToString("yyyy");
}
}
}
}