Пример #1
0
        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);
            }
        }