diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs index 4872113e..b616bb2a 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs @@ -73,10 +73,12 @@ namespace Microsoft.Windows.Controls.Primitives protected virtual void OnValueChanged(T oldValue, T newValue) { - CoerceValue(newValue); + ValidateValue(newValue); SyncTextAndValueProperties(ValueProperty, string.Empty); + SetValidSpinDirection(); + RoutedPropertyChangedEventArgs args = new RoutedPropertyChangedEventArgs(oldValue, newValue); args.RoutedEvent = ValueChangedEvent; RaiseEvent(args); @@ -109,6 +111,8 @@ namespace Microsoft.Windows.Controls.Primitives TextBox = GetTemplateChild(ElementTextName) as TextBox; Spinner = GetTemplateChild(ElementSpinnerName) as Spinner; Spinner.Spin += OnSpinnerSpin; + + SetValidSpinDirection(); } protected override void OnGotFocus(RoutedEventArgs e) @@ -256,12 +260,11 @@ namespace Microsoft.Windows.Controls.Primitives } #region Abstract - - + /// /// Coerces the value. /// - protected abstract void CoerceValue(T value); + protected abstract T CoerceValue(T value); /// /// Converts the formatted text to a value. @@ -284,6 +287,17 @@ namespace Microsoft.Windows.Controls.Primitives /// protected abstract void OnDecrement(); + /// + /// Sets the valid spin directions. + /// + protected abstract void SetValidSpinDirection(); + + /// + /// Validates the value and keeps it between the Min and Max values. + /// + /// The value. + protected abstract void ValidateValue(T value); + #endregion //Abstract #endregion //Methods diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Implementation/DateTimeUpDown.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Implementation/DateTimeUpDown.cs index ed87ddb8..09699b42 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Implementation/DateTimeUpDown.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Implementation/DateTimeUpDown.cs @@ -128,9 +128,10 @@ namespace Microsoft.Windows.Controls TextBox.SelectionChanged += TextBox_SelectionChanged; } - protected override void CoerceValue(DateTime? value) + protected override DateTime? CoerceValue(DateTime? value) { - //TODO: implement Min and Max values and keep the Value between those parameters + //TODO: implement Minimum and Maximum + return value; } protected override void OnIncrement() @@ -207,6 +208,11 @@ namespace Microsoft.Windows.Controls return dt.ToString(GetFormatString(Format), CultureInfo); } + protected override void SetValidSpinDirection() + { + //TODO: implement Minimum and Maximum + } + protected override void OnValueChanged(DateTime? oldValue, DateTime? newValue) { //whenever the value changes we need to parse out the value into out DateTimeInfo segments so we can keep track of the individual pieces @@ -217,6 +223,11 @@ namespace Microsoft.Windows.Controls base.OnValueChanged(oldValue, newValue); } + protected override void ValidateValue(DateTime? value) + { + //TODO: implement min/max + } + #endregion //Base Class Overrides #region Event Hanlders diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DecimalUpDown.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DecimalUpDown.cs index 9b621439..2d87b5b7 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DecimalUpDown.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DecimalUpDown.cs @@ -20,12 +20,14 @@ namespace Microsoft.Windows.Controls #region Base Class Overrides - protected override void CoerceValue(decimal? value) + protected override decimal? CoerceValue(decimal? value) { if (value < Minimum) - Value = Minimum; + return Minimum; else if (value > Maximum) - Value = Maximum; + return Maximum; + else + return value; } protected override void OnIncrement() @@ -54,6 +56,7 @@ namespace Microsoft.Windows.Controls try { result = FormatString.Contains("P") ? ParsePercent(text, CultureInfo) : ParseDecimal(text, CultureInfo); + result = CoerceValue(result); } catch { @@ -72,6 +75,28 @@ namespace Microsoft.Windows.Controls return Value.Value.ToString(FormatString, CultureInfo); } + protected override void SetValidSpinDirection() + { + ValidSpinDirections validDirections = ValidSpinDirections.None; + + if (Value < Maximum || !Value.HasValue) + validDirections = validDirections | ValidSpinDirections.Increase; + + if (Value > Minimum || !Value.HasValue) + validDirections = validDirections | ValidSpinDirections.Decrease; + + if (Spinner != null) + Spinner.ValidSpinDirection = validDirections; + } + + protected override void ValidateValue(decimal? value) + { + if (value < Minimum) + Value = Minimum; + else if (value > Maximum) + Value = Maximum; + } + #endregion //Base Class Overrides } } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DoubleUpDown.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DoubleUpDown.cs index 8c2262cc..ab8e9e88 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DoubleUpDown.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DoubleUpDown.cs @@ -20,12 +20,14 @@ namespace Microsoft.Windows.Controls #region Base Class Overrides - protected override void CoerceValue(double? value) + protected override double? CoerceValue(double? value) { if (value < Minimum) - Value = Minimum; + return Minimum; else if (value > Maximum) - Value = Maximum; + return Maximum; + else + return value; } protected override void OnIncrement() @@ -54,6 +56,7 @@ namespace Microsoft.Windows.Controls try { result = FormatString.Contains("P") ? Decimal.ToDouble(ParsePercent(text, CultureInfo)) : ParseDouble(text, CultureInfo); + result = CoerceValue(result); } catch { @@ -72,6 +75,28 @@ namespace Microsoft.Windows.Controls return Value.Value.ToString(FormatString, CultureInfo); } + protected override void SetValidSpinDirection() + { + ValidSpinDirections validDirections = ValidSpinDirections.None; + + if (Value < Maximum || !Value.HasValue) + validDirections = validDirections | ValidSpinDirections.Increase; + + if (Value > Minimum || !Value.HasValue) + validDirections = validDirections | ValidSpinDirections.Decrease; + + if (Spinner != null) + Spinner.ValidSpinDirection = validDirections; + } + + protected override void ValidateValue(double? value) + { + if (value < Minimum) + Value = Minimum; + else if (value > Maximum) + Value = Maximum; + } + #endregion //Base Class Overrides } } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/IntegerUpDown.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/IntegerUpDown.cs index 770c1d78..12430d38 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/IntegerUpDown.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/IntegerUpDown.cs @@ -20,12 +20,14 @@ namespace Microsoft.Windows.Controls #region Base Class Overrides - protected override void CoerceValue(int? value) + protected override int? CoerceValue(int? value) { if (value < Minimum) - Value = Minimum; + return Minimum; else if (value > Maximum) - Value = Maximum; + return Maximum; + else + return value; } protected override void OnIncrement() @@ -55,6 +57,7 @@ namespace Microsoft.Windows.Controls { //don't know why someone would format an integer as %, but just in case they do. result = FormatString.Contains("P") ? Decimal.ToInt32(ParsePercent(text, CultureInfo)) : ParseInt(text, CultureInfo); + result = CoerceValue(result); } catch { @@ -73,6 +76,28 @@ namespace Microsoft.Windows.Controls return Value.Value.ToString(FormatString, CultureInfo); } + protected override void SetValidSpinDirection() + { + ValidSpinDirections validDirections = ValidSpinDirections.None; + + if (Value < Maximum || !Value.HasValue) + validDirections = validDirections | ValidSpinDirections.Increase; + + if (Value > Minimum || !Value.HasValue) + validDirections = validDirections | ValidSpinDirections.Decrease; + + if (Spinner != null) + Spinner.ValidSpinDirection = validDirections; + } + + protected override void ValidateValue(int? value) + { + if (value < Minimum) + Value = Minimum; + else if (value > Maximum) + Value = Maximum; + } + #endregion //Base Class Overrides } } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/NumericUpDown.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/NumericUpDown.cs index 96d0d0eb..5c9d2b6b 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/NumericUpDown.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/NumericUpDown.cs @@ -73,7 +73,7 @@ namespace Microsoft.Windows.Controls protected virtual void OnMaximumChanged(T oldValue, T newValue) { - //SetValidSpinDirection(); + SetValidSpinDirection(); } #endregion //Maximum @@ -96,7 +96,7 @@ namespace Microsoft.Windows.Controls protected virtual void OnMinimumChanged(T oldValue, T newValue) { - //SetValidSpinDirection(); + SetValidSpinDirection(); } #endregion //Minimum @@ -126,8 +126,6 @@ namespace Microsoft.Windows.Controls TextBox.GotKeyboardFocus += OnTextBoxGotKeyBoardFocus; TextBox.PreviewMouseLeftButtonDown += OnTextBoxPreviewMouseLeftButtonDown; } - - //SetValidSpinDirection(); } #endregion //Base Class Overrides @@ -152,24 +150,6 @@ namespace Microsoft.Windows.Controls #region Methods - /// - /// Sets the valid spin direction based on current value, minimum and maximum. - /// - //private void SetValidSpinDirection() - //{ - // ValidSpinDirections validDirections = ValidSpinDirections.None; - - // if (Value < Maximum) - // validDirections = validDirections | ValidSpinDirections.Increase; - - // if (Value > Minimum) - // validDirections = validDirections | ValidSpinDirections.Decrease; - - // if (Spinner != null) - // Spinner.ValidSpinDirection = validDirections; - //} - - protected static decimal ParseDecimal(string text, IFormatProvider cultureInfo) { return Decimal.Parse(text, NumberStyles.Any, cultureInfo);