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()); }