在C++ WinRT的NavigationView中,在控件动态填充后,如何选择一个项目:

huangapple go评论52阅读模式
英文:

in c++ winrt NavigationView how do I select an item after control is populated dynamically

问题

我正在使用 WinUi 2.8,并且我有一个导航视图,它是使用 MenuItemsSource 属性动态填充的:

<muxc:NavigationView x:Name="mainNav" MenuItemsSource="{x:Bind FirstLvelItems, Mode=OneWay}"
                     MenuItemTemplate="{StaticResource NavigationViewMenuItem}" >

一个项目也有动态填充的子项目:

<DataTemplate x:Key="NavigationViewMenuItem" x:DataType="local:MyType">
      <muxc:NavigationViewItem x:Name="NavItem"  Content="{x:Bind DisplayName}"  MenuItemsSource="{x:Bind SecondLevelItems}" Tag="{x:Bind Name}"/>
</DataTemplate>

在控件加载后,我想选择我确定在第二层的项目。我使用 NavigationView.Loaded() 事件,在那里我可以找到我想要的项目的父级(第一级)(使用 ContainerFromMenuItem() ),但我找不到来自第二级的项目。我尝试过使用 ContainerFromMenuItem()、MenuItems()、VisualTreeHelper,但都不起作用。

我正在在一个 Win32 应用程序的岛上使用 Winrt,所以我不能提供一个示例项目。

英文:

I am using WinUi 2.8 and I have a navigation view that is populated dynamically using MenuItemsSource Property:

<muxc:NavigationView x:Name="mainNav" MenuItemsSource="{x:Bind FirstLvelItems, Mode=OneWay}"
                     MenuItemTemplate="{StaticResource NavigationViewMenuItem}" >

An item has children also populated dynamically:

<DataTemplate x:Key="NavigationViewMenuItem" x:DataType="local:MyType">
      <muxc:NavigationViewItem x:Name="NavItem"  Content="{x:Bind DisplayName}"  MenuItemsSource="{x:Bind SecondLevelItems}" Tag="{x:Bind Name}"/>
</DataTemplate>

After control is loaded I want to select an item that I know for sure that is on the second level. I use NavigationView.Loaded() event and there I can find the parent (the first level) of my wanted item (using ContainerFromMenuItem() ) but I can not find the item from the second level. I tried using ContainerFromMenuItem(), MenuItems(), VisualTreeHelper but nothing works.

I am using Winrt in an island from a Win32 app so I can not give a sample project.

答案1

得分: 1

在WinUI中,默认情况下,NavigationViewItem不会自动展开,因此当加载NavigationView控件时,其MenuItems不会被加载。

你可以在XAML中将NavigationViewItem的IsExpanded属性设置为true。这样,当触发NavigationView Loaded事件时,第二级的NavigationViewItems将被加载。

<DataTemplate x:Key="NavigationViewMenuItem" x:DataType="local:MyType">
    <muxc:NavigationViewItem IsExpanded="True" x:Name="NavItem" Content="{x:Bind DisplayName}" MenuItemsSource="{x:Bind SecondLevelItems}" Tag="{x:Bind Name}"/>
</DataTemplate>

附注:在NavigationView Loaded事件处理程序中,你需要折叠那些你不希望展开的NavigationViewItems。

英文:

In WinUI, NavigationViewItem is not expanded by default, so it's MenuItems won't be loaded when the NavigationView control is loaded.

You can set the NavigationViewItem IsExpanded to true in xaml. This way, the NavigationViewItems on the second level will be loaded when NavigationView Loaded event is triggered.

&lt;DataTemplate x:Key=&quot;NavigationViewMenuItem&quot; x:DataType=&quot;local:MyType&quot;&gt;
      &lt;muxc:NavigationViewItem IsExpanded=&quot;True&quot; x:Name=&quot;NavItem&quot;  Content=&quot;{x:Bind DisplayName}&quot;  MenuItemsSource=&quot;{x:Bind SecondLevelItems}&quot; Tag=&quot;{x:Bind Name}&quot;/&gt;
&lt;/DataTemplate&gt;

PS: On NavigationView Loaded event handler you need to collapse the NavigationViewItems you don't want to be expanded.

huangapple
  • 本文由 发表于 2023年5月24日 23:53:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/76325372.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定