让弹出菜单在Xamarin Forms中按照我想要的方式工作是一个很大的痛苦。我试图让某个菜单项(我的统计数据)在用户登录的情况下转到某个页面,或者在用户没有登录的情况下转到另一个页面(登录页面)。我尝试了两种不同的方法都没有成功。
方式一
首先,我尝试在XAML中设置弹出项,并在Shell内容中指定路由,如下所示:
<FlyoutItem Title="My Stats" Icon="icon_feed.png">
<ShellContent x:Name="shellContent_myStats" Route="MyStatsPage" ContentTemplate="{DataTemplate local:MyStatsPage}" />
</FlyoutItem>
然后,当用户登录/退出时,我将以编程方式修改路由:
//Logging Out
shellContent_myStats.ContentTemplate = new DataTemplate(typeof(LoginPage));
Routing.SetRoute(shellContent_myStats, "LoginPage");
...
//Logging In
shellContent_myStats.ContentTemplate = new DataTemplate(typeof(MyStatsPage));
Routing.SetRoute(shellContent_myStats, "MyStatsPage");
我无法让这个工作。无论出于何种原因,只有执行的第一部分才会生效。例如,如果我在注销时启动应用程序,它会按预期定向到登录页面,但一旦我注销就不会切换。反过来也是如此,如果我在登录时启动应用程序,它会按预期导航到“我的统计数据”页面,但即使在我注销后也会继续这样做。
我已经尝试了上述代码的几个不同的变体,但都无济于事。
方法2
我尝试的第二种方法是在XAML中指定一个菜单项,并使用OnClick事件处理程序,如下所示:
<MenuItem Text="My Journey" StyleClass="MenuItemLayoutStyle" Clicked="OnMyStatsClicked"/>
代码隐藏:
public AppShell()
{
//Route now needs to be registered in page constructor
Routing.RegisterRoute(nameof(MyStatsPage), typeof(MyStatsPage));
...
public async void OnMyStatsClicked(object sender, EventArgs e)
{
Shell.Current.FlyoutIsPresented = false;
if (LoggedIn)
{
// Prefixing with `//` switches to a different navigation stack instead of pushing to the active one
await Shell.Current.GoToAsync($"//{nameof(MyStatsPage)}");
}
else
{
await Shell.Current.GoToAsync($"//{nameof(LoginPage)}");
}
}
...
现在,当我使用此设置选择菜单项时(登录时),它会抛出以下错误:
System.Exception: 'Global routes currently cannot be the only page on the stack, so absolute routing to global routes is not supported. For now, just navigate to: MyStatsPage'
如果我按照建议删除路由中的两个斜杠(“//”),导航工作,但左上角的弹出菜单不可用,取而代之的是一个后退按钮。这是不希望的,我希望菜单仍然可用。为什么我不能在后面的代码中定义的路由上使用绝对路由..?
我很感激任何关于这两种方法的建议。我已经做了好几天了,试图做一些看起来很简单的事情。谢谢
2条答案
按热度按时间efzxgjgh1#
您可以使用属性
FlyoutItemIsVisible
设置一个技巧,ShellContent
(因此相关页面)将在Shell层次结构中注册,但不会在弹出窗口中可见,并且它将仅在需要时加载,因为我们使用ContentTemplate
。假设您只使用弹出型按钮而不使用底部选项卡:
AppShell.xaml
AppShell.xaml.cs
注意事项
如果您同时使用底部选项卡,或者作为另一种方法,我建议隐藏与当前日志状态无关的页面(例如:如果用户已登录,则隐藏LoginPage)。
How can you restrict/control the navigation routes the user can visit based on login status/role?
5m1hhzi42#
请确保您没有在AppShell.xaml.cs中将此页面注册为全局路由。