@@ -42,9 +42,19 @@ ContentIslandComponentView::ContentIslandComponentView(
4242 });
4343}
4444
45- void ContentIslandComponentView::OnMounted () noexcept {
45+ winrt::Microsoft::UI::Content::ContentIsland ContentIslandComponentView::ParentContentIsland () noexcept {
46+ auto root = rootComponentView ();
47+ if (!root)
48+ return nullptr ;
49+ return root->parentContentIsland ();
50+ }
51+
52+ void ContentIslandComponentView::ConnectInternal () noexcept {
53+ if (!m_islandToConnect)
54+ return ;
55+
4656 m_childSiteLink = winrt::Microsoft::UI::Content::ChildSiteLink::Create (
47- rootComponentView ()-> parentContentIsland () ,
57+ m_parentContentIsland ,
4858 winrt::Microsoft::ReactNative::Composition::Experimental::CompositionContextHelper::InnerVisual (Visual ())
4959 .as <winrt::Microsoft::UI::Composition::ContainerVisual>());
5060 m_childSiteLink.ActualSize ({m_layoutMetrics.frame .size .width , m_layoutMetrics.frame .size .height });
@@ -68,6 +78,7 @@ void ContentIslandComponentView::OnMounted() noexcept {
6878 m_childSiteLink.Connect (m_islandToConnect);
6979 m_islandToConnect = nullptr ;
7080 }
81+ UnregisterForRootIslandEvents ();
7182
7283 ParentLayoutChanged ();
7384 auto view = Parent ();
@@ -84,12 +95,42 @@ void ContentIslandComponentView::OnMounted() noexcept {
8495 }
8596}
8697
98+ void ContentIslandComponentView::RegisterForRootIslandEvents () noexcept {
99+ m_parentContentIsland = ParentContentIsland ();
100+
101+ if (m_parentContentIsland.IsConnected ()) {
102+ ConnectInternal ();
103+ } else {
104+ m_islandStateChangedToken = m_parentContentIsland.StateChanged (
105+ [wkThis = get_weak ()](
106+ const winrt::Microsoft::UI::Content::ContentIsland & /* island*/ ,
107+ const winrt::Microsoft::UI::Content::ContentIslandStateChangedEventArgs & /* args*/ ) {
108+ if (auto strongThis = wkThis.get ()) {
109+ strongThis->ConnectInternal ();
110+ }
111+ });
112+ }
113+ }
114+
115+ void ContentIslandComponentView::UnregisterForRootIslandEvents () noexcept {
116+ if (m_islandStateChangedToken) {
117+ m_parentContentIsland.StateChanged (m_islandStateChangedToken);
118+ m_islandStateChangedToken = {};
119+ m_parentContentIsland = nullptr ;
120+ }
121+ }
122+
123+ void ContentIslandComponentView::OnMounted () noexcept {
124+ RegisterForRootIslandEvents ();
125+ }
126+
87127void ContentIslandComponentView::OnUnmounted () noexcept {
88128 m_layoutMetricChangedRevokers.clear ();
89129 if (m_navigationHostDepartFocusRequestedToken && m_navigationHost) {
90130 m_navigationHost.DepartFocusRequested (m_navigationHostDepartFocusRequestedToken);
91131 m_navigationHostDepartFocusRequestedToken = {};
92132 }
133+ UnregisterForRootIslandEvents ();
93134}
94135
95136void ContentIslandComponentView::ParentLayoutChanged () noexcept {
0 commit comments