private void RegisterEvent(string eventName) { if (string.IsNullOrEmpty(eventName)) { return; } if (eventName != "Loaded") { Type sourceObjectType = this.resolvedSource.GetType(); EventInfo info = sourceObjectType.GetRuntimeEvent(eventName); if (info == null) { throw new ArgumentException(string.Format( CultureInfo.CurrentCulture, ResourceHelper.CannotFindEventNameExceptionMessage, this.EventName, sourceObjectType.Name)); } MethodInfo methodInfo = typeof(EventTriggerBehavior).GetTypeInfo().GetDeclaredMethod("OnEvent"); this.eventHandler = methodInfo.CreateDelegate(info.EventHandlerType, this); this.isWindowsRuntimeEvent = EventTriggerBehavior.IsWindowsRuntimeType(info.EventHandlerType); if (this.isWindowsRuntimeEvent) { this.addEventHandlerMethod = add => (EventRegistrationToken)info.AddMethod.Invoke(this.resolvedSource, new object[] { add }); this.removeEventHandlerMethod = token => info.RemoveMethod.Invoke(this.resolvedSource, new object[] { token }); WindowsRuntimeMarshal.AddEventHandler(this.addEventHandlerMethod, this.removeEventHandlerMethod, this.eventHandler); } else { info.AddEventHandler(this.resolvedSource, this.eventHandler); } } else if (!this.isLoadedEventRegistered) { FrameworkElement element = this.resolvedSource as FrameworkElement; if (element != null && !EventTriggerBehavior.IsElementLoaded(element)) { this.isLoadedEventRegistered = true; element.Loaded += this.OnEvent; } } }
private static bool IsWindowsRuntimeEvent(EventInfo eventInfo) { return(eventInfo != null && EventTriggerBehavior.IsWindowsRuntimeType(eventInfo.EventHandlerType) && EventTriggerBehavior.IsWindowsRuntimeType(eventInfo.DeclaringType)); }