WinUI - メニューを選択したときのイベントを実装する

C++ で WinUI 3 ライブラリを使う

NavigationVeiw のメニューを選択したときのイベントを処理する方法を紹介します。

NavigationView のメニューを選択すると ItemInvoked イベントが発生します。また選択しているメニューが変化したときは SelectionChanged イベントも発生します。

<NavigationView x:Name="navi" ItemInvoked="navi_ItemInvoked" SelectionChanged="navi_SelectionChanged" IsSettingsVisible="False">
    <NavigationView.MenuItems>
        <NavigationViewItem Content="Page A" Tag="PageA" />
        <NavigationViewItem Content="Page B" Tag="PageB" SelectsOnInvoked="False" >
            <NavigationViewItem.MenuItems>
                <NavigationViewItem Icon="Home" Content="Page B1" Tag="PageB1" />
                <NavigationViewItem Icon="World" Content="Page B2" Tag="PageB2" />
            </NavigationViewItem.MenuItems>
        </NavigationViewItem>
    </NavigationView.MenuItems>
        
    <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center" Spacing="4">
        <TextBox x:Name="ItemInvokedText" Header="ItemInvoked" />
        <TextBox x:Name="SelectionChangedText" Header="SelectionChanged" />
    </StackPanel>
</NavigationView>

どのメニューを選択しても同じイベントハンドラが呼び出されるので、Tag 等を設定してメニューを識別できるようにします。

void winrt::NavigationView1::implementation::MainWindow::navi_SelectionChanged(winrt::Microsoft::UI::Xaml::Controls::NavigationView const& sender, winrt::Microsoft::UI::Xaml::Controls::NavigationViewSelectionChangedEventArgs const& args)
{
    if (auto tag = args.SelectedItemContainer().Tag().try_as<hstring>(); tag)
    {
        SelectionChangedText().Text(*tag);
    }
}

void winrt::NavigationView1::implementation::MainWindow::navi_ItemInvoked(winrt::Microsoft::UI::Xaml::Controls::NavigationView const& sender, winrt::Microsoft::UI::Xaml::Controls::NavigationViewItemInvokedEventArgs const& args)
{
    if (auto tag = args.InvokedItemContainer().Tag().try_as<hstring>(); tag)
    {
        ItemInvokedText().Text(*tag);
    }
}

参考

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

NavigationView - Windows apps | Microsoft Learn