aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Touch/Components/TransformationHelper.cs
blob: 1fd0a7f7a5376fca9691f289b80ca65e79f06551 (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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
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.Media;
using System.Windows.Media.Animation;
using Tango.Core.EventArguments;
using Tango.SharedUI.Helpers;

namespace Tango.Touch.Components
{
    public static class TransformationHelper
    {
        #region TransformWhenPressed

        /// <summary>
        /// Determines whether an element is TransformWhenPressed by the drag and drop service.
        /// </summary>
        public static readonly DependencyProperty TransformWhenPressedProperty =
            DependencyProperty.RegisterAttached("TransformWhenPressed",
            typeof(bool), typeof(TransformationHelper),
            new FrameworkPropertyMetadata(false, TransformWhenPressedChanged));

        /// <summary>
        /// TransformWhenPressed changed.
        /// </summary>
        /// <param name="d">The d.</param>
        /// <param name="e">The <see cref="DependencyPropertyChangedEventArgs"/> instance containing the event data.</param>
        private static void TransformWhenPressedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if ((bool)e.NewValue)
            {
                RegisterTransformWhenPressed(d as FrameworkElement);
            }
            else
            {
                UnRegisterTransformWhenPressed(d as FrameworkElement);
            }
        }

        private static void UnRegisterTransformWhenPressed(FrameworkElement element)
        {
            
        }

        private static void RegisterTransformWhenPressed(FrameworkElement element)
        {
            element.RenderTransformOrigin = new Point(0.5, 0.5);
            element.RenderTransform = new ScaleTransform(1, 1);
            element.RegisterForPreviewMouseOrTouchDown(Element_PreviewMouseDown);
            element.PreviewMouseUp += Element_PreviewMouseUp;
            var scrollViewer = element.FindAncestor<ScrollViewer>();

            if (scrollViewer != null)
            {
                scrollViewer.ScrollChanged += (x, y) => 
                {
                    ScaleTransform scale = element.RenderTransform as ScaleTransform;
                    scale.BeginAnimation(ScaleTransform.ScaleXProperty, null);
                    scale.BeginAnimation(ScaleTransform.ScaleYProperty, null);
                };
            }
        }

        private static void Element_PreviewMouseDown(object sender, MouseOrTouchEventArgs e)
        {
            if (!GetPreventTransform(e.OriginalSource as FrameworkElement))
            {
                DoubleAnimation ani = new DoubleAnimation();
                ani.To = 1.09;
                ani.Duration = TimeSpan.FromSeconds(0.2);
                ani.AutoReverse = true;
                ScaleTransform scale = (sender as FrameworkElement).RenderTransform as ScaleTransform;
                scale.BeginAnimation(ScaleTransform.ScaleXProperty, ani);
                scale.BeginAnimation(ScaleTransform.ScaleYProperty, ani);
            }
        }

        private static void Element_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            DoubleAnimation ani = new DoubleAnimation();
            ani.To = 1;
            ani.Duration = TimeSpan.FromSeconds(0.1);
            ScaleTransform scale = (sender as FrameworkElement).RenderTransform as ScaleTransform;
            scale.BeginAnimation(ScaleTransform.ScaleXProperty, ani);
            scale.BeginAnimation(ScaleTransform.ScaleYProperty, ani);
        }

        /// <summary>
        /// Sets the TransformWhenPressed attached property.
        /// </summary>
        /// <param name="element">The element.</param>
        /// <param name="value">if set to <c>true</c> [value].</param>
        public static void SetTransformWhenPressed(FrameworkElement element, bool value)
        {
            element.SetValue(TransformWhenPressedProperty, value);
        }

        /// <summary>
        /// Gets the TransformWhenPressed attached property.
        /// </summary>
        /// <param name="element">The element.</param>
        /// <returns></returns>
        public static bool GetTransformWhenPressed(FrameworkElement element)
        {
            return (bool)element.GetValue(TransformWhenPressedProperty);
        }

        #endregion

        #region PreventTransform

        /// <summary>
        /// Determines whether an element is PreventTransform by the drag and drop service.
        /// </summary>
        public static readonly DependencyProperty PreventTransformProperty =
            DependencyProperty.RegisterAttached("PreventTransform",
            typeof(bool), typeof(TransformationHelper),
            new FrameworkPropertyMetadata(false));

        /// <summary>
        /// Sets the PreventTransform attached property.
        /// </summary>
        /// <param name="element">The element.</param>
        /// <param name="value">if set to <c>true</c> [value].</param>
        public static void SetPreventTransform(FrameworkElement element, bool value)
        {
            element.SetValue(PreventTransformProperty, value);
        }

        /// <summary>
        /// Gets the PreventTransform attached property.
        /// </summary>
        /// <param name="element">The element.</param>
        /// <returns></returns>
        public static bool GetPreventTransform(FrameworkElement element)
        {
            if (element != null)
            {
                return (bool)element.GetValue(PreventTransformProperty);
            }
            else
            {
                return false;
            }
        }

        #endregion
    }
}