diff --git a/cppwinrt/code_writers.h b/cppwinrt/code_writers.h index e6122a514..1781ebe61 100644 --- a/cppwinrt/code_writers.h +++ b/cppwinrt/code_writers.h @@ -3272,11 +3272,11 @@ struct __declspec(empty_bases) produce_dispatch_to_overridable } else if (namespace_name == "Windows.UI.Xaml.Markup") { - w.write(strings::base_xaml_component_connector, "Windows"); + w.write(strings::base_xaml_component_connector); } else if (namespace_name == "Microsoft.UI.Xaml.Markup") { - w.write(strings::base_xaml_component_connector, "Microsoft"); + w.write(strings::base_xaml_component_connector_winui); } } diff --git a/cppwinrt/cppwinrt.vcxproj b/cppwinrt/cppwinrt.vcxproj index 391fda68f..946152619 100644 --- a/cppwinrt/cppwinrt.vcxproj +++ b/cppwinrt/cppwinrt.vcxproj @@ -89,6 +89,7 @@ + diff --git a/cppwinrt/cppwinrt.vcxproj.filters b/cppwinrt/cppwinrt.vcxproj.filters index 9033a34a8..3176b206f 100644 --- a/cppwinrt/cppwinrt.vcxproj.filters +++ b/cppwinrt/cppwinrt.vcxproj.filters @@ -178,6 +178,9 @@ strings + + strings + diff --git a/strings/base_xaml_component_connector.h b/strings/base_xaml_component_connector.h index ac2edf807..16478f7a2 100644 --- a/strings/base_xaml_component_connector.h +++ b/strings/base_xaml_component_connector.h @@ -1,5 +1,5 @@ -WINRT_EXPORT namespace winrt::%::UI::Xaml::Markup +WINRT_EXPORT namespace winrt::Windows::UI::Xaml::Markup { template struct ComponentConnectorT : D diff --git a/strings/base_xaml_component_connector_winui.h b/strings/base_xaml_component_connector_winui.h new file mode 100644 index 000000000..9a84cc11d --- /dev/null +++ b/strings/base_xaml_component_connector_winui.h @@ -0,0 +1,52 @@ + +WINRT_EXPORT namespace winrt::Microsoft::UI::Xaml::Markup +{ + template + struct ComponentConnectorT : D + { + using composable_base = typename D::composable_base; + + void InitializeComponent() + { + if constexpr (m_has_connectable_base) + { + m_dispatch_base = true; + composable_base::InitializeComponent(); + m_dispatch_base = false; + } + D::InitializeComponent(); + } + + void Connect(int32_t connectionId, Windows::Foundation::IInspectable const& target) + { + if constexpr (m_has_connectable_base) + { + if (m_dispatch_base) + { + composable_base::Connect(connectionId, target); + return; + } + } + D::Connect(connectionId, target); + } + + auto GetBindingConnector(int32_t connectionId, Windows::Foundation::IInspectable const& target) + { + if constexpr (m_has_connectable_base) + { + if (m_dispatch_base) + { + return composable_base::GetBindingConnector(connectionId, target); + } + } + return D::GetBindingConnector(connectionId, target); + } + + private: + static constexpr bool m_has_connectable_base{ + impl::has_initializer::value && + impl::has_interface() }; + + bool m_dispatch_base{}; + }; +}