プログラム冒頭に以下を追加。
特に今回必要なのはXamlReader。
// イベントハンドラのため追加 #include <winrt/Windows.UI.Xaml.Controls.Primitives.h> // XamlReader #include <winrt/Windows.UI.Xaml.Markup.h> // イベントハンドラ struct handler { void ClickHandler( winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& args) { // クリックされたらメッセージボックス表示 MessageBox(nullptr, L"Clicked", nullptr, 0); } };
Windows::UI::Xaml::Markup::XamlReader::XamlReader::Load でテキストからコントロールを作成できる。
少なくともネイティブWinRTではXamlの中のイベントハンドラ指定はできないらしいので、読み込んでから追加する。
auto xamltxt = LR"( <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> <Button x:Name="myButton" Height="116" Width="207">Click Me</Button> </StackPanel> </Page> )"; // winrtの文字列形式に変換 winrt::hstring hs(xamltxt); //////////////////////// // xamlコントロールを作成 auto xamlContainer = Windows::UI::Xaml::Markup::XamlReader::XamlReader::Load(hs).as<Windows::UI::Xaml::Controls::Page>(); desktopSource.Content(xamlContainer); // ボタンのインスタンスを取り出す Windows::UI::Xaml::Controls::Page page = desktopSource.Content().as<Windows::UI::Xaml::Controls::Page>(); Windows::UI::Xaml::Controls::Button btn = page.FindName(winrt::hstring(L"myButton")).as< Windows::UI::Xaml::Controls::Button>(); // イベントハンドラ追加 handler hd; auto revoker = btn.Click({&hd,&handler::ClickHandler });