using System; using System.Windows; using System.Windows.Input; using System.Windows.Markup; using System.Windows.Controls.Primitives; namespace Microsoft.Windows.Controls { /// /// Represents a spinner control that includes two Buttons. /// [ContentProperty("Content")] public class ButtonSpinner : Spinner { #region Properties #region Content /// /// Identifies the Content dependency property. /// public static readonly DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof(object), typeof(ButtonSpinner), new PropertyMetadata(null, OnContentPropertyChanged)); public object Content { get { return GetValue(ContentProperty) as object; } set { SetValue(ContentProperty, value); } } /// /// ContentProperty property changed handler. /// /// ButtonSpinner that changed its Content. /// Event arguments. private static void OnContentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ButtonSpinner source = d as ButtonSpinner; source.OnContentChanged(e.OldValue, e.NewValue); } #endregion //Content private ButtonBase _increaseButton; /// /// Gets or sets the IncreaseButton template part. /// private ButtonBase IncreaseButton { get { return _increaseButton; } set { if (_increaseButton != null) { _increaseButton.Click -= OnButtonClick; } _increaseButton = value; if (_increaseButton != null) { _increaseButton.Click += OnButtonClick; } } } private ButtonBase _decreaseButton; /// /// Gets or sets the DecreaseButton template part. /// private ButtonBase DecreaseButton { get { return _decreaseButton; } set { if (_decreaseButton != null) { _decreaseButton.Click -= OnButtonClick; } _decreaseButton = value; if (_decreaseButton != null) { _decreaseButton.Click += OnButtonClick; } } } #endregion //Properties #region Constructors static ButtonSpinner() { DefaultStyleKeyProperty.OverrideMetadata(typeof(ButtonSpinner), new FrameworkPropertyMetadata(typeof(ButtonSpinner))); } #endregion //Constructors #region Base Class Overrides public override void OnApplyTemplate() { base.OnApplyTemplate(); IncreaseButton = GetTemplateChild("IncreaseButton") as ButtonBase; DecreaseButton = GetTemplateChild("DecreaseButton") as ButtonBase; SetButtonUsage(); } #endregion //Base Class Overrides /// /// Occurs when the Content property value changed. /// /// The old value of the Content property. /// The new value of the Content property. protected virtual void OnContentChanged(object oldValue, object newValue) { } /// /// Handle click event of IncreaseButton and DecreaseButton template parts, /// translating Click to appropriate Spin event. /// /// Event sender, should be either IncreaseButton or DecreaseButton template part. /// Event args. private void OnButtonClick(object sender, RoutedEventArgs e) { SpinDirection direction = sender == IncreaseButton ? SpinDirection.Increase : SpinDirection.Decrease; OnSpin(new SpinEventArgs(direction)); } /// /// Cancel LeftMouseButtonUp events originating from a button that has /// been changed to disabled. /// /// The data for the event. protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) { base.OnMouseLeftButtonUp(e); Point mousePosition; if (IncreaseButton != null && IncreaseButton.IsEnabled == false) { mousePosition = e.GetPosition(IncreaseButton); if (mousePosition.X > 0 && mousePosition.X < IncreaseButton.ActualWidth && mousePosition.Y > 0 && mousePosition.Y < IncreaseButton.ActualHeight) { e.Handled = true; } } if (DecreaseButton != null && DecreaseButton.IsEnabled == false) { mousePosition = e.GetPosition(DecreaseButton); if (mousePosition.X > 0 && mousePosition.X < DecreaseButton.ActualWidth && mousePosition.Y > 0 && mousePosition.Y < DecreaseButton.ActualHeight) { e.Handled = true; } } } /// /// Called when valid spin direction changed. /// /// The old value. /// The new value. protected override void OnValidSpinDirectionChanged(ValidSpinDirections oldValue, ValidSpinDirections newValue) { SetButtonUsage(); } /// /// Disables or enables the buttons based on the valid spin direction. /// private void SetButtonUsage() { // buttonspinner adds buttons that spin, so disable accordingly. if (IncreaseButton != null) { IncreaseButton.IsEnabled = ((ValidSpinDirection & ValidSpinDirections.Increase) == ValidSpinDirections.Increase); } if (DecreaseButton != null) { DecreaseButton.IsEnabled = ((ValidSpinDirection & ValidSpinDirections.Decrease) == ValidSpinDirections.Decrease); } } } }