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

参考

WinUI 3 with C++ 入門 - ビリヤードが好きなプログラマー