diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs index 90f23f83..f00f3ffe 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs @@ -169,7 +169,7 @@ namespace Microsoft.Windows.Controls else DisplayText = "0"; - RoutedPropertyChangedEventArgs args = new RoutedPropertyChangedEventArgs(oldValue, newValue); + RoutedPropertyChangedEventArgs args = new RoutedPropertyChangedEventArgs(oldValue, newValue); args.RoutedEvent = ValueChangedEvent; RaiseEvent(args); } @@ -433,8 +433,9 @@ namespace Microsoft.Windows.Controls #region Events - public static readonly RoutedEvent ValueChangedEvent = EventManager.RegisterRoutedEvent("ValueChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler), typeof(Calculator)); - public event RoutedPropertyChangedEventHandler ValueChanged + //Due to a bug in Visual Studio, you cannot create event handlers for nullable args in XAML, so I have to use object instead. + public static readonly RoutedEvent ValueChangedEvent = EventManager.RegisterRoutedEvent("ValueChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler), typeof(Calculator)); + public event RoutedPropertyChangedEventHandler ValueChanged { add { AddHandler(ValueChangedEvent, value); } remove { RemoveHandler(ValueChangedEvent, value); } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs index b533ae07..4872113e 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs @@ -57,27 +57,13 @@ namespace Microsoft.Windows.Controls.Primitives #region Value - public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(T), typeof(UpDownBase), new FrameworkPropertyMetadata(default(T), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValueChanged, OnCoerceValue)); + public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(T), typeof(UpDownBase), new FrameworkPropertyMetadata(default(T), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValueChanged)); public T Value { get { return (T)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } - private static object OnCoerceValue(DependencyObject o, object value) - { - UpDownBase upDownBase = o as UpDownBase; - if (upDownBase != null) - return upDownBase.OnCoerceValue((T)value); - else - return value; - } - - protected virtual T OnCoerceValue(T value) - { - return value; - } - private static void OnValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) { UpDownBase upDownBase = o as UpDownBase; @@ -87,9 +73,11 @@ namespace Microsoft.Windows.Controls.Primitives protected virtual void OnValueChanged(T oldValue, T newValue) { + CoerceValue(newValue); + SyncTextAndValueProperties(ValueProperty, string.Empty); - RoutedPropertyChangedEventArgs args = new RoutedPropertyChangedEventArgs(oldValue, newValue); + RoutedPropertyChangedEventArgs args = new RoutedPropertyChangedEventArgs(oldValue, newValue); args.RoutedEvent = ValueChangedEvent; RaiseEvent(args); } @@ -197,8 +185,9 @@ namespace Microsoft.Windows.Controls.Primitives #region Events - public static readonly RoutedEvent ValueChangedEvent = EventManager.RegisterRoutedEvent("ValueChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler), typeof(UpDownBase)); - public event RoutedPropertyChangedEventHandler ValueChanged + //Due to a bug in Visual Studio, you cannot create event handlers for generic T args in XAML, so I have to use object instead. + public static readonly RoutedEvent ValueChangedEvent = EventManager.RegisterRoutedEvent("ValueChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler), typeof(UpDownBase)); + public event RoutedPropertyChangedEventHandler ValueChanged { add { AddHandler(ValueChangedEvent, value); } remove { RemoveHandler(ValueChangedEvent, value); } @@ -268,6 +257,23 @@ namespace Microsoft.Windows.Controls.Primitives #region Abstract + + /// + /// Coerces the value. + /// + protected abstract void CoerceValue(T value); + + /// + /// Converts the formatted text to a value. + /// + protected abstract T ConvertTextToValue(string text); + + /// + /// Converts the value to formatted text. + /// + /// + protected abstract string ConvertValueToText(); + /// /// Called by OnSpin when the spin direction is SpinDirection.Increase. /// @@ -278,10 +284,6 @@ namespace Microsoft.Windows.Controls.Primitives /// protected abstract void OnDecrement(); - protected abstract T ConvertTextToValue(string text); - - protected abstract string ConvertValueToText(); - #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 ea584493..ed87ddb8 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Implementation/DateTimeUpDown.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Implementation/DateTimeUpDown.cs @@ -128,6 +128,11 @@ namespace Microsoft.Windows.Controls TextBox.SelectionChanged += TextBox_SelectionChanged; } + protected override void CoerceValue(DateTime? value) + { + //TODO: implement Min and Max values and keep the Value between those parameters + } + protected override void OnIncrement() { if (Value.HasValue) @@ -186,17 +191,6 @@ namespace Microsoft.Windows.Controls 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)) diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DecimalUpDown.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DecimalUpDown.cs index 13c4aa9b..9b621439 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DecimalUpDown.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DecimalUpDown.cs @@ -20,14 +20,12 @@ namespace Microsoft.Windows.Controls #region Base Class Overrides - protected override decimal? OnCoerceValue(decimal? value) + protected override void CoerceValue(decimal? value) { if (value < Minimum) - return Minimum; + Value = Minimum; else if (value > Maximum) - return Maximum; - else - return value; + Value = Maximum; } protected override void OnIncrement() diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DoubleUpDown.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DoubleUpDown.cs index acf85de9..8c2262cc 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DoubleUpDown.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DoubleUpDown.cs @@ -20,14 +20,12 @@ namespace Microsoft.Windows.Controls #region Base Class Overrides - protected override double? OnCoerceValue(double? value) + protected override void CoerceValue(double? value) { if (value < Minimum) - return Minimum; + Value = Minimum; else if (value > Maximum) - return Maximum; - else - return value; + Value = Maximum; } protected override void OnIncrement() diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/IntegerUpDown.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/IntegerUpDown.cs index 1362a52d..770c1d78 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/IntegerUpDown.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/IntegerUpDown.cs @@ -20,14 +20,12 @@ namespace Microsoft.Windows.Controls #region Base Class Overrides - protected override int? OnCoerceValue(int? value) + protected override void CoerceValue(int? value) { if (value < Minimum) - return Minimum; + Value = Minimum; else if (value > Maximum) - return Maximum; - else - return value; + Value = Maximum; } protected override void OnIncrement() diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs index b1cff436..f5a8f0ea 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs @@ -127,7 +127,10 @@ namespace Microsoft.Windows.Controls VerifyAdornerLayer(); Control adorningEditor = _toolbar as Control; - _adorner.Child = adorningEditor; + + if (_adorner.Child == null) + _adorner.Child = adorningEditor; + _adorner.Visibility = Visibility.Visible; PositionFormatBar(adorningEditor); @@ -184,7 +187,7 @@ namespace Microsoft.Windows.Controls if (IsAdornerVisible) { _adorner.Visibility = Visibility.Collapsed; - _adorner.Child = null; + //_adorner.Child = null; } }