/// <summary>
        /// Attaches the the painter to the given target panel.
        /// </summary>
        /// <param name="targetPanel">The target panel.</param>
        /// <exception cref="System.InvalidOperationException">Unable to attach to new SwapChainBackgroundPanel: Renderer is already attached to another one!</exception>
        public void Attach(DrawingSurface targetPanel)
        {
            if (m_targetPanel != null)
            {
                throw new InvalidOperationException("Unable to attach to new SwapChainBackgroundPanel: Renderer is already attached to another one!");
            }

            // Set default values
            m_lastRefreshTargetSize = new Size2(0, 0);
            m_targetPanel           = targetPanel;

            // Attach to SizeChanged event (refresh view resources only after a specific time)
            m_observerSizeChanged = Observable.FromEventPattern <SizeChangedEventArgs>(m_targetPanel, "SizeChanged")
                                    .Throttle(TimeSpan.FromSeconds(0.5))
                                    .ObserveOn(SynchronizationContext.Current)
                                    .Subscribe((eArgs) => OnTargetPanelThrottledSizeChanged(eArgs.Sender, eArgs.EventArgs));

            m_targetPanel.SizeChanged += OnTargetPanelSizeChanged;
            m_targetPanel.Loaded      += OnTargetPanelLoaded;
            m_targetPanel.Unloaded    += OnTargetPanelUnloaded;

            // Hook-up native component to DrawingSurface
            m_drawingInterop = new WP8DrawingSurfaceInterop(this);
            m_targetPanel.SetContentProvider(m_drawingInterop);
            //m_targetPanel.SetManipulationHandler(m_drawingInterop);

            // Define unloading behavior
            if (VisualTreeHelper.GetParent(m_targetPanel) != null)
            {
                m_renderLoop.RegisterRenderLoop();
            }

            //// Register simple mouse movement
            //InitializeMouseMovement();
        }
        public void Detach()
        {
            try
            {
                if (m_targetPanel == null)
                {
                    return;
                }

                //// Deregister simple mouse movement
                //UnloadMouseMovement();

                // Clear view resources
                m_renderLoop.UnloadViewResources();
                m_renderLoop.DeregisterRenderLoop();

                // Reset interop settings
                m_targetPanel.SetContentProvider(null);
                m_targetPanel.SetManipulationHandler(null);
                m_drawingInterop = null;

                // Clear event registrations
                m_targetPanel.SizeChanged -= OnTargetPanelSizeChanged;
                m_targetPanel.Loaded      -= OnTargetPanelLoaded;
                m_targetPanel.Unloaded    -= OnTargetPanelUnloaded;

                //Clear created references
                m_observerSizeChanged.Dispose();
                m_observerSizeChanged = null;
                m_targetPanel         = null;
            }
            catch (Exception ex)
            {
                CommonTools.RaiseUnhandledException(
                    this.GetType(), this, ex,
                    "Detaching the FrozenSyBackgroundPanelPainter");
            }
        }