private static void OnEventNameChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
        {
            InputSpecificEventTriggerBehaviour behavior = (InputSpecificEventTriggerBehaviour)dependencyObject;

            if (behavior.AssociatedObject == null || behavior.resolvedSource == null)
            {
                return;
            }

            string oldEventName = (string)args.OldValue;
            string newEventName = (string)args.NewValue;

            behavior.UnregisterEvent(oldEventName);
            behavior.RegisterEvent(newEventName);
        }
        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)
                {
                    return;
                }

                MethodInfo methodInfo = typeof(InputSpecificEventTriggerBehaviour).GetTypeInfo().GetDeclaredMethod("OnEvent");
                this.eventHandler = methodInfo.CreateDelegate(info.EventHandlerType, this);

                this.isWindowsRuntimeEvent = InputSpecificEventTriggerBehaviour.IsWindowsRuntimeEvent(info);
                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 && !InputSpecificEventTriggerBehaviour.IsElementLoaded(element))
                {
                    this.isLoadedEventRegistered = true;
                    element.Loaded += this.OnEvent;
                }
            }
        }
 private static bool IsWindowsRuntimeEvent(EventInfo eventInfo)
 {
     return(eventInfo != null &&
            InputSpecificEventTriggerBehaviour.IsWindowsRuntimeType(eventInfo.EventHandlerType) &&
            InputSpecificEventTriggerBehaviour.IsWindowsRuntimeType(eventInfo.DeclaringType));
 }
        private static void OnSourceObjectChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
        {
            InputSpecificEventTriggerBehaviour behavior = (InputSpecificEventTriggerBehaviour)dependencyObject;

            behavior.SetResolvedSource(behavior.ComputeResolvedSource());
        }