From 5461de964e5514d20d15c76b61349f6fbdc782b1 Mon Sep 17 00:00:00 2001 From: brianlagunas_cp Date: Thu, 28 Jul 2011 18:41:48 +0000 Subject: [PATCH] SplitButton now derives from DropDownButton. --- .../Implementation/DropDownButton.cs | 31 +- .../SplitButton/Implementation/SplitButton.cs | 265 +----------------- 2 files changed, 19 insertions(+), 277 deletions(-) diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DropDownButton/Implementation/DropDownButton.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DropDownButton/Implementation/DropDownButton.cs index fb46ac59..344b8e41 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DropDownButton/Implementation/DropDownButton.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/DropDownButton/Implementation/DropDownButton.cs @@ -9,12 +9,6 @@ namespace Microsoft.Windows.Controls { public class DropDownButton : ContentControl, ICommandSource { - #region Members - - ToggleButton _dropDownButton; - - #endregion //Members - #region Constructors static DropDownButton() @@ -32,6 +26,22 @@ namespace Microsoft.Windows.Controls #region Properties + private System.Windows.Controls.Primitives.ButtonBase _button; + protected System.Windows.Controls.Primitives.ButtonBase Button + { + get { return _button; } + set + { + if (_button != null) + _button.Click -= DropDownButton_Click; + + _button = value; + + if (_button != null) + _button.Click += DropDownButton_Click; + } + } + #region DropDownContent public static readonly DependencyProperty DropDownContentProperty = DependencyProperty.Register("DropDownContent", typeof(object), typeof(DropDownButton), new UIPropertyMetadata(null, OnDropDownContentChanged)); @@ -88,14 +98,7 @@ namespace Microsoft.Windows.Controls public override void OnApplyTemplate() { base.OnApplyTemplate(); - - if (_dropDownButton != null) - _dropDownButton.Click -= DropDownButton_Click; - - _dropDownButton = GetTemplateChild("PART_DropDownButton") as ToggleButton; - - if (_dropDownButton != null) - _dropDownButton.Click += DropDownButton_Click; + Button = GetTemplateChild("PART_DropDownButton") as ToggleButton; } #endregion //Base Class Overrides diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/SplitButton/Implementation/SplitButton.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/SplitButton/Implementation/SplitButton.cs index 0a5c0495..42a00d17 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/SplitButton/Implementation/SplitButton.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/SplitButton/Implementation/SplitButton.cs @@ -1,20 +1,11 @@ using System; using System.Windows; using System.Windows.Controls; -using System.Windows.Input; -using System.Windows.Controls.Primitives; -using System.ComponentModel; namespace Microsoft.Windows.Controls { - public class SplitButton : ContentControl, ICommandSource + public class SplitButton : DropDownButton { - #region Members - - Button _actionButton; - - #endregion //Members - #region Constructors static SplitButton() @@ -22,268 +13,16 @@ namespace Microsoft.Windows.Controls DefaultStyleKeyProperty.OverrideMetadata(typeof(SplitButton), new FrameworkPropertyMetadata(typeof(SplitButton))); } - public SplitButton() - { - Keyboard.AddKeyDownHandler(this, OnKeyDown); - Mouse.AddPreviewMouseDownOutsideCapturedElementHandler(this, OnMouseDownOutsideCapturedElement); - } - #endregion //Constructors - #region Properties - - #region DropDownContent - - public static readonly DependencyProperty DropDownContentProperty = DependencyProperty.Register("DropDownContent", typeof(object), typeof(SplitButton), new UIPropertyMetadata(null, OnDropDownContentChanged)); - public object DropDownContent - { - get { return (object)GetValue(DropDownContentProperty); } - set { SetValue(DropDownContentProperty, value); } - } - - private static void OnDropDownContentChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) - { - SplitButton splitButton = o as SplitButton; - if (splitButton != null) - splitButton.OnDropDownContentChanged((object)e.OldValue, (object)e.NewValue); - } - - protected virtual void OnDropDownContentChanged(object oldValue, object newValue) - { - // TODO: Add your property changed side-effects. Descendants can override as well. - } - - #endregion //DropDownContent - - #region IsOpen - - public static readonly DependencyProperty IsOpenProperty = DependencyProperty.Register("IsOpen", typeof(bool), typeof(SplitButton), new UIPropertyMetadata(false, OnIsOpenChanged)); - public bool IsOpen - { - get { return (bool)GetValue(IsOpenProperty); } - set { SetValue(IsOpenProperty, value); } - } - - private static void OnIsOpenChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) - { - SplitButton splitButton = o as SplitButton; - if (splitButton != null) - splitButton.OnIsOpenChanged((bool)e.OldValue, (bool)e.NewValue); - } - - protected virtual void OnIsOpenChanged(bool oldValue, bool newValue) - { - if (newValue) - RaiseRoutedEvent(SplitButton.OpenedEvent); - else - RaiseRoutedEvent(SplitButton.ClosedEvent); - } - - #endregion //IsOpen - - #endregion //Properties - - #region Events - - public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SplitButton)); - public event RoutedEventHandler Click - { - add { AddHandler(ClickEvent, value); } - remove { RemoveHandler(ClickEvent, value); } - } - - public static readonly RoutedEvent OpenedEvent = EventManager.RegisterRoutedEvent("Opened", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SplitButton)); - public event RoutedEventHandler Opened - { - add { AddHandler(OpenedEvent, value); } - remove { RemoveHandler(OpenedEvent, value); } - } - - public static readonly RoutedEvent ClosedEvent = EventManager.RegisterRoutedEvent("Closed", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SplitButton)); - public event RoutedEventHandler Closed - { - add { AddHandler(ClosedEvent, value); } - remove { RemoveHandler(ClosedEvent, value); } - } - - #endregion //Events - #region Base Class Overrides public override void OnApplyTemplate() { base.OnApplyTemplate(); - - _actionButton = (Button)GetTemplateChild("PART_ActionButton"); - _actionButton.Click += ActionButton_Click; + Button = GetTemplateChild("PART_ActionButton") as Button; } #endregion //Base Class Overrides - - #region Event Handlers - - void ActionButton_Click(object sender, RoutedEventArgs e) - { - OnClick(); - } - - private void OnKeyDown(object sender, KeyEventArgs e) - { - switch (e.Key) - { - case Key.Escape: - { - CloseDropDown(); - break; - } - } - } - - private void OnMouseDownOutsideCapturedElement(object sender, MouseButtonEventArgs e) - { - CloseDropDown(); - } - - void CanExecuteChanged(object sender, EventArgs e) - { - if (Command != null) - { - RoutedCommand command = Command as RoutedCommand; - - // If a RoutedCommand. - if (command != null) - IsEnabled = command.CanExecute(CommandParameter, CommandTarget) ? true : false; - // If a not RoutedCommand. - else - IsEnabled = Command.CanExecute(CommandParameter) ? true : false; - } - } - - #endregion //Event Handlers - - #region Methods - - #region Protected - - protected virtual void OnClick() - { - RaiseRoutedEvent(SplitButton.ClickEvent); - RaiseCommand(); - } - #endregion //Protected - - #region Private - - /// - /// Raises routed events. - /// - private void RaiseRoutedEvent(RoutedEvent routedEvent) - { - RoutedEventArgs args = new RoutedEventArgs(routedEvent, this); - RaiseEvent(args); - } - - /// - /// Raises the command's Execute event. - /// - private void RaiseCommand() - { - if (Command != null) - { - RoutedCommand routedCommand = Command as RoutedCommand; - - if (routedCommand == null) - ((ICommand)Command).Execute(CommandParameter); - else - routedCommand.Execute(CommandParameter, CommandTarget); - } - } - - /// - /// Unhooks a command from the Command property. - /// - /// The old command. - /// The new command. - private void UnhookCommand(ICommand oldCommand, ICommand newCommand) - { - EventHandler handler = CanExecuteChanged; - oldCommand.CanExecuteChanged -= handler; - } - - /// - /// Hooks up a command to the CanExecuteChnaged event handler. - /// - /// The old command. - /// The new command. - private void HookUpCommand(ICommand oldCommand, ICommand newCommand) - { - EventHandler handler = new EventHandler(CanExecuteChanged); - canExecuteChangedHandler = handler; - if (newCommand != null) - newCommand.CanExecuteChanged += canExecuteChangedHandler; - } - - /// - /// Closes the drop down. - /// - private void CloseDropDown() - { - if (IsOpen) - IsOpen = false; - ReleaseMouseCapture(); - } - - #endregion //Private - - #endregion //Methods - - #region ICommandSource Members - - // Keeps a copy of the CanExecuteChnaged handler so it doesn't get garbage collected. - private EventHandler canExecuteChangedHandler; - - #region Command - - public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(SplitButton), new PropertyMetadata((ICommand)null, OnCommandChanged)); - [TypeConverter(typeof(CommandConverter))] - public ICommand Command - { - get { return (ICommand)GetValue(CommandProperty); } - set { SetValue(CommandProperty, value); } - } - - private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - SplitButton splitButton = d as SplitButton; - if (splitButton != null) - splitButton.OnCommandChanged((ICommand)e.OldValue, (ICommand)e.NewValue); - } - - protected virtual void OnCommandChanged(ICommand oldValue, ICommand newValue) - { - // If old command is not null, then we need to remove the handlers. - if (oldValue != null) - UnhookCommand(oldValue, newValue); - - HookUpCommand(oldValue, newValue); - } - - #endregion //Command - - public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register("CommandParameter", typeof(object), typeof(SplitButton), new PropertyMetadata(null)); - public object CommandParameter - { - get { return GetValue(CommandParameterProperty); } - set { SetValue(CommandParameterProperty, value); } - } - - public static readonly DependencyProperty CommandTargetProperty = DependencyProperty.Register("CommandTarget", typeof(IInputElement), typeof(SplitButton), new PropertyMetadata(null)); - public IInputElement CommandTarget - { - get { return (IInputElement)GetValue(CommandTargetProperty); } - set { SetValue(CommandTargetProperty, value); } - } - - #endregion } }