Скажем, у меня есть этот класс:
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».
В качестве альтернативы, учитывая, что я объявил публичный класс ref с именем Page1
в App1
пространство имен, как я могу активировать экземпляр этого класса как IInspectable*
из HSTRING «App1.Page1»?
Я думаю, что я понял это. Ну, этот ответ напрямую не решает проблему активации любого произвольного типа, но он делает то, что я хочу.
Дьявол кроется в деталях. Компилятор 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
класс будет реализован IXamlMetadataProvider
интерфейс тоже. Под капотом среда выполнения Windows не использует .NET, поэтому не имеет никакого «реального» отражения, поэтому опирается на статически определенные определения типов.
Других решений пока нет …