MyDatePicker.xaml
<UserControl
x:Class="BPCompanion.MyDatePicker"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:BPCompanion"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="40"
d:DesignWidth="260">
<Grid >
<StackPanel Orientation="Horizontal" Height="40">
<ComboBox x:Name="monthlist" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="40" >
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=MONTH}" VerticalAlignment="Center" FontSize="16" Width="60"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ComboBox x:Name="daylist" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="40" Margin="10,0,0,0">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=DAY}" VerticalAlignment="Center" FontSize="16" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ComboBox x:Name="yearlist" HorizontalAlignment="Left" VerticalAlignment="Top"
Width="80" Height="40" Margin="10,0,0,0">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=YEAR}" VerticalAlignment="Center" FontSize="15" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</StackPanel>
</Grid>
</UserControl>
MyDatePicker.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
//
namespace BPCompanion
{
public partial class MyDatePicker : UserControl
{
public delegate void Date_ChangedHandler(DateTime date); // 声明一个 委托,在日期选择发生变化时调用
public event Date_ChangedHandler Date_ChangedHandlerEvent; // 声明一个这种委托的事件
public int select_year { get; set; }
public int select_month { get; set; }
public int select_day { get; set; }
public DateTime currentDate { get; set; }
public void setDate(DateTime datetime)
{
this.yearlist.SelectedIndex = datetime.Year - 1901;
this.monthlist.SelectedIndex = datetime.Month - 1;
this.daylist.SelectedIndex = datetime.Day - 1;
select_year = datetime.Year;
select_month = datetime.Month;
select_day = datetime.Day;
currentDate = new DateTime(select_year, select_month, select_day);
}
public MyDatePicker()
{
this.InitializeComponent();
Date date = new Date();
DateTime now = DateTime.Now;
DateModel datemodel = new DateModel(date, now.Year, now.Month);
this.yearlist.ItemsSource = datemodel.Years;
this.monthlist.ItemsSource = datemodel.Months;
this.daylist.ItemsSource = datemodel.Days;
this.yearlist.SelectedIndex = now.Year - 1901;
this.monthlist.SelectedIndex = now.Month - 1;
this.daylist.SelectedIndex = now.Day - 1;
select_year = now.Year;
select_month = now.Month;
select_day = now.Day;
currentDate = new DateTime(select_year, select_month, select_day);
this.yearlist.SelectionChanged += (a, args) =>
{
if (args.AddedItems.Count <= 0)
{
return;
}
Year item = (dynamic)args.AddedItems[0];
if (item != null)
{
select_year = item.YEAR;
if (datemodel.Days.Count != (new DateModel(date, select_year, select_month)).Days.Count)
{
datemodel = new DateModel(date, select_year, select_month);
this.daylist.ItemsSource = datemodel.Days;
if (select_day > datemodel.Days.Count)
{
this.daylist.SelectedIndex = 0;
select_day = 1;
}
else
{
this.daylist.SelectedIndex = select_day - 1;
}
}
DateTime dt = new DateTime(select_year, select_month, select_day);
currentDate = dt;
if (Date_ChangedHandlerEvent != null) // 判断是否有注册事件
{
Date_ChangedHandlerEvent(dt); //调用所有注册对象的方法
}
}
};
this.monthlist.SelectionChanged += (a, args) =>
{
if (args.AddedItems.Count <= 0)
{
return;
}
Month item = (dynamic)args.AddedItems[0];
if (item != null)
{
select_month = this.monthlist.SelectedIndex + 1;
if (datemodel.Days.Count != (new DateModel(date, select_year, select_month)).Days.Count)
{
datemodel = new DateModel(date, select_year, select_month);
this.daylist.ItemsSource = datemodel.Days;
if (select_day > datemodel.Days.Count)
{
this.daylist.SelectedIndex = 0;
select_day = 1;
}
else
{
this.daylist.SelectedIndex = select_day - 1;
}
}
DateTime dt = new DateTime(select_year, select_month, select_day);
currentDate = dt;
if (Date_ChangedHandlerEvent != null)
{
Date_ChangedHandlerEvent(dt); //调用所有注册对象的方法
}
}
};
this.daylist.SelectionChanged += (a, args) =>
{
if (args.AddedItems.Count <= 0)
{
return;
}
Day item = (dynamic)args.AddedItems[0];
if (item != null)
{
select_day = item.DAY;
if (datemodel.Days.Count != (new DateModel(date, select_year, select_month)).Days.Count)
{
datemodel = new DateModel(date, select_year, select_month);
this.daylist.ItemsSource = datemodel.Days;
this.daylist.SelectedIndex = 0;
}
DateTime dt = new DateTime(select_year, select_month, select_day);
currentDate = dt;
if (Date_ChangedHandlerEvent != null)
{
Date_ChangedHandlerEvent(dt); //调用所有注册对象的方法
}
}
};
}
}
public class DateModel
{
public List<Year> years;
public List<Month> months;
public List<Day> days;
bool isLeapYear = false; // 标识 是否为闰年,默认为false
public DateModel(Date date, int year_p, int month_p)
{
years = date.years;
months = date.months;
//if (((0 == year_p % 100) && (0 == year_p % 4)) || (0 == year_p % 400))
if (DateTime.IsLeapYear(year_p))
{
isLeapYear = true;
}
if (2 == month_p)
{
if (isLeapYear)
{
days = date.day_29;
}
else
{
days = date.day_28;
}
}
else
{
if (1 == month_p || 3 == month_p || 5 == month_p || 7 == month_p || 8 == month_p || 10 == month_p || 12 == month_p)
{
days = date.day_31;
}
else
{
days = date.day_30;
}
}
}
public List<Year> Years
{
get { return years; }
set { years = value; }
}
public List<Month> Months
{
get { return months; }
set { months = value; }
}
public List<Day> Days
{
get { return days; }
set { days = value; }
}
}
public class Date
{
public List<Year> years = new List<Year>(200); // 1901 ~ 2100
public List<Month> months = new List<Month>(12); //
public List<Day> day_28 = new List<Day>(28);
public List<Day> day_29 = new List<Day>(29);
public List<Day> day_30 = new List<Day>(30);
public List<Day> day_31 = new List<Day>(31);
public Date()
{
for (int i = 0; i < 200; i++)
{
years.Add(new Year(1901 + i));
}
//for (int i = 0; i < 12; i++)
//{
// months.Add(new Month(i + 1));
//}
months.Add(new Month("Jan"));
months.Add(new Month("Feb"));
months.Add(new Month("Mar"));
months.Add(new Month("Apr"));
months.Add(new Month("May"));
months.Add(new Month("Jun"));
months.Add(new Month("Jul"));
months.Add(new Month("Aug"));
months.Add(new Month("Sep"));
months.Add(new Month("Oct"));
months.Add(new Month("Nov"));
months.Add(new Month("Dec"));
for (int i = 0; i < 31; i++)
{
if (i < 28)
{
day_28.Add(new Day(i + 1));
}
if (i < 29)
{
day_29.Add(new Day(i + 1));
}
if (i < 30)
{
day_30.Add(new Day(i + 1));
}
if (i < 31)
{
day_31.Add(new Day(i + 1));
}
}
}
}
public class Year
{
public int _year;
public Year(int year_p)
{
YEAR = year_p;
}
public int YEAR
{
get { return _year; }
set { _year = value; }
}
}
public class Month
{
public string _month;
public Month(string month_p)
{
MONTH = month_p;
}
public string MONTH
{
get { return _month; }
set { _month = value; }
}
}
public class Day
{
public int _day;
public Day(int day_p)
{
DAY = day_p;
}
public int DAY
{
get { return _day; }
set { _day = value; }
}
}
// // 数字月份
//public class Month
//{
// public int _month;
// public Month(int month_p)
// {
// MONTH = month_p;
// }
// public int MONTH
// {
// get { return _month; }
// set { _month = value; }
// }
//}
}
// 使用方法:
1:在XAML中引入-----------xmlns:picker="using:BPCompanion"
2:在使用的位置----------
<picker:MyDatePicker x:Name="datepicker" Grid.Row="3" />
3:设置数据、获得数据
this.datepicker.setDate(DateTime.Now.AddHours(-8));
this.datepicker.Date_ChangedHandlerEvent += (date)=>{ // 向委托注册事件
this.profilename.Text = date.ToString("MMM,dd yyyy");
};
this.datepicker.currentDate;
效果: