You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
6.6 KiB
191 lines
6.6 KiB
using System;
|
|
using System.Windows;
|
|
using System.Windows.Input;
|
|
using System.Windows.Markup;
|
|
using System.Windows.Controls.Primitives;
|
|
|
|
namespace Microsoft.Windows.Controls
|
|
{
|
|
/// <summary>
|
|
/// Represents a spinner control that includes two Buttons.
|
|
/// </summary>
|
|
[ContentProperty("Content")]
|
|
public class ButtonSpinner : Spinner
|
|
{
|
|
#region Properties
|
|
|
|
#region Content
|
|
|
|
/// <summary>
|
|
/// Identifies the Content dependency property.
|
|
/// </summary>
|
|
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); }
|
|
}
|
|
|
|
/// <summary>
|
|
/// ContentProperty property changed handler.
|
|
/// </summary>
|
|
/// <param name="d">ButtonSpinner that changed its Content.</param>
|
|
/// <param name="e">Event arguments.</param>
|
|
private static void OnContentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
ButtonSpinner source = d as ButtonSpinner;
|
|
source.OnContentChanged(e.OldValue, e.NewValue);
|
|
}
|
|
|
|
#endregion //Content
|
|
|
|
private ButtonBase _increaseButton;
|
|
/// <summary>
|
|
/// Gets or sets the IncreaseButton template part.
|
|
/// </summary>
|
|
private ButtonBase IncreaseButton
|
|
{
|
|
get { return _increaseButton; }
|
|
set
|
|
{
|
|
if (_increaseButton != null)
|
|
{
|
|
_increaseButton.Click -= OnButtonClick;
|
|
}
|
|
|
|
_increaseButton = value;
|
|
|
|
if (_increaseButton != null)
|
|
{
|
|
_increaseButton.Click += OnButtonClick;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
private ButtonBase _decreaseButton;
|
|
/// <summary>
|
|
/// Gets or sets the DecreaseButton template part.
|
|
/// </summary>
|
|
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
|
|
|
|
/// <summary>
|
|
/// Occurs when the Content property value changed.
|
|
/// </summary>
|
|
/// <param name="oldValue">The old value of the Content property.</param>
|
|
/// <param name="newValue">The new value of the Content property.</param>
|
|
protected virtual void OnContentChanged(object oldValue, object newValue) { }
|
|
|
|
/// <summary>
|
|
/// Handle click event of IncreaseButton and DecreaseButton template parts,
|
|
/// translating Click to appropriate Spin event.
|
|
/// </summary>
|
|
/// <param name="sender">Event sender, should be either IncreaseButton or DecreaseButton template part.</param>
|
|
/// <param name="e">Event args.</param>
|
|
private void OnButtonClick(object sender, RoutedEventArgs e)
|
|
{
|
|
SpinDirection direction = sender == IncreaseButton ? SpinDirection.Increase : SpinDirection.Decrease;
|
|
OnSpin(new SpinEventArgs(direction));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Cancel LeftMouseButtonUp events originating from a button that has
|
|
/// been changed to disabled.
|
|
/// </summary>
|
|
/// <param name="e">The data for the event.</param>
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Called when valid spin direction changed.
|
|
/// </summary>
|
|
/// <param name="oldValue">The old value.</param>
|
|
/// <param name="newValue">The new value.</param>
|
|
protected override void OnValidSpinDirectionChanged(ValidSpinDirections oldValue, ValidSpinDirections newValue)
|
|
{
|
|
SetButtonUsage();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Disables or enables the buttons based on the valid spin direction.
|
|
/// </summary>
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|