说我有这个班:
public ref class Page1 sealed : Windows::UI::Xaml::Controls::Page {};
我可以像这样激活这个类的实例:
auto page = ref new Page1();
但是我如何在原始C ++中做到这一点?
我试过这个,但它不起作用:
Microsoft::WRL::Wrappers::HString className;
className.Set(L"App1.Page1");
IInspectable *page;
Windows::Foundation::ActivateInstance(className.Get(), &page);
当我指定一个Windows运行时类名(例如“Windows.UI.Xaml.Controls.Button”)时,上面的代码确实有效,而不是我自己的ref class“App1.Page1”。
或者,鉴于我已在Page1
命名空间中声明了名为App1
的公共引用类,如何从HSTRING“App1”激活此类的实例为IInspectable*
.Page1" ?
答案 0 :(得分:0)
我想我已经弄明白了。好吧,这个答案并没有直接解决激活任何类型的问题,但它做了我想做的事。
魔鬼在细节中。 XAML编译器将生成一组在解决方案资源管理器中不可见的文件。这些文件的扩展名为.g.h
和.g.hpp
。您可以单击"显示所有文件"解决方案资源管理器中的按钮可以看到它们。
在App.g.h
中,App类实现了Windows::UI::Xaml::Markup::IXamlMetadataProvider
类,我们可以使用它来获取有关XAML类型的信息。 XamlTypeInfo
文件包含生成的类型定义。
以下是一些代码,展示了如何从TypeName
激活我们的某个XAML类型:
Object^ activate(TypeName typeName)
{
auto app = Application::Current;
auto provider = static_cast<IXamlMetadataProvider^>(app);
auto xamlType = provider->GetXamlType(typeName);
return xamlType->ActivateInstance();
}
由于XAML编译器生成的XAML类型信息,因此无需WRL,100%C ++ / CX!
我相信C#项目也有类似的结构,因为Application
派生类也会实现IXamlMetadataProvider
接口。在Windows引擎盖下,Windows运行时不使用.NET,因此它没有任何类型的&#34;真正的&#34;反射,所以它依赖于静态定义的类型定义。