using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
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;
namespace InSituLaboratory.Controls
{
///
/// DateTimePicker.xaml 的交互逻辑
///
public partial class DateTimePicker : UserControl
{
public event EventHandler SelectedChanged;
public DateTime CurrentDateTime
{
get { return (DateTime)GetValue(CurrentDateTimeProperty); }
set { SetValue(CurrentDateTimeProperty, value); }
}
public static readonly DependencyProperty CurrentDateTimeProperty =
DependencyProperty.Register("CurrentDateTime",
typeof(DateTime),
typeof(DateTimePicker),
new PropertyMetadata(DateTime.Now, new PropertyChangedCallback(OnCurrentDateTimeChanged)));
private static void OnCurrentDateTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
(d as DateTimePicker).Refresh();
}
private void Refresh()
{
this.calendar.SelectedDate = this.CurrentDateTime;
this.tb_Hour.Text = this.CurrentDateTime.Hour.ToString();
this.tb_minute.Text = this.CurrentDateTime.Minute.ToString();
this.tb_second.Text = this.CurrentDateTime.Second.ToString();
}
public DateTimePicker()
{
InitializeComponent();
}
private void BtnAccept_Click(object sender, RoutedEventArgs e)
{
//日期时间合并
int year = this.calendar.SelectedDate.Value.Year;
int month = this.calendar.SelectedDate.Value.Month;
int day = this.calendar.SelectedDate.Value.Day;
int.TryParse(this.tb_Hour.Text.Trim(), out int hour);
int.TryParse(this.tb_minute.Text.Trim(), out int minute);
int.TryParse(this.tb_second.Text.Trim(), out int second);
CurrentDateTime = new DateTime(year, month, day, hour, minute, second);
this.popup.IsOpen = false;
SelectedChanged?.Invoke(this, CurrentDateTime);
}
private void BtnHourUp_Click(object sender, RoutedEventArgs e)
{
int.TryParse(this.tb_Hour.Text.Trim(), out int hour);
hour++;
hour %= 24;
this.tb_Hour.Text = hour.ToString();
}
private void BtnMinuteUp_Click(object sender, RoutedEventArgs e)
{
RepeatButton btn = sender as RepeatButton;
TextBox tb = btn.Tag as TextBox;
int.TryParse(tb.Text.Trim(), out int value);
value++;
value %= 60;
tb.Text = value.ToString();
}
private void BtnHourDown_Click(object sender, RoutedEventArgs e)
{
int.TryParse(this.tb_Hour.Text.Trim(), out int hour);
hour--;
if (hour < 0) hour = 23;
this.tb_Hour.Text = hour.ToString();
}
private void BtnMinuteDown_Click(object sender, RoutedEventArgs e)
{
RepeatButton btn = sender as RepeatButton;
TextBox tb = btn.Tag as TextBox;
int.TryParse(tb.Text.Trim(), out int value);
value--;
if (value < 0) value = 59;
tb.Text = value.ToString();
}
private void tb_Hour_TextChanged(object sender, TextChangedEventArgs e)
{
var tb = sender as TextBox;
if (!string.IsNullOrEmpty(tb.Text.Trim()))
{
int.TryParse(tb.Text.Trim(), out int hour);
if (hour < 0)
{
hour *= -1;
tb.TextChanged -= tb_Hour_TextChanged;
tb.Text = tb.Text.Substring(1);
tb.TextChanged += tb_Hour_TextChanged;
}
if (hour > 23)
{
tb.TextChanged -= tb_Hour_TextChanged;
tb.Text = tb.Text.Substring(0, tb.Text.Length - 1);
tb.TextChanged += tb_Hour_TextChanged;
}
}
}
private void tb_minute_TextChanged(object sender, TextChangedEventArgs e)
{
var tb = sender as TextBox;
if (!string.IsNullOrEmpty(tb.Text.Trim()))
{
int.TryParse(tb.Text.Trim(), out int minute);
if (minute < 0)
{
minute *= -1;
tb.TextChanged -= tb_Hour_TextChanged;
tb.Text = tb.Text.Substring(1);
tb.TextChanged += tb_Hour_TextChanged;
}
if (minute > 59)
{
tb.TextChanged -= tb_minute_TextChanged;
tb.Text = tb.Text.Substring(0, tb.Text.Length - 1);
tb.TextChanged += tb_minute_TextChanged;
}
}
}
private void BtnCancel_Click(object sender, RoutedEventArgs e)
{
this.popup.IsOpen = false;
}
}
}