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);

上記のコードは、独自の参照クラス「App1.Page1」ではなく、Windows ランタイム クラス名 (「Windows.UI.Xaml.Controls.Button」など) を指定すると機能します。


または、名前空間で名前が付けられた public ref クラスを宣言しPage1App1場合、このクラスのインスタンスを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 型の 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 です。

同様の構造が C# プロジェクトにも当てはまり、派生クラスもインターフェイスApplicationを実装すると思います。IXamlMetadataProvider内部的には、Windows ランタイムは .NET を使用しないため、「実際の」リフレクションはまったくなく、静的に定義された型定義に依存しています。

于 2016-03-20T00:52:11.903 に答える