在 MvvmCross Xamarin.Forms 应用中打开无导航视图

Open view without navigation in MvvmCross Xamarin.Forms app

我正在尝试在 MvvmCross 中创建一个简单的登录视图(使用 Xamarin.Forms 选项),它会在按下登录按钮后切换到另一个视图,但是当我执行类似 this.ShowViewModel<MainViewModel>(); 的操作时或 navigationService.Navigate<MainViewModel>();

它留下一个导航后退按钮,可将视图切换回登录视图。

如何显示不同的视图但阻止它添加后退按钮?

下面是我的 LoginViewModel.cs 文件:

using System;
using System.Threading.Tasks;
using System.Windows.Input;
using MvvmCross.Core.Navigation;
using MvvmCross.Core.ViewModels;

namespace MvvmForms.MySampleApp.Core.ViewModels
{
    public class LoginViewModel : MvxViewModel
    {
        readonly IMvxNavigationService navigationService;

        public LoginViewModel(IMvxNavigationService navigationService)
        {
            this.navigationService = navigationService;
        }

        ...

        public ICommand ShowMainPageCommand => new MvxCommand(ShowInfoPage);

        private void ShowMainPage()
        {
            navigationService.Navigate<MainViewModel>();
        }
    }
}

这是我的 LoginPage.xaml 文件:

<?xml version="1.0" encoding="utf-8"?>
<mvx:MvxContentPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:forms="using:Xamarin.Forms"
    xmlns:mvx="clr-namespace:MvvmCross.Forms.Core;assembly=MvvmCross.Forms"
    x:Class="MvvmForms.MySampleApp.Core.Pages.LoginPage" 
    Title="Login Page"
>
<mvx:MvxContentPage.Padding Thickness="5, 0, 5, 95">
    <OnPlatform x:TypeArguments="Thickness">
        <On Platform="Android" Value="5, 0, 5, 0" />
        <On Platform="iOS" Value="5, 20, 5, 0" />
    </OnPlatform>
</mvx:MvxContentPage.Padding>
<StackLayout Spacing="10" Orientation="Vertical">
    <Label FontSize="24" Text="Enter your nickname in the box below" />
    <Entry Placeholder="Who are you?" TextColor="Red" Text="{Binding YourNickname}" />
    <Label FontSize="24" Text="{Binding Hello}" />
    <Button x:Name="LoginButton" Text="Login" Command="{Binding ShowMainPageCommand}" />
</StackLayout>

转到另一个页面后从导航堆栈中删除登录页面

给你推送页面

await Navigation.PushAsync(new MainPage());

现在,如果您有登录页面的参考,您可以

Navigation.RemovePage(loginPage);

否则在堆栈中找到您的页面并将其删除

 var pages = Navigation.NavigationStack.ToList();
  foreach (var page in pages)
     {
         if (page.GetType() == typeof(LoginPage))
              Navigation.RemovePage(page);
     }

此方法可能适合您。

_navigation 的类型为 NaviagtionPage

page 是您希望成为新根的页面。

var root  = _navigation.Navigation.NavigationStack.First();
_navigation.Navigation.InsertPageBefore(page);
_navigation.PopToRootAsync();

这会将您的页面作为根页面插入并删除登录页面