Browse Source

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
pull/1645/head
brianlagunas_cp 15 years ago
parent
commit
9d90261826
  1. 7
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs
  2. 46
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Primitives/UpDownBase.cs
  3. 16
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DateTimeUpDown/Implementation/DateTimeUpDown.cs
  4. 8
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DecimalUpDown.cs
  5. 8
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/DoubleUpDown.cs
  6. 8
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/NumericUpDown/Implementation/IntegerUpDown.cs
  7. 7
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/RichTextBoxFormatBar/RichTextBoxFormatBarManager.cs

7
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs

@ -169,7 +169,7 @@ namespace Microsoft.Windows.Controls
else
DisplayText = "0";
RoutedPropertyChangedEventArgs<decimal?> args = new RoutedPropertyChangedEventArgs<decimal?>(oldValue, newValue);
RoutedPropertyChangedEventArgs<object> args = new RoutedPropertyChangedEventArgs<object>(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<decimal?>), typeof(Calculator));
public event RoutedPropertyChangedEventHandler<decimal?> 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<object>), typeof(Calculator));
public event RoutedPropertyChangedEventHandler<object> ValueChanged
{
add { AddHandler(ValueChangedEvent, value); }
remove { RemoveHandler(ValueChangedEvent, value); }

46
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<T>), new FrameworkPropertyMetadata(default(T), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValueChanged, OnCoerceValue));
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(T), typeof(UpDownBase<T>), 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<T> upDownBase = o as UpDownBase<T>;
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<T> upDownBase = o as UpDownBase<T>;
@ -87,9 +73,11 @@ namespace Microsoft.Windows.Controls.Primitives
protected virtual void OnValueChanged(T oldValue, T newValue)
{
CoerceValue(newValue);
SyncTextAndValueProperties(ValueProperty, string.Empty);
RoutedPropertyChangedEventArgs<T> args = new RoutedPropertyChangedEventArgs<T>(oldValue, newValue);
RoutedPropertyChangedEventArgs<object> args = new RoutedPropertyChangedEventArgs<object>(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<T>), typeof(UpDownBase<T>));
public event RoutedPropertyChangedEventHandler<T> 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<object>), typeof(UpDownBase<T>));
public event RoutedPropertyChangedEventHandler<object> ValueChanged
{
add { AddHandler(ValueChangedEvent, value); }
remove { RemoveHandler(ValueChangedEvent, value); }
@ -268,6 +257,23 @@ namespace Microsoft.Windows.Controls.Primitives
#region Abstract
/// <summary>
/// Coerces the value.
/// </summary>
protected abstract void CoerceValue(T value);
/// <summary>
/// Converts the formatted text to a value.
/// </summary>
protected abstract T ConvertTextToValue(string text);
/// <summary>
/// Converts the value to formatted text.
/// </summary>
/// <returns></returns>
protected abstract string ConvertValueToText();
/// <summary>
/// Called by OnSpin when the spin direction is SpinDirection.Increase.
/// </summary>
@ -278,10 +284,6 @@ namespace Microsoft.Windows.Controls.Primitives
/// </summary>
protected abstract void OnDecrement();
protected abstract T ConvertTextToValue(string text);
protected abstract string ConvertValueToText();
#endregion //Abstract
#endregion //Methods

16
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))

8
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()

8
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()

8
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()

7
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;
}
}

Loading…
Cancel
Save