private static void RaiseCompleted(IntPtr cPtr, IntPtr sender, IntPtr e) { try { if (Noesis.Extend.Initialized) { if (sender == IntPtr.Zero && e == IntPtr.Zero) { _Completed.Remove(cPtr); return; } CompletedHandler handler = null; if (!_Completed.TryGetValue(cPtr, out handler)) { throw new InvalidOperationException("Delegate not registered for Completed event"); } if (handler == null) { return; } var args = Marshal.PtrToStructure <TimelineEventArgs>(e); foreach (var @delegate in handler.GetInvocationList()) { var storyboardTarget = (FrameworkElement)args.Target; if (storyboardTarget.Tag is FrameworkElement) { // special hack found! @delegate.DynamicInvoke(Noesis.Extend.GetProxy(sender, false), new System.EventArgs()); return; } var delegateTarget = @delegate.Target; while (storyboardTarget != null) { if (ReferenceEquals(storyboardTarget, delegateTarget)) { @delegate.DynamicInvoke(Noesis.Extend.GetProxy(sender, false), new System.EventArgs()); break; } storyboardTarget = VisualTreeHelper.GetParent(storyboardTarget) as FrameworkElement; } } } } catch (Exception exception) { Noesis.Error.UnhandledException(exception); } }