Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 49 additions & 30 deletions src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
Expand Down Expand Up @@ -75,8 +75,10 @@ public event EventHandler<FunctionEventArgs<DateTime?>> SelectedDateTimeChanged
static DateTimePicker()
{
EventManager.RegisterClassHandler(typeof(DateTimePicker), GotFocusEvent, new RoutedEventHandler(OnGotFocus));
KeyboardNavigation.TabNavigationProperty.OverrideMetadata(typeof(DateTimePicker), new FrameworkPropertyMetadata(KeyboardNavigationMode.Once));
KeyboardNavigation.IsTabStopProperty.OverrideMetadata(typeof(DateTimePicker), new FrameworkPropertyMetadata(ValueBoxes.FalseBox));
KeyboardNavigation.TabNavigationProperty.OverrideMetadata(typeof(DateTimePicker),
new FrameworkPropertyMetadata(KeyboardNavigationMode.Once));
KeyboardNavigation.IsTabStopProperty.OverrideMetadata(typeof(DateTimePicker),
new FrameworkPropertyMetadata(ValueBoxes.FalseBox));
}

public DateTimePicker()
Expand Down Expand Up @@ -111,7 +113,9 @@ public Style CalendarStyle
}

public static readonly DependencyProperty DisplayDateTimeProperty = DependencyProperty.Register(
nameof(DisplayDateTime), typeof(DateTime), typeof(DateTimePicker), new FrameworkPropertyMetadata(DateTime.Now, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null, CoerceDisplayDateTime));
nameof(DisplayDateTime), typeof(DateTime), typeof(DateTimePicker),
new FrameworkPropertyMetadata(DateTime.Now, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null,
CoerceDisplayDateTime));

private static object CoerceDisplayDateTime(DependencyObject d, object value)
{
Expand All @@ -128,7 +132,9 @@ public DateTime DisplayDateTime
}

public static readonly DependencyProperty IsDropDownOpenProperty = DependencyProperty.Register(
nameof(IsDropDownOpen), typeof(bool), typeof(DateTimePicker), new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnIsDropDownOpenChanged, OnCoerceIsDropDownOpen));
nameof(IsDropDownOpen), typeof(bool), typeof(DateTimePicker),
new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
OnIsDropDownOpenChanged, OnCoerceIsDropDownOpen));

private static object OnCoerceIsDropDownOpen(DependencyObject d, object baseValue) =>
d is DateTimePicker
Expand Down Expand Up @@ -165,7 +171,9 @@ public bool IsDropDownOpen
}

public static readonly DependencyProperty SelectedDateTimeProperty = DependencyProperty.Register(
nameof(SelectedDateTime), typeof(DateTime?), typeof(DateTimePicker), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSelectedDateTimeChanged, CoerceSelectedDateTime));
nameof(SelectedDateTime), typeof(DateTime?), typeof(DateTimePicker),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
OnSelectedDateTimeChanged, CoerceSelectedDateTime));

private static object CoerceSelectedDateTime(DependencyObject d, object value)
{
Expand All @@ -183,6 +191,10 @@ private static void OnSelectedDateTimeChanged(DependencyObject d, DependencyProp
var time = dp.SelectedDateTime.Value;
dp.SetTextInternal(dp.DateTimeToString(time));
}
else
{
dp.SetTextInternal(string.Empty);
}

dp.RaiseEvent(new FunctionEventArgs<DateTime?>(SelectedDateTimeChangedEvent, dp)
{
Expand All @@ -197,7 +209,8 @@ public DateTime? SelectedDateTime
}

public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
nameof(Text), typeof(string), typeof(DateTimePicker), new FrameworkPropertyMetadata(string.Empty, OnTextChanged));
nameof(Text), typeof(string), typeof(DateTimePicker),
new FrameworkPropertyMetadata(string.Empty, OnTextChanged));

private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Expand Down Expand Up @@ -328,7 +341,8 @@ public override void OnApplyTemplate()
{
_textBox.SetBinding(SelectionBrushProperty, new Binding(SelectionBrushProperty.Name) { Source = this });
#if !(NET40 || NET45 || NET451 || NET452 || NET46 || NET461 || NET462 || NET47 || NET471 || NET472)
_textBox.SetBinding(SelectionTextBrushProperty, new Binding(SelectionTextBrushProperty.Name) { Source = this });
_textBox.SetBinding(SelectionTextBrushProperty,
new Binding(SelectionTextBrushProperty.Name) { Source = this });
#endif
_textBox.SetBinding(SelectionOpacityProperty, new Binding(SelectionOpacityProperty.Name) { Source = this });
_textBox.SetBinding(CaretBrushProperty, new Binding(CaretBrushProperty.Name) { Source = this });
Expand Down Expand Up @@ -402,7 +416,8 @@ private void InitCalendarWithClock()

private void CalendarWithClock_Confirmed() => TogglePopup();

private void CalendarWithClock_SelectedDateTimeChanged(object sender, FunctionEventArgs<DateTime?> e) => SelectedDateTime = e.Info;
private void CalendarWithClock_SelectedDateTimeChanged(object sender, FunctionEventArgs<DateTime?> e) =>
SelectedDateTime = e.Info;

private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
Expand Down Expand Up @@ -445,29 +460,29 @@ private bool ProcessDateTimePickerKey(KeyEventArgs e)
switch (e.Key)
{
case Key.System:
{
switch (e.SystemKey)
{
switch (e.SystemKey)
case Key.Down:
{
case Key.Down:
{
if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)
{
TogglePopup();
return true;
}

break;
}
}
if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)
{
TogglePopup();
return true;
}

break;
break;
}
}

break;
}

case Key.Enter:
{
SetSelectedDateTime();
return true;
}
{
SetSelectedDateTime();
return true;
}
}

return false;
Expand Down Expand Up @@ -588,10 +603,10 @@ private void SafeSetText(string s)

if (SelectedDateTime != null)
{
var newtext = DateTimeToString(SelectedDateTime.Value);
SafeSetText(newtext);
SafeSetText(DateTimeToString(SelectedDateTime.Value));
return SelectedDateTime;
}

SafeSetText(DateTimeToString(DisplayDateTime));
return DisplayDateTime;
}
Expand Down Expand Up @@ -620,7 +635,7 @@ private void SetSelectedDateTime()
}

var d = SetTextBoxValue(s);
if (!SelectedDateTime.Equals(d))
if (!Equals(SelectedDateTime, d))
{
SetCurrentValue(SelectedDateTimeProperty, d);
SetCurrentValue(DisplayDateTimeProperty, d);
Expand All @@ -632,12 +647,16 @@ private void SetSelectedDateTime()
{
SetCurrentValue(SelectedDateTimeProperty, null);
}
else
{
SetTextInternal(string.Empty);
}
}
}
else
{
var d = SetTextBoxValue(_defaultText);
if (!SelectedDateTime.Equals(d))
if (!Equals(SelectedDateTime, d))
{
SetCurrentValue(SelectedDateTimeProperty, d);
}
Expand Down
72 changes: 44 additions & 28 deletions src/Shared/HandyControl_Shared/Controls/Input/TimePicker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,10 @@ public event EventHandler<FunctionEventArgs<DateTime?>> SelectedTimeChanged
static TimePicker()
{
EventManager.RegisterClassHandler(typeof(TimePicker), GotFocusEvent, new RoutedEventHandler(OnGotFocus));
KeyboardNavigation.TabNavigationProperty.OverrideMetadata(typeof(TimePicker), new FrameworkPropertyMetadata(KeyboardNavigationMode.Once));
KeyboardNavigation.IsTabStopProperty.OverrideMetadata(typeof(TimePicker), new FrameworkPropertyMetadata(ValueBoxes.FalseBox));
KeyboardNavigation.TabNavigationProperty.OverrideMetadata(typeof(TimePicker),
new FrameworkPropertyMetadata(KeyboardNavigationMode.Once));
KeyboardNavigation.IsTabStopProperty.OverrideMetadata(typeof(TimePicker),
new FrameworkPropertyMetadata(ValueBoxes.FalseBox));
}

public TimePicker()
Expand Down Expand Up @@ -115,7 +117,8 @@ public DateTime DisplayTime
nameof(DisplayTime),
typeof(DateTime),
typeof(TimePicker),
new FrameworkPropertyMetadata(DateTime.Now, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null, CoerceDisplayTime));
new FrameworkPropertyMetadata(DateTime.Now, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null,
CoerceDisplayTime));

private static object CoerceDisplayTime(DependencyObject d, object value)
{
Expand All @@ -139,7 +142,8 @@ public bool IsDropDownOpen
nameof(IsDropDownOpen),
typeof(bool),
typeof(TimePicker),
new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnIsDropDownOpenChanged, OnCoerceIsDropDownOpen));
new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
OnIsDropDownOpenChanged, OnCoerceIsDropDownOpen));

private static object OnCoerceIsDropDownOpen(DependencyObject d, object baseValue)
{
Expand Down Expand Up @@ -183,7 +187,8 @@ public DateTime? SelectedTime
nameof(SelectedTime),
typeof(DateTime?),
typeof(TimePicker),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSelectedTimeChanged, CoerceSelectedTime));
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
OnSelectedTimeChanged, CoerceSelectedTime));

private static void OnSelectedTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Expand All @@ -194,6 +199,10 @@ private static void OnSelectedTimeChanged(DependencyObject d, DependencyProperty
var time = dp.SelectedTime.Value;
dp.SetTextInternal(dp.DateTimeToString(time));
}
else
{
dp.SetTextInternal(string.Empty);
}

dp.RaiseEvent(new FunctionEventArgs<DateTime?>(SelectedTimeChangedEvent, dp)
{
Expand Down Expand Up @@ -306,7 +315,9 @@ public Brush CaretBrush
}

public static readonly DependencyProperty ClockProperty = DependencyProperty.Register(
nameof(Clock), typeof(ClockBase), typeof(TimePicker), new FrameworkPropertyMetadata(default(Clock), FrameworkPropertyMetadataOptions.NotDataBindable, OnClockChanged));
nameof(Clock), typeof(ClockBase), typeof(TimePicker),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.NotDataBindable,
OnClockChanged));

private static void OnClockChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Expand Down Expand Up @@ -384,7 +395,8 @@ public override void OnApplyTemplate()
{
_textBox.SetBinding(SelectionBrushProperty, new Binding(SelectionBrushProperty.Name) { Source = this });
#if !(NET40 || NET45 || NET451 || NET452 || NET46 || NET461 || NET462 || NET47 || NET471 || NET472)
_textBox.SetBinding(SelectionTextBrushProperty, new Binding(SelectionTextBrushProperty.Name) { Source = this });
_textBox.SetBinding(SelectionTextBrushProperty,
new Binding(SelectionTextBrushProperty.Name) { Source = this });
#endif
_textBox.SetBinding(SelectionOpacityProperty, new Binding(SelectionOpacityProperty.Name) { Source = this });
_textBox.SetBinding(CaretBrushProperty, new Binding(CaretBrushProperty.Name) { Source = this });
Expand Down Expand Up @@ -488,29 +500,29 @@ private bool ProcessTimePickerKey(KeyEventArgs e)
switch (e.Key)
{
case Key.System:
{
switch (e.SystemKey)
{
switch (e.SystemKey)
case Key.Down:
{
case Key.Down:
{
if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)
{
TogglePopup();
return true;
}

break;
}
}
if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)
{
TogglePopup();
return true;
}

break;
break;
}
}

break;
}

case Key.Enter:
{
SetSelectedTime();
return true;
}
{
SetSelectedTime();
return true;
}
}

return false;
Expand Down Expand Up @@ -635,10 +647,10 @@ private void SafeSetText(string s)

if (SelectedTime != null)
{
var newtext = DateTimeToString((DateTime) SelectedTime);
SafeSetText(newtext);
SafeSetText(DateTimeToString((DateTime) SelectedTime));
return SelectedTime;
}

SafeSetText(DateTimeToString(DisplayTime));
return DisplayTime;
}
Expand All @@ -662,7 +674,7 @@ private void SetSelectedTime()
}

var d = SetTextBoxValue(s);
if (!SelectedTime.Equals(d))
if (!Equals(SelectedTime, d))
{
SetCurrentValue(SelectedTimeProperty, d);
SetCurrentValue(DisplayTimeProperty, d);
Expand All @@ -674,12 +686,16 @@ private void SetSelectedTime()
{
SetCurrentValue(SelectedTimeProperty, null);
}
else
{
SetTextInternal(string.Empty);
}
}
}
else
{
var d = SetTextBoxValue(_defaultText);
if (!SelectedTime.Equals(d))
if (!Equals(SelectedTime, d))
{
SetCurrentValue(SelectedTimeProperty, d);
}
Expand Down