From aba62e86fcc78e71bdcb263abda735e844e86240 Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Wed, 17 Apr 2019 18:47:20 +0300 Subject: Fixed a few issues with PPC events and memory leak. Changed color space PANTON to Coats. Modified JobProgressBarItem in PPC to display the proper duration. --- .../ExtensionMethods/FrameworkElementExtensions.cs | 82 +++++++++++++++++----- 1 file changed, 66 insertions(+), 16 deletions(-) (limited to 'Software/Visual_Studio/Tango.Core/ExtensionMethods') 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 _containers = new List(); private class ElementEventsContainer { + public String Token { get; set; } public EventHandler Handler { get; set; } + public FrameworkElement Element { get; set; } public Action Clear { get; set; } + + public ElementEventsContainer() + { + Token = Guid.NewGuid().ToString(); + } } /// @@ -33,7 +40,7 @@ public static class FrameworkElementExtensions /// The element. /// The relative to. /// The handler. - public static void RegisterForMouseOrTouchDown(this FrameworkElement element, FrameworkElement relativeTo, EventHandler handler) + public static String RegisterForMouseOrTouchDown(this FrameworkElement element, FrameworkElement relativeTo, EventHandler 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; } /// @@ -121,9 +132,9 @@ public static class FrameworkElementExtensions /// /// The element. /// The handler. - public static void RegisterForMouseOrTouchDown(this FrameworkElement element, EventHandler handler) + public static String RegisterForMouseOrTouchDown(this FrameworkElement element, EventHandler handler) { - RegisterForMouseOrTouchDown(element, null, handler); + return RegisterForMouseOrTouchDown(element, null, handler); } /// @@ -132,7 +143,7 @@ public static class FrameworkElementExtensions /// The element. /// The relative to. /// The handler. - public static void RegisterForMouseOrTouchUp(this FrameworkElement element, FrameworkElement relativeTo, EventHandler handler) + public static String RegisterForMouseOrTouchUp(this FrameworkElement element, FrameworkElement relativeTo, EventHandler 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; } /// @@ -217,9 +232,9 @@ public static class FrameworkElementExtensions /// /// The element. /// The handler. - public static void RegisterForMouseOrTouchUp(this FrameworkElement element, EventHandler handler) + public static String RegisterForMouseOrTouchUp(this FrameworkElement element, EventHandler handler) { - RegisterForMouseOrTouchUp(element, null, handler); + return RegisterForMouseOrTouchUp(element, null, handler); } /// @@ -228,7 +243,7 @@ public static class FrameworkElementExtensions /// The element. /// The relative to. /// The handler. - public static void RegisterForPreviewMouseOrTouchDown(this FrameworkElement element, FrameworkElement relativeTo, EventHandler handler) + public static String RegisterForPreviewMouseOrTouchDown(this FrameworkElement element, FrameworkElement relativeTo, EventHandler 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; } /// @@ -316,9 +335,9 @@ public static class FrameworkElementExtensions /// /// The element. /// The handler. - public static void RegisterForPreviewMouseOrTouchDown(this FrameworkElement element, EventHandler handler) + public static String RegisterForPreviewMouseOrTouchDown(this FrameworkElement element, EventHandler handler) { - RegisterForPreviewMouseOrTouchDown(element, null, handler); + return RegisterForPreviewMouseOrTouchDown(element, null, handler); } /// @@ -327,7 +346,7 @@ public static class FrameworkElementExtensions /// The element. /// The relative to. /// The handler. - public static void RegisterForPreviewMouseOrTouchUp(this FrameworkElement element, FrameworkElement relativeTo, EventHandler handler) + public static String RegisterForPreviewMouseOrTouchUp(this FrameworkElement element, FrameworkElement relativeTo, EventHandler 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; } /// @@ -412,9 +435,9 @@ public static class FrameworkElementExtensions /// /// The element. /// The handler. - public static void RegisterForPreviewMouseOrTouchUp(this FrameworkElement element, EventHandler handler) + public static String RegisterForPreviewMouseOrTouchUp(this FrameworkElement element, EventHandler handler) { - RegisterForPreviewMouseOrTouchUp(element, null, handler); + return RegisterForPreviewMouseOrTouchUp(element, null, handler); } /// @@ -422,9 +445,9 @@ public static class FrameworkElementExtensions /// /// The element. /// The handler. - public static void UnRegisterMouseOrTouch(this FrameworkElement element, EventHandler 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 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); } /// @@ -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 -- cgit v1.3.1