/// <summary> /// Creates the handlers link. /// </summary> /// <param name="routedEvent">The routed event.</param> /// <param name="handlers">The handlers.</param> /// <returns>System.Int32.</returns> internal int CreateHandlersLink(RoutedEvent routedEvent, RoutedEventHandlerInfoList handlers) { var item = new ClassHandlers(); item.RoutedEvent = routedEvent; item.Handlers = handlers; item.HasSelfHandlers = false; this.eventHandlersList.Add(item); return this.eventHandlersList.Count - 1; }
/// <summary> /// Adds to existing handlers. /// </summary> /// <param name="index">The index.</param> /// <param name="handler">The handler.</param> /// <param name="handledEventsToo">if set to <c>true</c> [handled events too].</param> /// <returns>RoutedEventHandlerInfoList.</returns> internal RoutedEventHandlerInfoList AddToExistingHandlers(int index, Delegate handler, bool handledEventsToo) { var info = new RoutedEventHandlerInfo(handler, handledEventsToo); var handlers = this.eventHandlersList.List[index].Handlers; if ((handlers == null) || !this.eventHandlersList.List[index].HasSelfHandlers) { handlers = new RoutedEventHandlerInfoList(); handlers.Handlers = new RoutedEventHandlerInfo[] { info }; handlers.Next = this.eventHandlersList.List[index].Handlers; this.eventHandlersList.List[index].Handlers = handlers; this.eventHandlersList.List[index].HasSelfHandlers = true; return handlers; } var length = handlers.Handlers.Length; var destinationArray = new RoutedEventHandlerInfo[length + 1]; Array.Copy(handlers.Handlers, 0, destinationArray, 0, length); destinationArray[length] = info; handlers.Handlers = destinationArray; return handlers; }
/// <summary> /// Updates the sub class handlers. /// </summary> /// <param name="routedEvent">The routed event.</param> /// <param name="baseClassListeners">The base class listeners.</param> internal void UpdateSubClassHandlers(RoutedEvent routedEvent, RoutedEventHandlerInfoList baseClassListeners) { var handlersIndex = this.GetHandlersIndex(routedEvent); if (handlersIndex != -1) { var hasSelfHandlers = this.eventHandlersList.List[handlersIndex].HasSelfHandlers; var handlers = hasSelfHandlers ? this.eventHandlersList.List[handlersIndex].Handlers.Next : this.eventHandlersList.List[handlersIndex].Handlers; var flag = false; if (handlers != null) { if ((baseClassListeners.Next != null) && baseClassListeners.Next.Contains(handlers)) { flag = true; } } else { flag = true; } if (flag) { if (hasSelfHandlers) { this.eventHandlersList.List[handlersIndex].Handlers.Next = baseClassListeners; } else { this.eventHandlersList.List[handlersIndex].Handlers = baseClassListeners; } } } }