public static bool Dispose(SwapChainPanel swapChainPanel) { if (swapChainPanel == null) { return(false); } RenderData renderData = null; lock (s_aRenderData) { s_aRenderData.FirstOrDefault(rd => rd.swapChainPanel == swapChainPanel); if (renderData == null) { return(false); } s_aRenderData.Remove(renderData); } try { renderData?.Dispose(); } catch { } return(true); }
private static void SwapChainPanel_Unloaded(object sender, RoutedEventArgs e) { SwapChainPanel swapChainPanel = sender as SwapChainPanel; if (swapChainPanel == null) { return; } Debug.WriteLine($"{nameof(SwapChainPanelPainter)}.{nameof(SwapChainPanel_Unloaded)} swapChainPanel={swapChainPanel}"); swapChainPanel.Loaded -= SwapChainPanel_Loaded; swapChainPanel.Unloaded -= SwapChainPanel_Unloaded; swapChainPanel.SizeChanged -= SwapChainPanel_SizeChanged; swapChainPanel.CompositionScaleChanged -= SwapChainPanel_CompositionScaleChanged; RenderData.Dispose(swapChainPanel); }
static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { Debug.WriteLine($"{nameof(SwapChainPanelPainter)}.{nameof(PropertyChangedCallback)} d={d} e.OldValue={e.OldValue} e.NewValue={e.NewValue}"); SwapChainPanel swapChainPanel = d as SwapChainPanel; if (swapChainPanel == null) { return; } ICommandListFactory commandListFactory = e.NewValue as ICommandListFactory; if (commandListFactory == null) { // 'déconnexion de swapChainPanel' bool _ok = RenderData.Dispose(swapChainPanel); if (_ok) { // events swapChainPanel.Loaded -= SwapChainPanel_Loaded; swapChainPanel.Unloaded -= SwapChainPanel_Unloaded; swapChainPanel.SizeChanged -= SwapChainPanel_SizeChanged; swapChainPanel.CompositionScaleChanged -= SwapChainPanel_CompositionScaleChanged; } } else { RenderData _renderData = RenderData.Find(swapChainPanel, false); if (_renderData == null) { _renderData = RenderData.Find(swapChainPanel, true); if (_renderData == null) { return; } bool _ok = false; try { GraphicsDevice _graphicsDevice = _renderData.graphicsDevice; if (_graphicsDevice == null) { return; } // events swapChainPanel.Loaded += SwapChainPanel_Loaded; swapChainPanel.Unloaded += SwapChainPanel_Unloaded; swapChainPanel.SizeChanged += SwapChainPanel_SizeChanged; swapChainPanel.CompositionScaleChanged += SwapChainPanel_CompositionScaleChanged; _ok = true; } finally { if (_ok == false) { RenderData.Dispose(swapChainPanel); } } } } }