diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs index b3ee278f..93638fa2 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs @@ -142,16 +142,16 @@ namespace Microsoft.Windows.Controls { get { return (int)GetValue(PrecisionProperty); } set { SetValue(PrecisionProperty, value); } - } + } #endregion //Precision #region Value - public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(decimal), typeof(Calculator), new FrameworkPropertyMetadata(default(decimal), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValueChanged)); - public decimal Value + public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(decimal?), typeof(Calculator), new FrameworkPropertyMetadata(default(decimal), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValueChanged)); + public decimal? Value { - get { return (decimal)GetValue(ValueProperty); } + get { return (decimal?)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } @@ -159,12 +159,15 @@ namespace Microsoft.Windows.Controls { Calculator calculator = o as Calculator; if (calculator != null) - calculator.OnValueChanged((decimal)e.OldValue, (decimal)e.NewValue); + calculator.OnValueChanged((decimal?)e.OldValue, (decimal?)e.NewValue); } - protected virtual void OnValueChanged(decimal oldValue, decimal newValue) + protected virtual void OnValueChanged(decimal? oldValue, decimal? newValue) { - DisplayText = newValue.ToString(); + if (newValue.HasValue) + DisplayText = newValue.ToString(); + else + DisplayText = "0"; } #endregion //Value diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/CalculatorUpDown/Implementation/CalculatorUpDown.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/CalculatorUpDown/Implementation/CalculatorUpDown.cs index 60a69eb5..2e6dd5fe 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/CalculatorUpDown/Implementation/CalculatorUpDown.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/CalculatorUpDown/Implementation/CalculatorUpDown.cs @@ -5,7 +5,7 @@ using System.Windows.Controls.Primitives; namespace Microsoft.Windows.Controls { - public class CalculatorUpDown : NumericUpDown + public class CalculatorUpDown : DecimalUpDown { #region Members diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs index 30f86d0b..e253f637 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs @@ -7,200 +7,6 @@ using System.Windows.Data; namespace Microsoft.Windows.Controls.Primitives { - public abstract class UpDownBase : InputBase - { - #region Members - - /// - /// Name constant for Text template part. - /// - internal const string ElementTextName = "TextBox"; - - /// - /// Name constant for Spinner template part. - /// - internal const string ElementSpinnerName = "Spinner"; - - #endregion //Members - - #region Properties - - #region AllowSpin - - public static readonly DependencyProperty AllowSpinProperty = DependencyProperty.Register("AllowSpin", typeof(bool), typeof(UpDownBase), new UIPropertyMetadata(true)); - public bool AllowSpin - { - get { return (bool)GetValue(AllowSpinProperty); } - set { SetValue(AllowSpinProperty, value); } - } - - #endregion //AllowSpin - - #region ShowButtonSpinner - - public static readonly DependencyProperty ShowButtonSpinnerProperty = DependencyProperty.Register("ShowButtonSpinner", typeof(bool), typeof(UpDownBase), new UIPropertyMetadata(true)); - public bool ShowButtonSpinner - { - get { return (bool)GetValue(ShowButtonSpinnerProperty); } - set { SetValue(ShowButtonSpinnerProperty, value); } - } - - #endregion //ShowButtonSpinner - - protected TextBox TextBox { get; private set; } - - private Spinner _spinner; - internal Spinner Spinner - { - get { return _spinner; } - private set - { - _spinner = value; - _spinner.Spin += OnSpinnerSpin; - } - } - - #endregion //Properties - - #region Constructors - - internal UpDownBase() { } - - #endregion //Constructors - - #region Base Class Overrides - - public override void OnApplyTemplate() - { - base.OnApplyTemplate(); - - TextBox = GetTemplateChild(ElementTextName) as TextBox; - Spinner = GetTemplateChild(ElementSpinnerName) as Spinner; - } - - protected override void OnPreviewKeyDown(KeyEventArgs e) - { - switch (e.Key) - { - case Key.Up: - { - if (AllowSpin) - DoIncrement(); - e.Handled = true; - break; - } - case Key.Down: - { - if (AllowSpin) - DoDecrement(); - e.Handled = true; - break; - } - //case Key.Enter: - // { - // if (IsEditable) - // SyncTextAndValueProperties(UpDownBase.TextProperty, TextBox.Text); - // break; - // } - } - } - - protected override void OnMouseWheel(MouseWheelEventArgs e) - { - base.OnMouseWheel(e); - - if (!e.Handled && AllowSpin) - { - if (e.Delta < 0) - { - DoDecrement(); - } - else if (0 < e.Delta) - { - DoIncrement(); - } - - e.Handled = true; - } - } - - #endregion //Base Class Overrides - - #region Event Handlers - - private void OnSpinnerSpin(object sender, SpinEventArgs e) - { - if (AllowSpin) - OnSpin(e); - } - - #endregion //Event Handlers - - #region Methods - - protected virtual void OnSpin(SpinEventArgs e) - { - if (e == null) - throw new ArgumentNullException("e"); - - if (e.Direction == SpinDirection.Increase) - DoIncrement(); - else - DoDecrement(); - } - - /// - /// Performs an increment if conditions allow it. - /// - private void DoDecrement() - { - if (Spinner == null || (Spinner.ValidSpinDirection & ValidSpinDirections.Decrease) == ValidSpinDirections.Decrease) - { - OnDecrement(); - } - } - - /// - /// Performs a decrement if conditions allow it. - /// - private void DoIncrement() - { - if (Spinner == null || (Spinner.ValidSpinDirection & ValidSpinDirections.Increase) == ValidSpinDirections.Increase) - { - OnIncrement(); - } - } - - #region Abstract - - /// - /// Called by OnSpin when the spin direction is SpinDirection.Increase. - /// - protected abstract void OnIncrement(); - - /// - /// Called by OnSpin when the spin direction is SpinDirection.Descrease. - /// - protected abstract void OnDecrement(); - - #endregion //Abstract - - #endregion //Methods - } - - - - - - - - - /// - /// This is going to be the new UpDownBase class. In order to reliably support the different numeric data types, I need to create a specific control for each data type. - /// So instead of copying and pasting I am going to try to create a generic base class that has most of the logic in it. This will make the NumericUpDown control obsolete - /// and it will be removed from the toolkit. The new controls will be DecimalUpDown, DoubleUpDown, and IntegerUpDown. - /// - /// public abstract class UpDownBase : InputBase { #region Members @@ -281,10 +87,10 @@ namespace Microsoft.Windows.Controls.Primitives protected virtual void OnValueChanged(T oldValue, T newValue) { - SyncTextAndValueProperties(NumericUpDown.ValueProperty, string.Empty); + SyncTextAndValueProperties(ValueProperty, string.Empty); RoutedPropertyChangedEventArgs args = new RoutedPropertyChangedEventArgs(oldValue, newValue); - args.RoutedEvent = NumericUpDown.ValueChangedEvent; + args.RoutedEvent = ValueChangedEvent; RaiseEvent(args); } @@ -435,7 +241,7 @@ namespace Microsoft.Windows.Controls.Primitives } } - private void SyncTextAndValueProperties(DependencyProperty p, string text) + protected void SyncTextAndValueProperties(DependencyProperty p, string text) { //prevents recursive syncing properties if (_isSyncingTextAndValueProperties) diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Implementation/DateTimeUpDown.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Implementation/DateTimeUpDown.cs index cc3876c6..d8af24cf 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Implementation/DateTimeUpDown.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Implementation/DateTimeUpDown.cs @@ -8,14 +8,13 @@ using System.Windows.Data; namespace Microsoft.Windows.Controls { - public class DateTimeUpDown : UpDownBase + public class DateTimeUpDown : UpDownBase { #region Members private List _dateTimeInfoList = new List(); private DateTimeInfo _selectedDateTimeInfo; private bool _fireSelectionChangedEvent = true; - private bool _isSyncingTextAndValueProperties; private DateTimeParser _dateTimeParser; @@ -89,58 +88,6 @@ namespace Microsoft.Windows.Controls #endregion //FormatString - #region Value - - public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(DateTime?), typeof(DateTimeUpDown), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValueChanged, OnCoerceValue)); - public DateTime? Value - { - get { return (DateTime?)GetValue(ValueProperty); } - set { SetValue(ValueProperty, value); } - } - - private static object OnCoerceValue(DependencyObject o, object value) - { - DateTimeUpDown dateTimeUpDown = o as DateTimeUpDown; - if (dateTimeUpDown != null) - return dateTimeUpDown.OnCoerceValue((DateTime?)value); - else - return value; - } - - protected virtual DateTime? OnCoerceValue(DateTime? value) - { - //if the user entered a string value to represent a date or time, we need to parse that string into a valid DatTime value - if (value != null && !(value is DateTime)) - { - return DateTime.Parse(value.ToString(), DateTimeFormatInfo); - } - - return value; - } - - private static void OnValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) - { - DateTimeUpDown dateTimeUpDown = o as DateTimeUpDown; - if (dateTimeUpDown != null) - dateTimeUpDown.OnValueChanged((DateTime?)e.OldValue, (DateTime?)e.NewValue); - } - - protected virtual 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 - //but only if it is not null - if (newValue != null) - ParseValueIntoDateTimeInfo(); - - SyncTextAndValueProperties(DateTimeUpDown.ValueProperty, newValue); - - RoutedPropertyChangedEventArgs args = new RoutedPropertyChangedEventArgs(oldValue, newValue); - args.RoutedEvent = DateTimeUpDown.ValueChangedEvent; - RaiseEvent(args); - } - - #endregion //Value - #endregion //Properties #region Constructors @@ -152,7 +99,7 @@ namespace Microsoft.Windows.Controls public DateTimeUpDown() { - DateTimeFormatInfo = DateTimeFormatInfo.GetInstance(CultureInfo.CurrentCulture); + DateTimeFormatInfo = DateTimeFormatInfo.GetInstance(CultureInfo); InitializeDateTimeInfoList(); } @@ -194,6 +141,7 @@ namespace Microsoft.Windows.Controls BindingExpression binding = BindingOperations.GetBindingExpression(TextBox, System.Windows.Controls.TextBox.TextProperty); binding.UpdateSource(); _fireSelectionChangedEvent = true; + e.Handled = true; } return; } @@ -210,7 +158,6 @@ namespace Microsoft.Windows.Controls protected override void OnTextChanged(string previousValue, string currentValue) { //TODO: clean this up and make sure it doesn't fire recursively - if (String.IsNullOrEmpty(currentValue)) { Value = null; @@ -224,7 +171,44 @@ namespace Microsoft.Windows.Controls DateTime result; var success = _dateTimeParser.TryParse(currentValue, out result, current); - SyncTextAndValueProperties(InputBase.TextProperty, result); + SyncTextAndValueProperties(InputBase.TextProperty, result.ToString()); + } + + protected override DateTime? OnCoerceValue(DateTime? value) + { + //if the user entered a string value to represent a date or time, we need to parse that string into a valid DatTime value + if (value != null && !(value is DateTime)) + { + return DateTime.Parse(value.ToString(), DateTimeFormatInfo); + } + + return value; + } + + protected override DateTime? ConvertTextToValue(string text) + { + if (string.IsNullOrEmpty(text)) + return null; + + return DateTime.Parse(text, CultureInfo.CurrentCulture); + } + + protected override string ConvertValueToText() + { + if (Value == null) return string.Empty; + + DateTime dt = DateTime.Parse(Value.ToString(), CultureInfo); + return dt.ToString(GetFormatString(Format), CultureInfo); + } + + 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 + //but only if it is not null + if (newValue != null) + ParseValueIntoDateTimeInfo(); + + base.OnValueChanged(oldValue, newValue); } #endregion //Base Class Overrides @@ -233,7 +217,7 @@ namespace Microsoft.Windows.Controls void TextBox_SelectionChanged(object sender, RoutedEventArgs e) { - if (_fireSelectionChangedEvent) + if (_fireSelectionChangedEvent) PerformMouseSelection(); else _fireSelectionChangedEvent = true; @@ -241,17 +225,6 @@ namespace Microsoft.Windows.Controls #endregion //Event Hanlders - #region Events - - public static readonly RoutedEvent ValueChangedEvent = EventManager.RegisterRoutedEvent("ValueChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler), typeof(DateTimeUpDown)); - public event RoutedPropertyChangedEventHandler ValueChanged - { - add { AddHandler(ValueChangedEvent, value); } - remove { RemoveHandler(ValueChangedEvent, value); } - } - - #endregion //Events - #region Methods private void InitializeDateTimeInfoListAndParseValue() @@ -564,42 +537,6 @@ namespace Microsoft.Windows.Controls _fireSelectionChangedEvent = true; } - private DateTime? ConvertTextToValue(string text) - { - if (string.IsNullOrEmpty(text)) - return null; - - return DateTime.Parse(text, CultureInfo.CurrentCulture); - } - - private string ConvertValueToText(object value) - { - if (value == null) return string.Empty; - - DateTime dt = DateTime.Parse(value.ToString(), CultureInfo.CurrentCulture); - return dt.ToString(GetFormatString(Format), CultureInfo.CurrentCulture); - } - - private void SyncTextAndValueProperties(DependencyProperty p, object newValue) - { - //prevents recursive syncing properties - if (_isSyncingTextAndValueProperties) - return; - - _isSyncingTextAndValueProperties = true; - - //this only occures when the user typed in the value - if (InputBase.TextProperty == p) - { - string text = newValue == null ? String.Empty : newValue.ToString(); - SetValue(DateTimeUpDown.ValueProperty, ConvertTextToValue(text)); - } - - SetValue(InputBase.TextProperty, ConvertValueToText(newValue)); - - _isSyncingTextAndValueProperties = false; - } - #endregion //Methods } } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/NumericUpDown.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/NumericUpDown.cs index 6ef73ee1..ef8274ec 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/NumericUpDown.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/NumericUpDown.cs @@ -1,369 +1,10 @@ using System; using System.Windows; -using System.Globalization; using System.Windows.Input; using Microsoft.Windows.Controls.Primitives; namespace Microsoft.Windows.Controls { - [Obsolete("This control has been replaced with numeric data type specific controls; DecimalUpDown, DoubleUpDown, IntegerUpDown")] - public class NumericUpDown : UpDownBase - { - #region Members - - /// - /// Flags if the Text and Value properties are in the process of being sync'd - /// - private bool _isSyncingTextAndValueProperties; - - #endregion //Members - - #region Properties - - #region DefaultValue - - public static readonly DependencyProperty DefaultValueProperty = DependencyProperty.Register("DefaultValue", typeof(decimal), typeof(NumericUpDown), new UIPropertyMetadata(default(decimal))); - public decimal DefaultValue - { - get { return (decimal)GetValue(DefaultValueProperty); } - set { SetValue(DefaultValueProperty, value); } - } - - #endregion //DefaultValue - - #region Minimum - - public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register("Minimum", typeof(decimal), typeof(NumericUpDown), new PropertyMetadata(Decimal.MinValue, OnMinimumPropertyChanged)); - public decimal Minimum - { - get { return (decimal)GetValue(MinimumProperty); } - set { SetValue(MinimumProperty, value); } - } - - private static void OnMinimumPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - NumericUpDown nud = d as NumericUpDown; - nud.SetValidSpinDirection(); - } - - #endregion Minimum - - #region Maximum - - public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(decimal), typeof(NumericUpDown), new PropertyMetadata(Decimal.MaxValue, OnMaximumPropertyChanged)); - public decimal Maximum - { - get { return (decimal)GetValue(MaximumProperty); } - set { SetValue(MaximumProperty, value); } - } - - private static void OnMaximumPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - NumericUpDown nud = d as NumericUpDown; - nud.SetValidSpinDirection(); - } - - #endregion Maximum - - #region Increment - - public static readonly DependencyProperty IncrementProperty = DependencyProperty.Register("Increment", typeof(decimal), typeof(NumericUpDown), new PropertyMetadata(1M)); - public decimal Increment - { - get { return (decimal)GetValue(IncrementProperty); } - set { SetValue(IncrementProperty, value); } - } - - #endregion - - #region FormatString - - public static readonly DependencyProperty StringFormatProperty = DependencyProperty.Register("FormatString", typeof(string), typeof(NumericUpDown), new PropertyMetadata(string.Empty, OnStringFormatPropertyPropertyChanged)); - public string FormatString - { - get { return (string)GetValue(StringFormatProperty); } - set { SetValue(StringFormatProperty, value); } - } - - private static void OnStringFormatPropertyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - NumericUpDown nud = d as NumericUpDown; - nud.OnStringFormatChanged(e.OldValue.ToString(), e.NewValue.ToString()); - } - - protected virtual void OnStringFormatChanged(string oldValue, string newValue) - { - //Don't think this is needed anymore - //SyncTextAndValueProperties(NumericUpDown.TextProperty, Value); - } - - #endregion //FormatString - - #region SelectAllOnGotFocus - - public static readonly DependencyProperty SelectAllOnGotFocusProperty = DependencyProperty.Register("SelectAllOnGotFocus", typeof(bool), typeof(NumericUpDown), new PropertyMetadata(false)); - public bool SelectAllOnGotFocus - { - get { return (bool)GetValue(SelectAllOnGotFocusProperty); } - set { SetValue(SelectAllOnGotFocusProperty, value); } - } - - #endregion //SelectAllOnGotFocus - - #region Value - - public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(decimal?), typeof(NumericUpDown), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValueChanged, OnCoerceValue)); - public decimal? Value - { - get { return (decimal?)GetValue(ValueProperty); } - set { SetValue(ValueProperty, value); } - } - - private static object OnCoerceValue(DependencyObject o, object value) - { - NumericUpDown numericUpDown = o as NumericUpDown; - if (numericUpDown != null) - return numericUpDown.OnCoerceValue((decimal?)value); - else - return value; - } - - protected virtual decimal? OnCoerceValue(decimal? value) - { - if (value == null) return value; - - decimal val = value.Value; - - if (val < Minimum) - { - return Minimum; - } - else if (val > Maximum) - { - return Maximum; - } - else - { - return value; - } - } - - private static void OnValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) - { - NumericUpDown numericUpDown = o as NumericUpDown; - if (numericUpDown != null) - numericUpDown.OnValueChanged((decimal?)e.OldValue, (decimal?)e.NewValue); - } - - protected virtual void OnValueChanged(decimal? oldValue, decimal? newValue) - { - SetValidSpinDirection(); - - SyncTextAndValueProperties(NumericUpDown.ValueProperty, newValue); - - RoutedPropertyChangedEventArgs args = new RoutedPropertyChangedEventArgs(oldValue, newValue); - args.RoutedEvent = NumericUpDown.ValueChangedEvent; - RaiseEvent(args); - } - - #endregion //Value - - #endregion - - #region Constructors - - static NumericUpDown() - { - DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericUpDown), new FrameworkPropertyMetadata(typeof(NumericUpDown))); - } - - #endregion //Constructors - - #region Base Class Overrides - - protected override void OnAccessKey(AccessKeyEventArgs e) - { - if (TextBox != null) - TextBox.Focus(); - - base.OnAccessKey(e); - } - - public override void OnApplyTemplate() - { - base.OnApplyTemplate(); - SetValidSpinDirection(); - - if (SelectAllOnGotFocus) - { - //in order to select all the text we must handle both the keybord (tabbing) and mouse (clicking) events - TextBox.GotKeyboardFocus += OnTextBoxGotKeyBoardFocus; - TextBox.PreviewMouseLeftButtonDown += OnTextBoxPreviewMouseLeftButtonDown; - } - } - - protected override void OnGotFocus(RoutedEventArgs e) - { - if (TextBox != null) - TextBox.Focus(); - } - - protected override void OnIncrement() - { - if (Value.HasValue) - Value += Increment; - else - Value = DefaultValue; - } - - protected override void OnDecrement() - { - if (Value.HasValue) - Value -= Increment; - else - Value = DefaultValue; - } - - protected override void OnPreviewKeyDown(KeyEventArgs e) - { - base.OnPreviewKeyDown(e); - - if (e.Key == Key.Enter) - { - if (IsEditable) - SyncTextAndValueProperties(InputBase.TextProperty, TextBox.Text); - } - } - - protected override void OnTextChanged(string previousValue, string currentValue) - { - SyncTextAndValueProperties(InputBase.TextProperty, currentValue); - } - - #endregion //Base Class Overrides - - #region Event Handlers - - private void OnTextBoxGotKeyBoardFocus(object sender, RoutedEventArgs e) - { - TextBox.SelectAll(); - } - - void OnTextBoxPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) - { - if (!TextBox.IsKeyboardFocused) - { - e.Handled = true; - TextBox.Focus(); - } - } - - #endregion //Event Handlers - - #region Events - - public static readonly RoutedEvent ValueChangedEvent = EventManager.RegisterRoutedEvent("ValueChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler), typeof(NumericUpDown)); - public event RoutedPropertyChangedEventHandler ValueChanged - { - add { AddHandler(ValueChangedEvent, value); } - remove { RemoveHandler(ValueChangedEvent, value); } - } - - #endregion //Events - - #region Methods - - private decimal? ConvertTextToValue(string text) - { - decimal? result = null; - - if (String.IsNullOrEmpty(text)) - return result; - - NumberFormatInfo info = NumberFormatInfo.GetInstance(CultureInfo.CurrentCulture); - - try - { - result = FormatString.Contains("P") ? ParsePercent(text, info) : ParseDecimal(text, info); - } - catch - { - Text = ConvertValueToText(Value); - return Value; - } - - return result; - } - - private string ConvertValueToText(object value) - { - if (!Value.HasValue) - return String.Empty; - - return Value.Value.ToString(FormatString, CultureInfo.CurrentCulture); - } - - private void SyncTextAndValueProperties(DependencyProperty p, object newValue) - { - //prevents recursive syncing properties - if (_isSyncingTextAndValueProperties) - return; - - _isSyncingTextAndValueProperties = true; - - //this only occures when the user typed in the value - if (InputBase.TextProperty == p) - { - string text = newValue == null ? String.Empty : newValue.ToString(); - SetValue(NumericUpDown.ValueProperty, ConvertTextToValue(text)); - } - - SetValue(InputBase.TextProperty, ConvertValueToText(newValue)); - - _isSyncingTextAndValueProperties = false; - } - - private static decimal ParseDecimal(string text, NumberFormatInfo info) - { - return decimal.Parse(text, NumberStyles.Any, info); - } - - private static decimal ParsePercent(string text, NumberFormatInfo info) - { - text = text.Replace(info.PercentSymbol, null); - - decimal result = decimal.Parse(text, NumberStyles.Any, info); - result = result / 100; - - return result; - } - - /// - /// Sets the valid spin direction based on current value, minimum and maximum. - /// - private void SetValidSpinDirection() - { - ValidSpinDirections validDirections = ValidSpinDirections.None; - - if (Convert.ToDecimal(Value) < Maximum) - { - validDirections = validDirections | ValidSpinDirections.Increase; - } - - if (Convert.ToDecimal(Value) > Minimum) - { - validDirections = validDirections | ValidSpinDirections.Decrease; - } - - if (Spinner != null) - { - Spinner.ValidSpinDirection = validDirections; - } - } - - #endregion //Methods - } - public abstract class NumericUpDown : UpDownBase { #region Properties diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Themes/Generic.xaml b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Themes/Generic.xaml index df83f938..3c7dafd0 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Themes/Generic.xaml +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Themes/Generic.xaml @@ -124,42 +124,4 @@ - - - - - - \ No newline at end of file