public void Attach(TopLevel topLevel)
        {
            var resources         = new List <IDisposable>();
            var initialClientSize = topLevel.PlatformImpl.ClientSize;


            var queueManager = ((IRenderRoot)topLevel).RenderQueueManager;

            if (queueManager == null)
            {
                return;
            }


            var viewport = PlatformManager.CreateRenderTarget(topLevel.PlatformImpl);

            resources.Add(viewport);
            //resources.Add(queueManager.RenderNeeded.Subscribe(_
            //    =>
            //    Dispatcher.UIThread.InvokeAsync(() => topLevel.PlatformImpl.Invalidate(new Rect(topLevel.ClientSize)))));
            Action pendingInvalidation = null;

            resources.Add(queueManager.RenderNeeded.Subscribe(_ =>
            {
                if (pendingInvalidation == null)
                {
                    pendingInvalidation = () =>
                    {
                        topLevel.PlatformImpl.Invalidate(new Rect(topLevel.ClientSize));
                        pendingInvalidation = null;
                    };
                    Dispatcher.UIThread.InvokeAsync(pendingInvalidation);
                }
            }
                                                              ));

            topLevel.PlatformImpl.Paint = rect =>
            {
                viewport.Render(topLevel);
                queueManager.RenderFinished();
            };

            topLevel.Closed += delegate
            {
                foreach (var disposable in resources)
                {
                    disposable.Dispose();
                }
                resources.Clear();
            };
        }