如何激活 ref class 的实例
How to activate an instance of a ref class
说我有这个 class:
public ref class Page1 sealed : Windows::UI::Xaml::Controls::Page {};
我可以像这样激活这个 class 的一个实例:
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 运行时 class 名称(例如 "Windows.UI.Xaml.Controls.Button")时,上面的代码确实有效,只是不是我自己的引用 class "App1.Page1".
或者,鉴于我已经在 App1
命名空间中声明了一个名为 Page1
的 public ref class,我该如何激活这个 [=34] 的实例=] 作为来自 HSTRING "App1.Page1"?
的 IInspectable*
我想我已经弄明白了。好吧,这个答案并没有直接解决激活任意类型的问题,但是它做到了我想要的。
细节决定成败。 XAML 编译器将生成一堆在解决方案资源管理器中不可见的文件。这些文件的扩展名为 .g.h
和 .g.hpp
。您可以在解决方案资源管理器中单击 "Show All Files" 按钮来查看它们。
在App.g.h
中,应用程序class实现了Windows::UI::Xaml::Markup::IXamlMetadataProvider
class,我们可以用它来获取我们的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();
}
无需 WRL,100% C++/CX,感谢 XAML 编译器生成的 XAML 类型信息!
我相信 C# 项目也有类似的结构,因为 Application
派生的 class 也将实现 IXamlMetadataProvider
接口。在幕后,Windows 运行时不使用 .NET,因此它没有任何类型的 "real" 反射,因此它依赖于静态定义的类型定义。
说我有这个 class:
public ref class Page1 sealed : Windows::UI::Xaml::Controls::Page {};
我可以像这样激活这个 class 的一个实例:
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 运行时 class 名称(例如 "Windows.UI.Xaml.Controls.Button")时,上面的代码确实有效,只是不是我自己的引用 class "App1.Page1".
或者,鉴于我已经在 App1
命名空间中声明了一个名为 Page1
的 public ref class,我该如何激活这个 [=34] 的实例=] 作为来自 HSTRING "App1.Page1"?
IInspectable*
我想我已经弄明白了。好吧,这个答案并没有直接解决激活任意类型的问题,但是它做到了我想要的。
细节决定成败。 XAML 编译器将生成一堆在解决方案资源管理器中不可见的文件。这些文件的扩展名为 .g.h
和 .g.hpp
。您可以在解决方案资源管理器中单击 "Show All Files" 按钮来查看它们。
在App.g.h
中,应用程序class实现了Windows::UI::Xaml::Markup::IXamlMetadataProvider
class,我们可以用它来获取我们的XAML类型的信息。 XamlTypeInfo
文件包含生成的类型定义。
下面是一些代码,展示了如何从 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
派生的 class 也将实现 IXamlMetadataProvider
接口。在幕后,Windows 运行时不使用 .NET,因此它没有任何类型的 "real" 反射,因此它依赖于静态定义的类型定义。