diff --git a/winrt/lib/xaml/BaseControl.h b/winrt/lib/xaml/BaseControl.h index 1839f9022..0b8cb4b07 100644 --- a/winrt/lib/xaml/BaseControl.h +++ b/winrt/lib/xaml/BaseControl.h @@ -134,7 +134,7 @@ namespace ABI { namespace Microsoft { namespace Graphics { namespace Canvas { na RenderTarget m_currentRenderTarget; - ComPtr m_lastSeenParent; + WeakRef m_lastSeenParent; ComPtr m_customDevice; @@ -233,7 +233,11 @@ namespace ABI { namespace Microsoft { namespace Graphics { namespace Canvas { na return ExceptionBoundary( [&] { - RemoveFromVisualTreeImpl(m_lastSeenParent.Get(), As(GetControl()).Get()); + auto control = As(GetControl()); //Do this first because the unit tests expect a failure when this cast fails. + if (!m_lastSeenParent) { + return; + } + RemoveFromVisualTreeImpl(LockWeakRef(m_lastSeenParent).Get(), control.Get()); }); } @@ -913,7 +917,13 @@ namespace ABI { namespace Microsoft { namespace Graphics { namespace Canvas { na void UpdateLastSeenParent() { - As(GetControl()->GetComposableBase())->get_Parent(&m_lastSeenParent); + ComPtr parent; + As(GetControl()->GetComposableBase())->get_Parent(&parent); + if (!parent) { + m_lastSeenParent.Reset(); + return; + } + m_lastSeenParent = AsWeak(parent.Get()); } HRESULT OnUnloaded(IInspectable*, IRoutedEventArgs*) diff --git a/winrt/lib/xaml/CanvasSwapChainPanel.cpp b/winrt/lib/xaml/CanvasSwapChainPanel.cpp index 51e42fb55..2a4a05804 100644 --- a/winrt/lib/xaml/CanvasSwapChainPanel.cpp +++ b/winrt/lib/xaml/CanvasSwapChainPanel.cpp @@ -88,7 +88,13 @@ HRESULT CanvasSwapChainPanel::OnLoaded(IInspectable*, IRoutedEventArgs*) return ExceptionBoundary( [&] { - As(GetComposableBase())->get_Parent(&m_lastSeenParent); + ComPtr parent; + As(GetComposableBase())->get_Parent(&parent); + if (!parent) { + m_lastSeenParent.Reset(); + return; + } + m_lastSeenParent = AsWeak(parent.Get()); }); } @@ -130,7 +136,11 @@ IFACEMETHODIMP CanvasSwapChainPanel::RemoveFromVisualTree() return ExceptionBoundary( [&] { - RemoveFromVisualTreeImpl(m_lastSeenParent.Get(), As(this).Get()); + auto control = As(this); //Do this first because the unit tests expect a failure when this cast fails. + if (!m_lastSeenParent) { + return; + } + RemoveFromVisualTreeImpl(LockWeakRef(m_lastSeenParent).Get(), control.Get()); }); } diff --git a/winrt/lib/xaml/CanvasSwapChainPanel.h b/winrt/lib/xaml/CanvasSwapChainPanel.h index 9e958a919..a43101be4 100644 --- a/winrt/lib/xaml/CanvasSwapChainPanel.h +++ b/winrt/lib/xaml/CanvasSwapChainPanel.h @@ -39,7 +39,7 @@ namespace ABI { namespace Microsoft { namespace Graphics { namespace Canvas { na std::shared_ptr m_adapter; ComPtr m_canvasSwapChain; - ComPtr m_lastSeenParent; + WeakRef m_lastSeenParent; public: CanvasSwapChainPanel(std::shared_ptr adapter);