XAML 如何在WinUI 3中通过使用x:name或标记定位NavigationViewItem来更改其Content和IsSelected属性?

hts6caw3  于 2023-05-27  发布在  其他
关注(0)|答案(2)|浏览(149)

我创建一些NavigationViewItem并设置它的x:NameTag,如下所示:

<NavigationView x:Name="nvSample"
                SelectionChanged="nvSample_SelectionChanged"
                IsBackButtonVisible="Collapsed"
                IsSettingsVisible="False">

        <NavigationView.MenuItems>

            <NavigationViewItem x:Name="NavigationViewItem_HomePage" Icon="Home" Content="Home" Tag="HomePage" IsSelected="True" />
            <NavigationViewItem x:Name="NavigationViewItem_SimpleSortPage" Icon="Sort" Content="Sort" Tag="SimpleSortPage" />

            <...........>

        </NavigationView.MenuItems>

</NavigationView>

我想通过x:NameTag找到NavigationViewItem对象,以便通过代码更改ContentIsSelected属性。
我发现Type.GetType可能会收到x:Name的页面,如:

Type pageSelected = Type.GetType("NumberSort.Pages.SimpleSort");
RootPageFrame.Navigate(pageSelected,this);

所以我尝试使用它来获取NavigationViewItem对象,如下所示:

var NavigationItem = (NavigationViewItem)Type.GetType("NavigationViewItem_HomePage");

然而,它不起作用。

dz6r00yl

dz6r00yl1#

您可以创建如下扩展方法:

NavigationViewExtensions.cs

public static class NavigationViewExtensions
{
    // Get all NavigationViewItems from a NavigationViewItem.
    public static IEnumerable<NavigationViewItem> GetAllNavigationViewItems(this NavigationViewItem navigationViewItem)
    {
        if (navigationViewItem.MenuItems is null)
        {
            yield break;
        }

        foreach (var menuItem in navigationViewItem.MenuItems.OfType<NavigationViewItem>())
        {
            yield return menuItem;

            if (menuItem.MenuItems is null)
            {
                continue;
            }

            foreach (NavigationViewItem subMenuItem in menuItem.MenuItems.OfType<NavigationViewItem>())
            {
                yield return subMenuItem;
            }
        }
    }

    // Get all NavigationViewItems from a NavigationView.
    public static IEnumerable<NavigationViewItem> GetAllNavigationViewItems(this NavigationView navigationView)
    {
        foreach (NavigationViewItem menuItem in navigationView.MenuItems.OfType<NavigationViewItem>())
        {
            yield return menuItem;

            if (menuItem.MenuItems is null)
            {
                continue;
            }

            foreach (NavigationViewItem subMenuItem in menuItem.GetAllNavigationViewItems())
            {
                yield return subMenuItem;
            }
        }
    }
}

然后像这样使用它:

if (this.nvSample
        .GetAllNavigationViewItems()
        .FirstOrDefault(x => x.Name is "NavigationViewItem_HomePage") is NavigationViewItem navigationViewItem)
{
    // Do something here.
}
0aydgbwb

0aydgbwb2#

我找到了一个简单的方法:

public static void SwitchPage (string pageName,NavigationView navigationView)
{

    var navigationViewItems = navigationView.MenuItems.OfType<NavigationViewItem>().ToList();

    if (navigationViewItems != null) {
        foreach (var item in navigationViewItems)
        {
            if( item.Tag.Equals(pageName))
            {
                item.IsSelected = true; break;
            }
        }
    }
    else {throw new ArgumentNullException()};
}

在这个例子中,它将NavigationViewItemIsSelected属性设置为true,其中pageName等于NavigationViewItemTag属性。

相关问题