using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; namespace Txgy.Controls { /// /// CalendarClock.xaml 的交互逻辑 /// public partial class CalendarClock : UserControl { private readonly TaskScheduler _syncContextTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext(); private bool _isDisposed=false; List tasks = new List(); public Color ForegroundColor { get { return (Color)GetValue(ForegroundColorProperty); } set { SetValue(ForegroundColorProperty, value); } } // Using a DependencyProperty as the backing store for ForegroundColor. This enables animation, styling, binding, etc... public static readonly DependencyProperty ForegroundColorProperty = DependencyProperty.Register("ForegroundColor", typeof(Color), typeof(CalendarClock), new PropertyMetadata(Color.FromRgb(122, 64, 242))); public CalendarClock() { InitializeComponent(); var runtask = Task.Factory.StartNew(async () => { while (!_isDisposed) { DateTime dt = DateTime.Now; string DateStr = "公历 " + dt.ToString("yyyy年MM月dd日"); Task.Factory.StartNew(() => UpdateLabel(this.lblGL, DateStr), new CancellationTokenSource().Token, TaskCreationOptions.None, _syncContextTaskScheduler).Wait(); DateStr = SolarToChineseLunisolarDate(dt); Task.Factory.StartNew(() => UpdateLabel(this.lblNL, DateStr), new CancellationTokenSource().Token, TaskCreationOptions.None, _syncContextTaskScheduler).Wait(); DateStr = dt.ToString("T"); Task.Factory.StartNew(() => UpdateLabel(this.lblTime, dt.ToString("T")), new CancellationTokenSource().Token, TaskCreationOptions.None, _syncContextTaskScheduler).Wait(); await Task.Delay(1000); } }); tasks.Add(runtask); } ~CalendarClock() { Dispose(); } public void Dispose() { if (!_isDisposed) { _isDisposed = true; Task.WaitAll(tasks.ToArray()); GC.SuppressFinalize(this); } } private void UpdateLabel(Label lbl, string text) { lbl.Content = text; } /// /// 公历转为农历的函数 /// /// 公历日期 /// 农历的日期 public string SolarToChineseLunisolarDate(DateTime solarDateTime) { System.Globalization.ChineseLunisolarCalendar cal = new System.Globalization.ChineseLunisolarCalendar(); int year = cal.GetYear(solarDateTime); int month = cal.GetMonth(solarDateTime); int day = cal.GetDayOfMonth(solarDateTime); int leapMonth = cal.GetLeapMonth(year); return string.Format("农历 {0}{1}月{2}{3} {4}" , month == leapMonth ? "闰" : "" ,"无正二三四五六七八九十冬腊"[leapMonth > 0 && leapMonth <= month ? month - 1 : month] , "初十廿三"[day / 10] , "日一二三四五六七八九"[day % 10] , GetDayName(solarDateTime)); } /// /// 公历转为农历的函数 /// /// 公历日期 /// 农历的日期 static string SolarToChineseLunisolarAllDate(DateTime solarDateTime) { System.Globalization.ChineseLunisolarCalendar cal = new System.Globalization.ChineseLunisolarCalendar(); int year = cal.GetYear(solarDateTime); int month = cal.GetMonth(solarDateTime); int day = cal.GetDayOfMonth(solarDateTime); int leapMonth = cal.GetLeapMonth(year); return string.Format("农历{0}{1}({2})年{3}{4}月{5}{6}" , "甲乙丙丁戊己庚辛壬癸"[(year - 4) % 10] , "子丑寅卯辰巳午未申酉戌亥"[(year - 4) % 12] , "鼠牛虎兔龙蛇马羊猴鸡狗猪"[(year - 4) % 12] , month == leapMonth ? "闰" : "" , "无正二三四五六七八九十冬腊"[leapMonth > 0 && leapMonth <= month ? month - 1 : month] , "初十廿三"[day / 10] , "日一二三四五六七八九"[day % 10] ); } private string GetDayName(DateTime today) { string result = ""; if (today.DayOfWeek == DayOfWeek.Monday) { result = "星期一"; } else if (today.DayOfWeek == DayOfWeek.Tuesday) { result = "星期二"; } else if (today.DayOfWeek == DayOfWeek.Wednesday) { result = "星期三"; } else if (today.DayOfWeek == DayOfWeek.Thursday) { result = "星期四"; } else if (today.DayOfWeek == DayOfWeek.Friday) { result = "星期五"; } else if (today.DayOfWeek == DayOfWeek.Saturday) { result = "星期六"; } else if (today.DayOfWeek == DayOfWeek.Sunday) { result = "星期日"; } return result; } } }