当我单击“Hlather”页面时,我希望标题栏中可以使用后退导航按钮,当我单击后退按钮时,我应该返回主页。
我无法实现此目的,因为所有页面都充当根页面,并且后退按钮退出应用程序。
代码:
<!-- MainPage (not shown in flyout) -->
<ShellContent FlyoutIcon="O" Title="Home" Route="MainPage" ContentTemplate="{DataTemplate local:MainPage}" />
<!-- Bible, Hlather, Khutsun Hla shown in flyout -->
<FlyoutItem FlyoutIcon="O" Title="Bible" Route="Bible">
<ShellContent ContentTemplate="{DataTemplate views:bible}" />
</FlyoutItem>
<FlyoutItem FlyoutIcon="O" Title="Hlather" Route="Hlather">
<ShellContent ContentTemplate="{DataTemplate views:hlather}" />
</FlyoutItem>
<FlyoutItem FlyoutIcon="O" Title="Khutsun Hla" Route="Khutsun">
<ShellContent ContentTemplate="{DataTemplate views:khutsun}" />
</FlyoutItem>
<MenuItem Text="Settings" Command="{Binding OpenSettingsCommand}" />
<MenuItem Text="Logout" Command="{Binding LogoutCommand}" />
除此之外,当我打开应用程序时,我想加载登录页面。我可以通过使用这个来部分实现这一点:
if (isLoggedIn)
{
MainPage = new AppShell();
isLoggedIn = false;
}
else
{
MainPage = new login();
//MainPage = new NavigationPage(new login());
//isLoggedIn = false;
}
当我使用“MainPage=newlogin();”时,标题栏消失,当我使用“MainPage=newNavigationPage(newlogin());”时,标题栏消失标题栏被禁用(因为 appshell)。我不希望弹出窗口出现在这里。 我现在使用的解决方法是
MainPage = new AppShell();
Shell.Current.GoToAsync("vLogin");
我希望登录页面独立于其他页面,但仅在用户未登录时显示为单个页面。
关于后退导航,恐怕没有内置的方法来执行您需要的操作。这根本不是
Shell
的工作原理。所有弹出项目页面都被视为根页面。
如果您想实现自定义后退按钮行为,您可以覆盖
OnBackButtonPressed
类上的 AppShell
并在那里执行您的逻辑。
它可能会涉及跟踪您之前访问过的页面并了解何时显示它们(我认为每当您按下后退按钮时都会调用此方法,即使您不在“根”页面上)。
对于登录页面的问题,我设法将其保留在
Shell
中,禁用所有 Flyout 行为。
内部
AppShell.xaml.cs
Items.Add(new ShellContent
{
Title = "Login",
ContentTemplate = new DataTemplate(typeof(LoginPage)),
FlyoutItemIsVisible = false, // Note this
Route = nameof(LoginPage)
});
并且
LoginPage.xaml
有这个标题(注意 FlyoutBehavior
)。
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
Shell.FlyoutBehavior="Disabled"
x:Class="...Login.Views.LoginPage">
您可以使用
Shell.TitleView
显示后退按钮。并处理按钮的单击事件以返回主页:
<Shell.TitleView>
<Grid ColumnDefinitions="2*,8*">
<Button Text="Back" Clicked="Button_Clicked" HorizontalOptions="Start" Grid.Column="0"/>
</Grid>
</Shell.TitleView>
在后面的代码中:
private void Button_Clicked(object sender, EventArgs e)
{
Shell.Current.GoToAsync("///MainPage");
}