2

说我有这门课:

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”)时,上面的代码确实有效,而不是我自己的引用类“App1.Page1”。


或者,假设我已经声明了一个Page1App1命名空间中命名的公共 ref 类,我如何IInspectable*从 HSTRING“App1.Page1”中激活该类的实例?

4

1 回答 1

0

我想我已经想通了。好吧,这个答案并没有直接解决激活任意类型的问题,但它做了我想要的。

魔鬼在细节中。XAML 编译器将生成一堆在解决方案资源管理器中不可见的文件。这些文件具有扩展名.g.h.g.hpp. 您可以单击解决方案资源管理器中的“显示所有文件”按钮来查看它们。

App.g.h中,App 类实现了Windows::UI::Xaml::Markup::IXamlMetadataProvider该类,我们可以使用它来获取有关 XAML 类型的信息。这些XamlTypeInfo文件包含生成的类型定义。

下面是一些代码,展示了如何从 激活我们的 XAML 类型之一TypeName

Object^ activate(TypeName typeName)
{
    auto app = Application::Current;
    auto provider = static_cast<IXamlMetadataProvider^>(app);
    auto xamlType = provider->GetXamlType(typeName);
    return xamlType->ActivateInstance();
}

无需 WRL,100% C++/CX,这要归功于 XAML 编译器生成的 XAML 类型信息!

我相信 C# 项目也有类似的结构,因为Application-derived 类也将实现IXamlMetadataProvider接口。在底层,Windows 运行时不使用 .NET,因此它没有任何类型的“真实”反射,因此它依赖于静态定义的类型定义。

于 2016-03-20T00:52:11.903 回答