如何切换Xamarin表单中的页面?

如何在Xamarin Forms中的页面之间切换? 我的主页是一个ContentPage,我不想切换到一个标签页面。

我已经能够通过find应该触发新页面的控件的父母来伪造它,直到findContentPage,然后用带有新页面的控件replace内容。 但是,这似乎很sl </s>。

谢谢

Xamarin.Forms支持内置多个导航主机:

  • NavigationPage页面,下一页在其中滑动,
  • TabbedPage ,你不喜欢的那个
  • CarouselPage ,允许左右切换到next / prev页面。

除此之外,所有页面还支持PushModalAsync() ,它只是在现有页面上推新页面。

最后,如果您想确保用户无法返回到上一页(使用手势或背面硬件button),则可以保持显示相同的Page并replace其Content

build议的replace根页面的选项也适用,但是您必须针对每个平台进行不同的处理。

在App类中,您可以将MainPage设置为导航页面,并将根页面设置为ContentPage:

 public App () { // The root page of your application MainPage = new NavigationPage( new FirstContentPage() ); } 

然后在你的第一个ContentPage调用中:

 Navigation.PushAsync (new SecondContentPage ()); 

如果你的项目已经被设置为一个PCL表单项目(很可能是共享表单,但是我没有尝试过),那么就有一个类App.cs,它看起来像这样:

 public class App { public static Page GetMainPage () { AuditorDB.Model.Extensions.AutoTimestamp = true; return new NavigationPage (new LoginPage ()); } } 

您可以修改GetMainPage方法以返回您在项目中定义的新TabbedPaged或其他页面

从那里你可以添加命令或事件处理程序来执行代码并执行

 Navigation.PushAsync(new OtherPage()); // to show OtherPage and be able to go back Navigation.PushAsyncModal(new AnotherPage()); // to show AnotherPage and not have a Back button Navigation.PopAsync();// to go back one step on the navigation stack 

将新页面推入堆栈,然后删除当前页面。 这导致了一个开关。

 item.Tapped += async (sender, e) => { await Navigation.PushAsync (new SecondPage ()); Navigation.RemovePage(this); }; 

您首先需要进入导航页面:

 MainPage = NavigationPage(new FirstPage()); 

切换内容并不理想,因为您只有一个大页面和一组页面事件,如OnAppearing等。

通过使用PushAsync()方法,您可以推送PopModalAsync(),您可以在导航堆栈中popup页面。 在我的代码示例下面我有一个导航页面(根页面),并从这个页面我推入一个内容页面是一个login页面,一旦我完成了我的login页面我回到根页面

~~~导航可以被认为是页面对象的后进先出堆栈。为了从一个页面移动到另一个页面,应用程序将把新页面推到这个堆栈上。 要返回到上一页,应用程序将popup堆栈中的当前页面。 Xamarin.Forms中的导航由INavigation接口处理

Xamarin.Forms有一个NavigationPage类实现这个接口,并将pipe理页面的堆栈。 NavigationPage类还将一个导航栏添加到显示标题的屏幕顶部,并且还会有一个适当的返回button,返回到上一页。 下面的代码显示了如何在应用程序的第一页中包装一个NavigationPage:

参考上面列出的内容和一个链接,您应该查看有关Xamarin Forms的更多信息,请参阅导航部分:

http://developer.xamarin.com/guides/cross-platform/xamarin-forms/introduction-to-xamarin-forms/

~~~

 public class MainActivity : AndroidActivity { protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); Xamarin.Forms.Forms.Init(this, bundle); // Set our view from the "main" layout resource SetPage(BuildView()); } static Page BuildView() { var mainNav = new NavigationPage(new RootPage()); return mainNav; } } public class RootPage : ContentPage { async void ShowLoginDialog() { var page = new LoginPage(); await Navigation.PushModalAsync(page); } } 

//为简单起见,删除代码只显示popup窗口

 private async void AuthenticationResult(bool isValid) { await navigation.PopModalAsync(); } 

Xamarin.forms使用导航属性中的一页到另一页导航下面的示例代码

 void addClicked(object sender, EventArgs e) { //var createEmp = (Employee)BindingContext; Employee emp = new Employee(); emp.Address = AddressEntry.Text; App.Database.SaveItem(emp); this.Navigation.PushAsync(new EmployeeDetails()); this.Navigation.PushModalAsync(new EmployeeDetails()); } 

使用视图单元格导航一个页面到另一个页面下面的代码Xamrian.forms

  private async void BtnEdit_Clicked1(object sender, EventArgs e) { App.Database.GetItem(empid); await App.Current.MainPage.Navigation.PushModalAsync(new EmployeeRegistration(empid)); } 

像下面的例子

 public class OptionsViewCell : ViewCell { int empid; Button btnEdit; public OptionsViewCell() { } protected override void OnBindingContextChanged() { base.OnBindingContextChanged(); if (this.BindingContext == null) return; dynamic obj = BindingContext; empid = Convert.ToInt32(obj.Eid); var lblname = new Label { BackgroundColor = Color.Lime, Text = obj.Ename, }; var lblAddress = new Label { BackgroundColor = Color.Yellow, Text = obj.Address, }; var lblphonenumber = new Label { BackgroundColor = Color.Pink, Text = obj.phonenumber, }; var lblemail = new Label { BackgroundColor = Color.Purple, Text = obj.email, }; var lbleid = new Label { BackgroundColor = Color.Silver, Text = (empid).ToString(), }; //var lbleid = new Label //{ // BackgroundColor = Color.Silver, // // HorizontalOptions = LayoutOptions.CenterAndExpand //}; //lbleid.SetBinding(Label.TextProperty, "Eid"); Button btnDelete = new Button { BackgroundColor = Color.Gray, Text = "Delete", //WidthRequest = 15, //HeightRequest = 20, TextColor = Color.Red, HorizontalOptions = LayoutOptions.EndAndExpand, }; btnDelete.Clicked += BtnDelete_Clicked; //btnDelete.PropertyChanged += BtnDelete_PropertyChanged; btnEdit = new Button { BackgroundColor = Color.Gray, Text = "Edit", TextColor = Color.Green, }; // lbleid.SetBinding(Label.TextProperty, "Eid"); btnEdit.Clicked += BtnEdit_Clicked1; ; //btnEdit.Clicked += async (s, e) =>{ // await App.Current.MainPage.Navigation.PushModalAsync(new EmployeeRegistration()); //}; View = new StackLayout() { Orientation = StackOrientation.Horizontal, BackgroundColor = Color.White, Children = { lbleid, lblname, lblAddress, lblemail, lblphonenumber, btnDelete, btnEdit }, }; } private async void BtnEdit_Clicked1(object sender, EventArgs e) { App.Database.GetItem(empid); await App.Current.MainPage.Navigation.PushModalAsync(new EmployeeRegistration(empid)); } private void BtnDelete_Clicked(object sender, EventArgs e) { // var eid = Convert.ToInt32(empid); // var item = (Xamarin.Forms.Button)sender; int eid = empid; App.Database.DeleteItem(empid); } } 

呼叫:

 ((App)App.Current).ChangeScreen(new Map()); 

在App.xaml.cs中创build这个方法:

 public void ChangeScreen(Page page) { MainPage = page; } 

如果你不想去上一页,也就是说一旦授权完成,不要让用户回到login界面,那么你可以使用;

  App.Current.MainPage = new HomePage(); 

如果你想启用后端function,只需使用

 Navigation.PushModalAsync(new HomePage()) 

XAML页面添加这个

 <ContentPage.ToolbarItems> <ToolbarItem Text="Next" Order="Primary" Activated="Handle_Activated"/> </ContentPage.ToolbarItems> 

在CS页面上

  async void Handle_Activated(object sender, System.EventArgs e) { await App.Navigator.PushAsync(new PAGE()); }