不能在框架内的xaml之间进行导航

本文关键字:之间 导航 xaml 框架 不能 | 更新日期: 2023-09-27 18:05:58

我有问题。为什么它没有导航到其他xaml?哪里出了问题?所以,我试图使它可以在一个框架中的两个或多个xaml之间导航。

链接:https://github.com/Englbach/MutiViewInRootPage

 <SplitView.Content>
    <!-- OnNavigatingToPage we synchronize the selected item in the nav menu with the current page.
         OnNavigatedToPage we move keyboard focus to the first item on the page after it's loaded. -->
    <Frame x:Name="AppShellFrame">
       <Frame.ContentTransitions>
           <TransitionCollection>
               <NavigationThemeTransition>
                   <NavigationThemeTransition.DefaultNavigationTransitionInfo>
                      <EntranceNavigationTransitionInfo />
                   </NavigationThemeTransition.DefaultNavigationTransitionInfo>
               </NavigationThemeTransition>
           </TransitionCollection>
       </Frame.ContentTransitions>
   </Frame>
</SplitView.Content>
public static AppShell Current = null;
public List<NavMenuItem> NavList { get; } = new List<NavMenuItem>(new[]
{
     new NavMenuItem()
     {
          Symbol = Symbol.Add,
          Label = "Add feed",
          DestPage = typeof(RootPages),
          Arguments = typeof(AddFeedView)
     },
     new NavMenuItem()
     {
          Symbol = Symbol.Edit,
          Label = "Edit feeds",
          DestPage = typeof(RootPages),
          Arguments = typeof(EditFeedView)
     }
});
public AppShell()
{
     this.InitializeComponent();
     Current = this;
}
private void NavMenuList_ItemInvoked(object sender, ListViewItem e)
{
     NavMenuList.SelectedIndex = -1;
     var item = (NavMenuItem)((NavMenuListView)sender).ItemFromContainer(e);
     if(item!=null)
     {
          AppFrame.Navigate(typeof(RootPages), item.Arguments);
     }
}

不能在框架内的xaml之间进行导航

您可能遵循官方导航菜单(XAML)示例来设计您的布局。

你的演示中有两个小问题。

  1. 每次单击NavMenuList中的项时,应触发AppShell.xaml.cs中的NavMenuList_ItemInvoked事件。在这种情况下,你一次又一次地导航到你的RootPages,然后一起把导航参数(item.Arguments)传递给AppFrame.Navigate(typeof(RootPages), item.Arguments);这样的RootPages,这个参数实际上就是你的目的地。

你可以这样修改这里的代码:

private void NavMenuList_ItemInvoked(object sender, ListViewItem e)
{
    //NavMenuList.SelectedIndex = -1;
    var item = (NavMenuItem)((NavMenuListView)sender).ItemFromContainer(e);
    if (item != null)
    {
        //AppFrame.Navigate(typeof(RootPages), item.Arguments);
        if (item.DestPage != null &&
            item.DestPage != this.AppFrame.CurrentSourcePageType)
        {
            this.AppFrame.Navigate(item.DestPage, item.Arguments);
        }
    }
}
然后这里是第二个问题,正如我所说的,Arguments应该是导航参数,例如,我导航到AddFeedView页面,我想发送一个消息"balalala",那么我们可以这样编码:AppFrame.Navigate(typeof(AddFeedView), "balalala");。这意味着,您混淆了DestPageArguments

你可以这样修改NavList:

public List<NavMenuItem> NavList { get; } = new List<NavMenuItem>(new[]
{
    new NavMenuItem()
    {
        Symbol = Symbol.Add,
        Label = "Add feed",
        DestPage = typeof(AddFeedView),
        Arguments = typeof(RootPages)
    },
    new NavMenuItem()
    {
        Symbol = Symbol.Edit,
        Label = "Edit feeds",
        DestPage = typeof(EditFeedView),
        Arguments = typeof(RootPages)
    }
});

另外,如果您希望AppFrame在默认情况下首先导航到RootPages,您可以这样编写代码:

public AppShell()
{
    this.InitializeComponent();
    Current = this;
    AppFrame.Navigate(typeof(RootPages));
}