C++/WinUI 3 技术笔记:(二)框架代码分析
前一节创建了一个 C++/WinUI 3 应用,接着分析默认生成的框架代码。框架代码中使用了大量 C++ 模板技术和新语言特性,发挥了 C++ 语言零开销抽象的优势,很值得学习。 App 应用入口 重新回到应用入口类 App。 struct App : AppT<App> { App(); void OnLaunched(Microsoft::UI::Xaml::LaunchActivatedEventArgs const&); private: winrt::Microsoft::UI::Xaml::Window window{ nullptr }; }; 应用的入口 App 类继承于一个代码生成的模板 AppT,这里用到的 C++ 奇异模板递归(CRTP)技术和 ATL 一脉相承。 template <typename D, typename ... Interfaces> struct AppT: public ::winrt::Microsoft::UI::Xaml::ApplicationT<D, ::winrt::Microsoft::UI::Xaml::Markup::IXamlMetadataProvider, Interfaces...> { using IXamlType = ::winrt::Microsoft::UI::Xaml::Markup::IXamlType; void InitializeComponent() { if (_contentLoaded) return; _contentLoaded = true; ::winrt::Windows::Foundation::Uri resourceLocator{ L"ms-appx:///App.xaml" }; ::winrt::Microsoft::UI::Xaml::Application::LoadComponent(*this, resourceLocator); } IXamlType GetXamlType(::winrt::Windows::UI::Xaml::Interop::TypeName const& type) { return AppProvider()->GetXamlType(type); } IXamlType GetXamlType(::winrt::hstring const& fullName) { return AppProvider()->GetXamlType(fullName); } ::winrt::com_array<::winrt::Microsoft::UI::Xaml::Markup::XmlnsDefinition> GetXmlnsDefinitions() { return AppProvider()->GetXmlnsDefinitions(); } private: bool _contentLoaded{false}; winrt::com_ptr<XamlMetaDataProvider> _appProvider; winrt::com_ptr<XamlMetaDataProvider> AppProvider() { if (!...