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