using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
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;
namespace NEIntelligentControl2.Views.Basic
{
///
/// 时间选择控件
///
public partial class TimePicker : UserControl
{
public static readonly DependencyProperty SelectedDateTimeProperty = DependencyProperty.Register("SelectedDateTime", typeof(DateTime), typeof(TimePicker));
public static readonly RoutedEvent SelectedDatesChangedEvent = EventManager.RegisterRoutedEvent("SelectedTimeChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(TimePicker));
///
/// 选中的时间
///
public DateTime SelectedDateTime { get => (DateTime)GetValue(SelectedDateTimeProperty); set => SetValue(SelectedDateTimeProperty, value); }
///
/// 时间选择改变事件
///
public event RoutedEventHandler SelectedDateTimeChanged
{
add
{
AddHandler(SelectedDatesChangedEvent, value);
}
remove
{
RemoveHandler(SelectedDatesChangedEvent, value);
}
}
private DateTime _StartTime;
public TimePicker()
{
InitializeComponent();
var dt = DateTime.Now;
SelectedDateTime = dt.AddSeconds(-dt.Second);
_StartTime = SelectedDateTime;
Init();
}
private void Init()
{
int[] h = new int[24];
int[] m = new int[60];
for (int i = 0; i < 60; ++i)
{
if (i < 24) h[i] = i;
m[i] = i;
}
_lbhour.ItemsSource = h;
_lbminute.ItemsSource = m;
_lbhour.SelectedIndex = SelectedDateTime.Hour;
_lbminute.SelectedIndex = SelectedDateTime.Minute;
}
private void TextBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_popup.IsOpen = !_popup.IsOpen;
if (SelectedDateTime.CompareTo(_StartTime) == 0 || _popup.IsOpen) return;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
_popup.IsOpen = false;
switch (((Control)sender).Tag)
{
case "cancel":
SelectedDateTime = _StartTime;
break;
case "ok":
_StartTime = default(DateTime);
break;
default: return;
}
}
private void DateTimeChanged()
{
_StartTime = SelectedDateTime;
RoutedEventArgs rea = new RoutedEventArgs(SelectedDatesChangedEvent, this);
this.RaiseEvent(rea);
}
private async void Calendar_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
{
var date = (DateTime)e.AddedItems[0];
SelectedDateTime = date.Add(SelectedDateTime.TimeOfDay);
Mouse.Capture(null);
await Task.Delay(100);
_tb.Focus();
}
private async void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
int i = (int)e.AddedItems[0];
if (((Control)sender).Tag as string == "minute")
{
i -= SelectedDateTime.Minute;
SelectedDateTime = SelectedDateTime.AddMinutes(i);
}
else
{
i -= SelectedDateTime.Hour;
SelectedDateTime = SelectedDateTime.AddHours(i);
}
await Task.Delay(200);
_tb.Focus();
}
private async void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
await Task.Delay(200);
if (_tb.IsFocused && _popup.IsMouseOver) return;
_popup.IsOpen = false;
if (SelectedDateTime.CompareTo(_StartTime) == 0) return;
DateTimeChanged();
}
}
///
/// 时间转换
///
public class DateTimeConver : IValueConverter
{
//当值从绑定源传播给绑定目标时,调用方法Convert
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return DependencyProperty.UnsetValue;
DateTime date = (DateTime)value;
return date.ToString("yyyy-MM-dd HH:mm:ss");
}
//当值从绑定目标传播给绑定源时,调用此方法ConvertBack
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string str = value as string;
DateTime txtDate;
if (DateTime.TryParse(str, out txtDate))
{
return txtDate;
}
return DependencyProperty.UnsetValue;
}
}
}