aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Touch/Controls/TouchClickableControl.cs
blob: b149178462866d03afbd2116ed67c6ab1426515d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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

        /// <summary>
        /// Raises the click event and executes the command.
        /// </summary>
        protected virtual void OnClick()
        {
            RoutedEventArgs args = new RoutedEventArgs(TouchClickableControl.ClickEvent, this);
            RaiseEvent(args);
            if (Command != null && Command.CanExecute(CommandParameter))
            {
                Command.Execute(CommandParameter);
            }
        }

        #endregion
    }
}