diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimePicker/Implementation/DateTimePicker.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimePicker/Implementation/DateTimePicker.cs new file mode 100644 index 00000000..27055917 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimePicker/Implementation/DateTimePicker.cs @@ -0,0 +1,196 @@ +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; + +namespace Microsoft.Windows.Controls +{ + public class DateTimePicker : Control + { + #region Members + + private Calendar _calendar; + + #endregion //Members + + #region Properties + + #region Format + + public static readonly DependencyProperty FormatProperty = DependencyProperty.Register("Format", typeof(DateTimeFormat), typeof(DateTimePicker), new UIPropertyMetadata(DateTimeFormat.FullDateTime, OnFormatChanged)); + public DateTimeFormat Format + { + get { return (DateTimeFormat)GetValue(FormatProperty); } + set { SetValue(FormatProperty, value); } + } + + private static void OnFormatChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + DateTimePicker DateTimePicker = o as DateTimePicker; + if (DateTimePicker != null) + DateTimePicker.OnFormatChanged((DateTimeFormat)e.OldValue, (DateTimeFormat)e.NewValue); + } + + protected virtual void OnFormatChanged(DateTimeFormat oldValue, DateTimeFormat newValue) + { + + } + + #endregion //Format + + #region FormatString + + public static readonly DependencyProperty FormatStringProperty = DependencyProperty.Register("FormatString", typeof(string), typeof(DateTimePicker), new UIPropertyMetadata(default(String), OnFormatStringChanged)); + public string FormatString + { + get { return (string)GetValue(FormatStringProperty); } + set { SetValue(FormatStringProperty, value); } + } + + private static void OnFormatStringChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + DateTimePicker DateTimePicker = o as DateTimePicker; + if (DateTimePicker != null) + DateTimePicker.OnFormatStringChanged((string)e.OldValue, (string)e.NewValue); + } + + protected virtual void OnFormatStringChanged(string oldValue, string newValue) + { + if (string.IsNullOrEmpty(newValue)) + throw new ArgumentException("CustomFormat should be specified.", FormatString); + } + + #endregion //FormatString + + #region IsOpen + + public static readonly DependencyProperty IsOpenProperty = DependencyProperty.Register("IsOpen", typeof(bool), typeof(DateTimePicker), new UIPropertyMetadata(false)); + public bool IsOpen + { + get { return (bool)GetValue(IsOpenProperty); } + set { SetValue(IsOpenProperty, value); } + } + + #endregion //IsOpen + + #region SelectedDate + + public static readonly DependencyProperty SelectedDateProperty = DependencyProperty.Register("SelectedDate", typeof(DateTime?), typeof(DateTimePicker), new UIPropertyMetadata(DateTime.Now, new PropertyChangedCallback(OnSelectedDateChanged), new CoerceValueCallback(OnCoerceSelectedDate))); + public DateTime? SelectedDate + { + get { return (DateTime?)GetValue(SelectedDateProperty); } + set { SetValue(SelectedDateProperty, value); } + } + + private static object OnCoerceSelectedDate(DependencyObject o, object value) + { + DateTimePicker dateTimePicker = o as DateTimePicker; + if (dateTimePicker != null) + return dateTimePicker.OnCoerceSelectedDate((DateTime?)value); + else + return value; + } + + private static void OnSelectedDateChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + DateTimePicker dateTimePicker = o as DateTimePicker; + if (dateTimePicker != null) + dateTimePicker.OnSelectedDateChanged((DateTime?)e.OldValue, (DateTime?)e.NewValue); + } + + protected virtual DateTime? OnCoerceSelectedDate(DateTime? value) + { + // TODO: Keep the proposed value within the desired range. + return value; + } + + protected virtual void OnSelectedDateChanged(DateTime? oldValue, DateTime? newValue) + { + if (_calendar != null && _calendar.SelectedDate.Value != newValue.Value) + _calendar.SelectedDate = newValue; + } + + #endregion //SelectedDate + + #endregion //Properties + + #region Constructors + + static DateTimePicker() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(DateTimePicker), new FrameworkPropertyMetadata(typeof(DateTimePicker))); + } + + public DateTimePicker() + { + Keyboard.AddKeyDownHandler(this, OnKeyDown); + Mouse.AddPreviewMouseDownOutsideCapturedElementHandler(this, OnMouseDownOutsideCapturedElement); + } + + #endregion //Constructors + + #region Base Class Overrides + + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + _calendar = (Calendar)GetTemplateChild("Part_Calendar"); + _calendar.SelectedDatesChanged += Calendar_SelectedDatesChanged; + _calendar.SelectedDate = SelectedDate; + } + + #endregion //Base Class Overrides + + #region Event Handlers + + private void OnKeyDown(object sender, KeyEventArgs e) + { + switch (e.Key) + { + case Key.Escape: + case Key.Tab: + { + CloseDateTimePicker(); + break; + } + } + } + + private void OnMouseDownOutsideCapturedElement(object sender, MouseButtonEventArgs e) + { + CloseDateTimePicker(); + } + + void Calendar_SelectedDatesChanged(object sender, SelectionChangedEventArgs e) + { + if (e.AddedItems.Count > 0) + { + var newDate = (DateTime?)e.AddedItems[0]; + SelectedDate = newDate.Value; + } + } + + #endregion //Event Handlers + + #region Methods + + private void CloseDateTimePicker() + { + if (IsOpen) + IsOpen = false; + ReleaseMouseCapture(); + } + + #endregion //Methods + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimePicker/Themes/Generic.xaml b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimePicker/Themes/Generic.xaml new file mode 100644 index 00000000..534a89c2 --- /dev/null +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimePicker/Themes/Generic.xaml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Themes/Generic.xaml b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Themes/Generic.xaml index e7e852c2..188d4c2e 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Themes/Generic.xaml +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Themes/Generic.xaml @@ -7,12 +7,13 @@