在MvvmCross Xamarin.Forms应用程序中打开视图而不导航

在MvvmCross Xamarin.Forms应用程序中打开视图而不导航,xamarin.forms,mvvmcross,Xamarin.forms,Mvvmcross,我试图在MvvmCross中创建一个简单的登录视图(使用Xamarin.Forms选项),在按下登录按钮后切换到另一个视图,但是当我执行类似于this.ShowViewModel()的操作时或navigationService.Navigate() 它会留下一个导航返回按钮,将视图切换回登录视图 如何显示不同的视图,但防止添加“后退”按钮 下面是我的LoginViewModel.cs文件: using System; using System.Threading.Tasks; using Sys

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

它会留下一个导航返回按钮,将视图切换回登录视图

如何显示不同的视图,但防止添加“后退”按钮

下面是我的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>();
        }
    }
}
使用系统;
使用System.Threading.Tasks;
使用System.Windows.Input;
使用MvvmCross.Core.Navigation;
使用MvvmCross.Core.ViewModels;
名称空间MvvmForms.MySampleApp.Core.ViewModels
{
公共类LoginViewModel:MvxViewModel
{
只读IMvxNavigationService导航服务;
公共登录视图模型(IMvxNavigationService navigationService)
{
this.navigationService=导航服务;
}
...
public ICommand ShowMainPageCommand=>new MvxCommand(ShowInfoPage);
私有void ShowMainPage()
{
navigationService.Navigate();
}
}
}
这是我的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);
     }

这种方法可能适合你

_导航类型为NaviagtionPage

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

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

这将以根页面的形式插入您的页面,并删除登录页面

谢谢,但我该如何和在何处这样做?您能提供一些代码吗?谢谢,我终于成功地将您的for循环添加到MainPage.xaml.cs文件的
onaappearing
方法中并更改
page.GetType()!=typeof(LoginPage)
page.GetType()==typeof(LoginPage)
。不过有一件小事,视图出现后,“后退”按钮消失了。是否可以在视图出现之前删除页面?我已修复!=,这一部分是为了删除除某一页以外的所有内容。现在,回答你们的问题:若你们在主页上这样做,那个么按钮就会出现。您应该在调用Navigate to main page后立即执行此操作。我尝试使用LoginPage.xaml.cs(因为我无法访问LoginViewModel中的导航对象&navigationService似乎没有任何堆栈功能),但这会破坏主页中的下一组导航以及所有MvvmCross绑定。如果您是从模型进行导航,则需要以某种方式(直接或通过包含导航对象的页面)将导航对象传递给它。如果你提供样品项目,我可能会帮助你更多。我没有你正在做什么的确切细节。我不知道你说的导航是导航页面是什么意思。这是一个MvvmCross组件吗?我尝试了您提供的方法,只使用了来自主页的导航以及登录页面(两个都是MvxContentPage实例),但是主页不在堆栈中或者太晚了(这会导致返回按钮可见)。您是否将登录页面设置为NavigationPage?另一种更简单的方法是,将应用程序初始化为用户已登录,然后将登录页面作为模式页面推送。模式页面将不包含后退按钮登录页面不是
NavigationPage
,而是
MvvmCross.Forms.Core.MvxContentPage
的实例。我还为登录页面添加了代码。我如何在MvvmCross中使用模式页面,同时仍然使用Xamarin.Forms,而不是在iOS和Android中重建屏幕?我找不到关于Xamarin的任何信息。MvvmCross中的Forms modals。