/// <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"); } }