aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Core/ExtensionMethods
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio/Tango.Core/ExtensionMethods')
-rw-r--r--Software/Visual_Studio/Tango.Core/ExtensionMethods/FrameworkElementExtensions.cs82
1 files changed, 66 insertions, 16 deletions
diff --git a/Software/Visual_Studio/Tango.Core/ExtensionMethods/FrameworkElementExtensions.cs b/Software/Visual_Studio/Tango.Core/ExtensionMethods/FrameworkElementExtensions.cs
index 909366ffd..ca546922f 100644
--- a/Software/Visual_Studio/Tango.Core/ExtensionMethods/FrameworkElementExtensions.cs
+++ b/Software/Visual_Studio/Tango.Core/ExtensionMethods/FrameworkElementExtensions.cs
@@ -23,8 +23,15 @@ public static class FrameworkElementExtensions
private static List<ElementEventsContainer> _containers = new List<ElementEventsContainer>();
private class ElementEventsContainer
{
+ public String Token { get; set; }
public EventHandler<MouseOrTouchEventArgs> Handler { get; set; }
+ public FrameworkElement Element { get; set; }
public Action Clear { get; set; }
+
+ public ElementEventsContainer()
+ {
+ Token = Guid.NewGuid().ToString();
+ }
}
/// <summary>
@@ -33,7 +40,7 @@ public static class FrameworkElementExtensions
/// <param name="element">The element.</param>
/// <param name="relativeTo">The relative to.</param>
/// <param name="handler">The handler.</param>
- public static void RegisterForMouseOrTouchDown(this FrameworkElement element, FrameworkElement relativeTo, EventHandler<MouseOrTouchEventArgs> handler)
+ public static String RegisterForMouseOrTouchDown(this FrameworkElement element, FrameworkElement relativeTo, EventHandler<MouseOrTouchEventArgs> handler)
{
bool mousePressed = false;
bool touchDown = false;
@@ -106,6 +113,7 @@ public static class FrameworkElementExtensions
ElementEventsContainer container = new ElementEventsContainer();
container.Handler = handler;
+ container.Element = element;
container.Clear = () =>
{
element.MouseUp -= mouseUpHandler;
@@ -114,6 +122,9 @@ public static class FrameworkElementExtensions
};
_containers.Add(container);
+ UnregisterWhenUnloaded(container);
+
+ return container.Token;
}
/// <summary>
@@ -121,9 +132,9 @@ public static class FrameworkElementExtensions
/// </summary>
/// <param name="element">The element.</param>
/// <param name="handler">The handler.</param>
- public static void RegisterForMouseOrTouchDown(this FrameworkElement element, EventHandler<MouseOrTouchEventArgs> handler)
+ public static String RegisterForMouseOrTouchDown(this FrameworkElement element, EventHandler<MouseOrTouchEventArgs> handler)
{
- RegisterForMouseOrTouchDown(element, null, handler);
+ return RegisterForMouseOrTouchDown(element, null, handler);
}
/// <summary>
@@ -132,7 +143,7 @@ public static class FrameworkElementExtensions
/// <param name="element">The element.</param>
/// <param name="relativeTo">The relative to.</param>
/// <param name="handler">The handler.</param>
- public static void RegisterForMouseOrTouchUp(this FrameworkElement element, FrameworkElement relativeTo, EventHandler<MouseOrTouchEventArgs> handler)
+ public static String RegisterForMouseOrTouchUp(this FrameworkElement element, FrameworkElement relativeTo, EventHandler<MouseOrTouchEventArgs> handler)
{
bool mouseReleased = false;
bool touchReleased = false;
@@ -202,6 +213,7 @@ public static class FrameworkElementExtensions
ElementEventsContainer container = new ElementEventsContainer();
container.Handler = handler;
+ container.Element = element;
container.Clear = () =>
{
element.TouchDown -= touchDownHandler;
@@ -210,6 +222,9 @@ public static class FrameworkElementExtensions
};
_containers.Add(container);
+ UnregisterWhenUnloaded(container);
+
+ return container.Token;
}
/// <summary>
@@ -217,9 +232,9 @@ public static class FrameworkElementExtensions
/// </summary>
/// <param name="element">The element.</param>
/// <param name="handler">The handler.</param>
- public static void RegisterForMouseOrTouchUp(this FrameworkElement element, EventHandler<MouseOrTouchEventArgs> handler)
+ public static String RegisterForMouseOrTouchUp(this FrameworkElement element, EventHandler<MouseOrTouchEventArgs> handler)
{
- RegisterForMouseOrTouchUp(element, null, handler);
+ return RegisterForMouseOrTouchUp(element, null, handler);
}
/// <summary>
@@ -228,7 +243,7 @@ public static class FrameworkElementExtensions
/// <param name="element">The element.</param>
/// <param name="relativeTo">The relative to.</param>
/// <param name="handler">The handler.</param>
- public static void RegisterForPreviewMouseOrTouchDown(this FrameworkElement element, FrameworkElement relativeTo, EventHandler<MouseOrTouchEventArgs> handler)
+ public static String RegisterForPreviewMouseOrTouchDown(this FrameworkElement element, FrameworkElement relativeTo, EventHandler<MouseOrTouchEventArgs> handler)
{
bool mousePressed = false;
bool touchDown = false;
@@ -301,6 +316,7 @@ public static class FrameworkElementExtensions
ElementEventsContainer container = new ElementEventsContainer();
container.Handler = handler;
+ container.Element = element;
container.Clear = () =>
{
element.PreviewTouchDown -= previewTouchDownHandler;
@@ -309,6 +325,9 @@ public static class FrameworkElementExtensions
};
_containers.Add(container);
+ UnregisterWhenUnloaded(container);
+
+ return container.Token;
}
/// <summary>
@@ -316,9 +335,9 @@ public static class FrameworkElementExtensions
/// </summary>
/// <param name="element">The element.</param>
/// <param name="handler">The handler.</param>
- public static void RegisterForPreviewMouseOrTouchDown(this FrameworkElement element, EventHandler<MouseOrTouchEventArgs> handler)
+ public static String RegisterForPreviewMouseOrTouchDown(this FrameworkElement element, EventHandler<MouseOrTouchEventArgs> handler)
{
- RegisterForPreviewMouseOrTouchDown(element, null, handler);
+ return RegisterForPreviewMouseOrTouchDown(element, null, handler);
}
/// <summary>
@@ -327,7 +346,7 @@ public static class FrameworkElementExtensions
/// <param name="element">The element.</param>
/// <param name="relativeTo">The relative to.</param>
/// <param name="handler">The handler.</param>
- public static void RegisterForPreviewMouseOrTouchUp(this FrameworkElement element, FrameworkElement relativeTo, EventHandler<MouseOrTouchEventArgs> handler)
+ public static String RegisterForPreviewMouseOrTouchUp(this FrameworkElement element, FrameworkElement relativeTo, EventHandler<MouseOrTouchEventArgs> handler)
{
bool mouseReleased = false;
bool touchReleased = false;
@@ -397,6 +416,7 @@ public static class FrameworkElementExtensions
ElementEventsContainer container = new ElementEventsContainer();
container.Handler = handler;
+ container.Element = element;
container.Clear = () =>
{
element.PreviewTouchDown -= previewTouchDownHandler;
@@ -405,6 +425,9 @@ public static class FrameworkElementExtensions
};
_containers.Add(container);
+ UnregisterWhenUnloaded(container);
+
+ return container.Token;
}
/// <summary>
@@ -412,9 +435,9 @@ public static class FrameworkElementExtensions
/// </summary>
/// <param name="element">The element.</param>
/// <param name="handler">The handler.</param>
- public static void RegisterForPreviewMouseOrTouchUp(this FrameworkElement element, EventHandler<MouseOrTouchEventArgs> handler)
+ public static String RegisterForPreviewMouseOrTouchUp(this FrameworkElement element, EventHandler<MouseOrTouchEventArgs> handler)
{
- RegisterForPreviewMouseOrTouchUp(element, null, handler);
+ return RegisterForPreviewMouseOrTouchUp(element, null, handler);
}
/// <summary>
@@ -422,9 +445,9 @@ public static class FrameworkElementExtensions
/// </summary>
/// <param name="element">The element.</param>
/// <param name="handler">The handler.</param>
- public static void UnRegisterMouseOrTouch(this FrameworkElement element, EventHandler<MouseOrTouchEventArgs> handler)
+ public static void UnRegisterMouseOrTouch(this FrameworkElement element)
{
- var containers = _containers.Where(x => x.Handler == handler);
+ var containers = _containers.Where(x => x.Element == element).ToList();
foreach (var container in containers.ToList())
{
@@ -443,7 +466,7 @@ public static class FrameworkElementExtensions
{
bool _isTouch = false;
- element.MouseMove += (x, e) =>
+ MouseEventHandler mouseHandler = (x, e) =>
{
if (!_isTouch)
{
@@ -461,7 +484,9 @@ public static class FrameworkElementExtensions
}
};
- element.TouchMove += (x, e) =>
+ element.MouseMove += mouseHandler;
+
+ EventHandler<TouchEventArgs> touchHandler = (x, e) =>
{
_isTouch = true;
@@ -478,6 +503,20 @@ public static class FrameworkElementExtensions
handler(element, args);
e.Handled = args.Handled;
};
+
+ element.TouchMove += touchHandler;
+
+ ElementEventsContainer container = new ElementEventsContainer();
+ container.Handler = handler;
+ container.Element = element;
+ container.Clear = () =>
+ {
+ element.MouseMove -= mouseHandler;
+ element.TouchMove -= touchHandler;
+ };
+
+ _containers.Add(container);
+ UnregisterWhenUnloaded(container);
}
/// <summary>
@@ -490,6 +529,17 @@ public static class FrameworkElementExtensions
RegisterForMouseOrTouchMove(element, null, handler);
}
+ private static void UnregisterWhenUnloaded(ElementEventsContainer container)
+ {
+ container.Element.Unloaded += Element_Unloaded;
+ }
+
+ private static void Element_Unloaded(object sender, RoutedEventArgs e)
+ {
+ (sender as FrameworkElement).Unloaded -= Element_Unloaded;
+ UnRegisterMouseOrTouch(sender as FrameworkElement);
+ }
+
#endregion
#region Loaded