私がこのクラスを持っているとしましょう:
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);
上記のコードは、自分の参照クラス「App1.Page1」ではなく、Windowsランタイムクラス名(「Windows.UI.Xaml.Controls.Button」など)を指定した場合に機能します。
または、名前空間で指定さPage1
れたパブリックrefクラスを宣言したApp1
場合、このクラスのインスタンスをIInspectable*
HSTRING "App1.Page1"からとしてアクティブ化するにはどうすればよいですか?
私はそれを理解したと思います。ええと、この答えは任意の型をアクティブにする問題を直接解決するわけではありませんが、私が望むことはします。
悪魔は細部にあります。XAMLコンパイラは、ソリューションエクスプローラーに表示されない一連のファイルを生成します。これらのファイルは、拡張子を持っている.g.h
と.g.hpp
。ソリューションエクスプローラーの[すべてのファイルを表示]ボタンをクリックして、それらを表示できます。
ではApp.g.h
、アプリケーションクラスが実装Windows::UI::Xaml::Markup::IXamlMetadataProvider
我々はXAMLの種類に関する情報を取得するために使用できるクラスを、。XamlTypeInfo
ファイルが生成された型定義が含まれています。
XAMLタイプの1つをTypeName
:からアクティブ化する方法を示すコードを次に示します。
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です!
Application
派生クラスもIXamlMetadataProvider
インターフェイスを実装するという点で、同様の構造がC#プロジェクトにも当てはまると思います。内部的には、Windowsランタイムは.NETを使用しないため、「実際の」リフレクションがないため、静的に定義された型定義に依存します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加