スポンサーリンク

Win32API+WinRT+XamlなGUIを.NETやUWPなしで作成する(3)xamlコントロールをxamlテキストから生成

プログラム冒頭に以下を追加。

特に今回必要なのは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 });


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: