【问题标题】:How to activate an instance of a ref class如何激活 ref 类的实例
【发布时间】:2016-03-20 08:52:11
【问题描述】:

假设我有这门课:

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”。


另外,假设我在App1 命名空间中声明了一个名为Page1 的公共引用类,我如何从HSTRING“App1.Page1”中将此类的实例激活为IInspectable*

【问题讨论】:

  • 有点怀上 WRL 通常是行不通的。您通常也会在 WRL 中声明该页面,然后您现在将使用该名称,因为您必须明确声明它。我认为 C++/CX 生成的名称用命名空间_._classname 的下划线装饰,因此是“App1_._Page1”。

标签: c++ windows-runtime c++-cx wrl


【解决方案1】:

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

魔鬼在细节中。 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();
}

无需 WRL,100% C++/CX,感谢 XAML 编译器生成的 XAML 类型信息!

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

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 2023-03-29
    • 2018-06-17
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多