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