WinUI - XAML要素のインスタンスにコードからアクセスする
C++ で WinUI 3 ライブラリを使う
XAMLで定義した要素のインスタンスに C++ のコードからアクセスするには、XAML要素に Name 属性をつけます。そうすると XAMLのコンパイル時に Generated Files下にSetter/Getter 実装したファイルが作られ、C++ のコードからアクセスできるようになります。
例えば、Button に Name属性 myButton を設定すると
<Window> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> <Button x:Name="myButton" Click="myButton_Click">Click Me</Button> </StackPanel> </Window>
Setter/Getter を実装した Generated Files/MainWindow.xaml.g.h が作成され
namespace winrt::NavigationView1::implementation { template <typename D, typename ... I> struct MainWindowT : public ::winrt::NavigationView1::implementation::MainWindow_base<D, ::winrt::Microsoft::UI::Xaml::Markup::IComponentConnector, I...> { ::winrt::Microsoft::UI::Xaml::Controls::Button myButton() { return _myButton; } void myButton(::winrt::Microsoft::UI::Xaml::Controls::Button value) { _myButton = value; } private: ::winrt::Microsoft::UI::Xaml::Controls::Button _myButton{nullptr}; }; }
MainWindow.cpp で myButton() を使って Button のインスタンスを取得できるようになります。
void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { myButton().Content(box_value(L"Clicked")); }