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