WPF TimePicker控件源代码
来源:互联网 发布:淘宝店铺等级排名 编辑:程序博客网 时间:2024/04/30 06:50
#region [ Using namespaces ]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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.ComponentModel;
using AFC.WS.UI.Common;
using Microsoft.Windows.Controls;
using System.Windows.Controls.Primitives;
#endregion
namespace AFC.WS.UI.CommonControls
{
[TemplatePart(Name = TimePicker.ElementHourTextBox, Type = typeof(TextBox))]
[TemplatePart(Name = TimePicker.ElementMinuteTextBox, Type = typeof(TextBox))]
[TemplatePart(Name = TimePicker.ElementSecondTextBox, Type = typeof(TextBox))]
[TemplatePart(Name = TimePicker.ElementIncrementButton, Type = typeof(RepeatButton))]
[TemplatePart(Name = TimePicker.ElementDecrementButton, Type = typeof(RepeatButton))]
public partial class TimePicker : UserControl, ICommonEdit
{
#region [ Constants ]
private const string ElementHourTextBox = "PART_HourTextBox";
private const string ElementMinuteTextBox = "PART_MinuteTextBox";
private const string ElementSecondTextBox = "PART_SecondTextBox";
private const string ElementIncrementButton = "PART_IncrementButton";
private const string ElementDecrementButton = "PART_DecrementButton";
private static TimeSpan MinValidTime = new TimeSpan(0, 0, 0);
private static TimeSpan MaxValidTime = new TimeSpan(23, 59, 59);
private TextBox selectedTextBox = null;
#endregion
#region [ Staic Constructor ]
static TimePicker()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(TimePicker), new FrameworkPropertyMetadata(typeof(TimePicker)));
}
#endregion
#region [ Constructor ]
public TimePicker()
{
SelectedTime = DateTime.Now.TimeOfDay;
}
#endregion Ctor
#region [ Data ]
private TextBox hourTextBox;
private TextBox minuteTextBox;
private TextBox secondTextBox;
private RepeatButton incrementButton;
private RepeatButton decrementButton;
#endregion Data
#region [ Public Properties ]
/// <summary>
/// 获得TimePicker值
/// </summary>
[
Description("获得TimePicker控件值。"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Visible),
Category("TimePicker"),
Filter()
]
public string Text
{
get
{
TimeSpan timeSpan = SelectedTime;
string dataTime = timeSpan.Hours.ToString() + ":" + timeSpan.Minutes.ToString() + ":" + timeSpan.Seconds.ToString();
return dataTime;
}
set
{
DateTime dateTime = new DateTime();
try
{
dateTime = Convert.ToDateTime(value);
}
catch (Exception ex)
{
WriteLog.Log_Info("错误的日期格式!" + ex.ToString());
}
if (dateTime != null)
{
TimeSpan ts = new TimeSpan(dateTime.Hour, dateTime.Minute, dateTime.Second);
SelectedTime = ts;
}
}
}
#region SelectedTime
public TimeSpan SelectedTime
{
get { return (TimeSpan)GetValue(SelectedTimeProperty); }
set { SetValue(SelectedTimeProperty, value); }
}
public static readonly DependencyProperty SelectedTimeProperty =
DependencyProperty.Register(
"SelectedTime",
typeof(TimeSpan),
typeof(TimePicker),
new FrameworkPropertyMetadata(TimePicker.MinValidTime, new PropertyChangedCallback(TimePicker.OnSelectedTimeChanged), new CoerceValueCallback(TimePicker.CoerceSelectedTime)));
#endregion SelectedTime
#region MinTime
public TimeSpan MinTime
{
get { return (TimeSpan)GetValue(MinTimeProperty); }
set { SetValue(MinTimeProperty, value); }
}
public static readonly DependencyProperty MinTimeProperty =
DependencyProperty.Register(
"MinTime",
typeof(TimeSpan),
typeof(TimePicker),
new FrameworkPropertyMetadata(TimePicker.MinValidTime, new PropertyChangedCallback(TimePicker.OnMinTimeChanged)),
new ValidateValueCallback(TimePicker.IsValidTime));
#endregion MinTime
#region MaxTime
public TimeSpan MaxTime
{
get { return (TimeSpan)GetValue(MaxTimeProperty); }
set { SetValue(MaxTimeProperty, value); }
}
public static readonly DependencyProperty MaxTimeProperty =
DependencyProperty.Register(
"MaxTime",
typeof(TimeSpan),
typeof(TimePicker),
new FrameworkPropertyMetadata(TimePicker.MaxValidTime, new PropertyChangedCallback(TimePicker.OnMaxTimeChanged), new CoerceValueCallback(TimePicker.CoerceMaxTime)),
new ValidateValueCallback(TimePicker.IsValidTime));
#endregion MaxTime
#endregion Public Properties
#region [ SelectedTimeChangedEvent ]
public event RoutedPropertyChangedEventHandler<TimeSpan> SelectedTimeChanged
{
add { base.AddHandler(SelectedTimeChangedEvent, value); }
remove { base.RemoveHandler(SelectedTimeChangedEvent, value); }
}
public static readonly RoutedEvent SelectedTimeChangedEvent =
EventManager.RegisterRoutedEvent(
"SelectedTimeChanged",
RoutingStrategy.Bubble,
typeof(RoutedPropertyChangedEventHandler<TimeSpan>),
typeof(TimePicker));
#endregion SelectedTimeChangedEvent
#region [ Public Methods ]
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
hourTextBox = GetTemplateChild(ElementHourTextBox) as TextBox;
if (hourTextBox != null)
{
hourTextBox.IsReadOnly = true;
hourTextBox.GotFocus += SelectTextBox;
}
minuteTextBox = GetTemplateChild(ElementMinuteTextBox) as TextBox;
if (minuteTextBox != null)
{
minuteTextBox.IsReadOnly = true;
minuteTextBox.GotFocus += SelectTextBox;
}
secondTextBox = GetTemplateChild(ElementSecondTextBox) as TextBox;
if (secondTextBox != null)
{
secondTextBox.IsReadOnly = true;
secondTextBox.GotFocus += SelectTextBox;
}
incrementButton = GetTemplateChild(ElementIncrementButton) as RepeatButton;
if (incrementButton != null)
{
incrementButton.Click += IncrementTime;
}
decrementButton = GetTemplateChild(ElementDecrementButton) as RepeatButton;
if (decrementButton != null)
{
decrementButton.Click += DecrementTime;
}
}
#endregion Public Methods
#region [ Private Methods ]
protected virtual void OnSelectedTimeChanged(TimeSpan oldSelectedTime, TimeSpan newSelectedTime)
{
RoutedPropertyChangedEventArgs<TimeSpan> e = new RoutedPropertyChangedEventArgs<TimeSpan>(oldSelectedTime, newSelectedTime);
e.RoutedEvent = SelectedTimeChangedEvent;
base.RaiseEvent(e);
}
private static object CoerceSelectedTime(DependencyObject d, object value)
{
TimePicker timePicker = (TimePicker)d;
TimeSpan minimum = timePicker.MinTime;
if ((TimeSpan)value < minimum)
{
return minimum;
}
TimeSpan maximum = timePicker.MaxTime;
if ((TimeSpan)value > maximum)
{
return maximum;
}
return value;
}
private static object CoerceMaxTime(DependencyObject d, object value)
{
TimePicker timePicker = (TimePicker)d;
TimeSpan minimum = timePicker.MinTime;
if ((TimeSpan)value < minimum)
{
return minimum;
}
return value;
}
private static bool IsValidTime(object value)
{
TimeSpan time = (TimeSpan)value;
return MinValidTime <= time && time <= MaxValidTime;
}
private static void OnSelectedTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TimePicker element = (TimePicker)d;
element.OnSelectedTimeChanged((TimeSpan)e.OldValue, (TimeSpan)e.NewValue);
}
protected virtual void OnMinTimeChanged(TimeSpan oldMinTime, TimeSpan newMinTime)
{
}
private static void OnMinTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TimePicker element = (TimePicker)d;
element.CoerceValue(MaxTimeProperty);
element.CoerceValue(SelectedTimeProperty);
element.OnMinTimeChanged((TimeSpan)e.OldValue, (TimeSpan)e.NewValue);
}
protected virtual void OnMaxTimeChanged(TimeSpan oldMaxTime, TimeSpan newMaxTime)
{
}
private static void OnMaxTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TimePicker element = (TimePicker)d;
element.CoerceValue(SelectedTimeProperty);
element.OnMaxTimeChanged((TimeSpan)e.OldValue, (TimeSpan)e.NewValue);
}
private void SelectTextBox(object sender, RoutedEventArgs e)
{
selectedTextBox = sender as TextBox;
// selectedTextBox.MouseLeftButtonDown += new MouseButtonEventHandler(selectedTextBox_MouseLeftButtonDown);
}
private void IncrementTime(object sender, RoutedEventArgs e)
{
IncrementDecrementTime(1);
}
private void DecrementTime(object sender, RoutedEventArgs e)
{
IncrementDecrementTime(-1);
}
private void IncrementDecrementTime(int step)
{
if (selectedTextBox == null)
{
selectedTextBox = hourTextBox;
}
TimeSpan time;
if (selectedTextBox == hourTextBox)
{
time = SelectedTime.Add(new TimeSpan(step, 0, 0));
}
else if (selectedTextBox == minuteTextBox)
{
time = SelectedTime.Add(new TimeSpan(0, step, 0));
}
else
{
time = SelectedTime.Add(new TimeSpan(0, 0, step));
}
SelectedTime = time;
}
#endregion
#region [ ICommonEdit 成员 ]
public void Initialize()
{
}
public object GetControlValue()
{
return this.Text;
}
public void SetControlValue(object value)
{
this.Text = value.ToString();
}
#endregion
}
- WPF TimePicker控件源代码
- android控件20 TimePicker
- Android控件 TimePicker
- 遇见,控件----Datepicker&TimePicker
- 时间控件二--timepicker
- 控件之DatePicker、TimePicker学习
- Android控件开发之TimePicker
- Android控件之DatePicker、TimePicker
- android控件之 DatePicker、TimePicker
- [android]控件TimePicker/TimePickerDialog简介
- Win8 自定义TimePicker --- 用户控件
- DatePicker TimePicker---日期时间控件
- Android基本控件---DatePicker,TimePicker
- bootstrap的timepicker控件问题
- android DatePicker和TimePicker控件
- 日期时间控件DatePicker,TimePicker
- Android控件之TimePicker、DatePicker
- Android时间控件TimePicker使用
- 电子商务模式之我见
- nginx+PHP+PHP-FPM(FastCGI)在Ubuntu上的安装和配置
- 静态成员初始化
- Button按钮删除确认框三种方法
- autocad中的3个关键dll
- WPF TimePicker控件源代码
- 6410 DMA传输
- 机器码
- 反斜杠正斜杠
- 网络编程(五) 阻塞套接字如何非阻塞接收数据
- Android OMAP4 NEON
- 学习笔记: Struts2中使用validate框架对Action的不同方法进行验证
- FAST Search for SharePoint 和 SharePoint Server 2010 Search 的不同(3)
- autocad 菜单设置