public void AddEventListener(string eventType, TargetEventHandler handler) { if (eventType == null) { return; } if (handler == null) { return; } var sendListen = false; List <TargetEventHandler> handlers; lock (eventListeners) { if (!eventListeners.TryGetValue(eventType, out handlers)) { handlers = new List <TargetEventHandler> (); eventListeners[eventType] = handlers; sendListen = true; } handlers.Add(handler); } if (sendListen) { Send(new Message { MessageType = MessageType.Listen, TargetId = Id, Key = eventType, }); } }
// Wrap event invocations inside a protected virtual method protected virtual void OnTargetEventHandler(TargetEventArgs e) { // Make a temporary copy of the event to avoid possibility of // a race condition if the last subscriber unsubscribes // immediately after the null check and before the event is raised. TargetEventHandler?.Invoke(this, e); }
protected virtual NativeGestureRecognizer GetNativeRecognizer(IGestureRecognizer recognizer) { if (recognizer == null) { return(null); } var weakRecognizer = new WeakReference(recognizer); var weakEventTracker = new WeakReference(this); var tapRecognizer = recognizer as TapGestureRecognizer; if (tapRecognizer != null && tapRecognizer.NumberOfTapsRequired == 1) { var returnAction = new TargetEventHandler((s, e) => { var tapGestureRecognizer = weakRecognizer.Target as TapGestureRecognizer; var eventTracker = weakEventTracker.Target as EventTracker; var view = eventTracker?._renderer?.Element as View; if (tapGestureRecognizer != null && view != null) { tapGestureRecognizer.SendTapped(view); } }); var uiRecognizer = new NativeGestureRecognizer { EventType = "click", Handler = returnAction, }; return(uiRecognizer); } if (tapRecognizer != null && tapRecognizer.NumberOfTapsRequired == 2) { var returnAction = new TargetEventHandler((s, e) => { var tapGestureRecognizer = weakRecognizer.Target as TapGestureRecognizer; var eventTracker = weakEventTracker.Target as EventTracker; var view = eventTracker?._renderer?.Element as View; if (tapGestureRecognizer != null && view != null) { tapGestureRecognizer.SendTapped(view); } }); var uiRecognizer = new NativeGestureRecognizer { EventType = "dblclick", Handler = returnAction, }; return(uiRecognizer); } return(null); }
public void RemoveEventListener(string eventType, TargetEventHandler handler) { if (eventType == null) { return; } if (handler == null) { return; } List <TargetEventHandler> handlers; lock (eventListeners) { if (eventListeners.TryGetValue(eventType, out handlers)) { handlers.Remove(handler); } } }