From 9d90261826b1f508a649bfa73260c9e29eb8b844 Mon Sep 17 00:00:00 2001 From: brianlagunas_cp Date: Wed, 6 Apr 2011 14:39:43 +0000 Subject: [PATCH] UpDown editors: due to a bug in Visual Studio, you cannot create event handlers for events that have generic or nullable event args in XAML. So I changed the event args to object to support the design experience, but this now forces you to cast the result of the new value to the appropriate data type. Various bug fixes --- .../Calculator/Implementation/Calculator.cs | 7 +-- .../Core/Primitives/UpDownBase.cs | 46 ++++++++++--------- .../Implementation/DateTimeUpDown.cs | 16 ++----- .../Implementation/DecimalUpDown.cs | 8 ++-- .../Implementation/DoubleUpDown.cs | 8 ++-- .../Implementation/IntegerUpDown.cs | 8 ++-- .../RichTextBoxFormatBarManager.cs | 7 ++- 7 files changed, 47 insertions(+), 53 deletions(-) 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; } }