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

问题描述 投票:0回答:2

我创建了一些

NavigationViewItem
并设置了它的
x:Name
Tag
,比如:

<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>

我想通过

NavigationViewItem
x:Name
找到
Tag
对象,以便我可以通过代码更改
Content
IsSelected
属性。

我发现

Type.GetType
可能会通过
x:Name
获得页面,例如:

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

所以我尝试用它来获取

NavigationViewItem
对象,例如:

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

但是,它不起作用。

c# xaml uwp-xaml winui-3 winui
2个回答
0
投票

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

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.
}

0
投票

我找到了一个简单的方法来做到这一点:

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

在此示例中,它将

IsSelected
NavigationViewItem
属性设置为
true
,其中
pageName
等于
Tag
NavigationViewItem
的属性。

© www.soinside.com 2019 - 2024. All rights reserved.