using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; namespace Tango.Touch.Controls { public class TouchClickableControl : Grid { private bool _isMouseDown; #region Properties public object CommandParameter { get { return (object)GetValue(CommandParameterProperty); } set { SetValue(CommandParameterProperty, value); } } public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register("CommandParameter", typeof(object), typeof(TouchClickableControl), new PropertyMetadata(null)); #endregion #region Routed Events public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(TouchClickableControl)); public event RoutedEventHandler Click { add { AddHandler(ClickEvent, value); } remove { RemoveHandler(ClickEvent, value); } } #endregion #region Commands public ICommand Command { get { return (ICommand)GetValue(CommandProperty); } set { SetValue(CommandProperty, value); } } public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(TouchClickableControl), new PropertyMetadata(null, (d, e) => (d as TouchClickableControl).OnCommandChanged())); #endregion #region Constructors public TouchClickableControl() { Background = Brushes.Transparent; } #endregion #region Private Methods private void OnCommandChanged() { if (Command != null) { Command.CanExecuteChanged -= Command_CanExecuteChanged; Command.CanExecuteChanged += Command_CanExecuteChanged; } } private void Command_CanExecuteChanged(object sender, EventArgs e) { IsEnabled = Command != null && Command.CanExecute(CommandParameter); } #endregion #region Override Methods protected override void OnMouseDown(MouseButtonEventArgs e) { base.OnMouseDown(e); _isMouseDown = true; } protected override void OnMouseUp(MouseButtonEventArgs e) { base.OnMouseUp(e); if (_isMouseDown) { OnClick(); } _isMouseDown = false; } protected override void OnMouseLeave(MouseEventArgs e) { base.OnMouseLeave(e); _isMouseDown = false; } #endregion #region Virtual Methods /// /// Raises the click event and executes the command. /// protected virtual void OnClick() { RoutedEventArgs args = new RoutedEventArgs(TouchClickableControl.ClickEvent, this); RaiseEvent(args); if (Command != null && Command.CanExecute(CommandParameter)) { Command.Execute(CommandParameter); } } #endregion } }