Làm cách nào để chuyển trang trong Xamarin.Forms?


99

Làm cách nào để bạn chuyển đổi giữa các trang trong Xamarin Forms?

Trang chính của tôi là ContentPage và tôi không muốn chuyển sang một thứ gì đó giống như Tabbed Page.

Tôi đã có thể giả làm điều đó bằng cách tìm cha mẹ của các điều khiển sẽ kích hoạt trang mới cho đến khi tôi tìm thấy Trang Nội dung và sau đó hoán đổi Nội dung bằng các điều khiển cho một trang mới. Nhưng điều này có vẻ thực sự cẩu thả.


Đã có rất nhiều câu trả lời cho câu hỏi này, để xem nó có thể được thực hiện như thế nào bằng cách sử dụng mẫu cấu trúc MVVM, hãy tham khảo stackoverflow.com/a/37142513/9403963
Alireza Sattari

Câu trả lời:


67

Xamarin.Forms hỗ trợ nhiều máy chủ điều hướng được tích hợp sẵn:

  • NavigationPage, nơi trang tiếp theo trình chiếu,
  • TabbedPage, một trong những bạn không thích
  • CarouselPage, cho phép chuyển sang trái và phải sang các trang tiếp theo / trước.

Trên hết, tất cả các trang cũng hỗ trợ PushModalAsync()mà chỉ cần đẩy một trang mới lên trên trang hiện có.

Cuối cùng, nếu bạn muốn đảm bảo người dùng không thể quay lại trang trước (sử dụng cử chỉ hoặc nút phần cứng quay lại), bạn có thể giữ nguyên Pagehiển thị và thay thế nó Content.

Các tùy chọn được đề xuất thay thế trang gốc cũng hoạt động, nhưng bạn sẽ phải xử lý điều đó khác nhau cho mỗi nền tảng.


PushModalAsync dường như là một phần của Điều hướng, phải không? Tôi không thể tìm ra cách truy cập đối tượng / lớp Điều hướng. Tôi giả sử tôi cần truy cập một cái gì đó triển khai INavigation, nhưng cái gì?
Eric

Nếu trang của bạn được chứa trong một Trang điều hướng, bạn sẽ có thể truy cập thuộc tính Điều hướng từ bên trong trang của mình
Jason

1
Khi tôi bắt đầu sử dụng NavigationPage, mọi thứ đã vào đúng vị trí. Cảm ơn
Eric

1
@stephane xin vui lòng cho biết nếu trang đầu tiên của tôi là CarouselPage và trang thứ hai của tôi là masterDetailPage sau đó làm thế nào tôi có thể chuyển đổi các trang stackoverflow.com/questions/31129845/...
Atul Dhanuka

64

Trong lớp Ứng dụng, bạn có thể đặt Trang chính thành Trang điều hướng và đặt trang gốc thành Trang nội dung của bạn:

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

Sau đó, trong cuộc gọi ContentPage đầu tiên của bạn:

Navigation.PushAsync (new SecondContentPage ());

Tôi đã làm điều đó nhưng trang chính vẫn là trang mặc định mở ra. Bất kỳ trang nào tôi đặt thành trang chính đều không có hiệu lực. Tôi chỉ mở trang đầu tiên đã thiết lập. Vấn đề là gì?
Behzad

Visual Studio đề xuất nhập Android.Content.Resđể điều hướng. Điều đó có vẻ không ổn, tôi phải nhập nó từ đâu?
Christian

41

Nếu dự án của bạn đã được thiết lập dưới dạng dự án biểu mẫu PCL (và rất có thể là Biểu mẫu được chia sẻ nhưng tôi chưa thử) thì có một lớp App.cs trông giống như sau:

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

bạn có thể sửa đổi GetMainPagephương thức để trả về một TabbedPaged mới hoặc một số trang khác mà bạn đã xác định trong dự án

Từ đó, bạn có thể thêm lệnh hoặc trình xử lý sự kiện để thực thi mã và thực hiện

// to show OtherPage and be able to go back
Navigation.PushAsync(new OtherPage());

// to show AnotherPage and not have a Back button
Navigation.PushModalAsync(new AnotherPage()); 

// to go back one step on the navigation stack
Navigation.PopAsync();

3
Điều này không chuyển đổi giữa các trang. Điều này chỉ thay đổi trang nào được tải ban đầu.
dakamojo

câu hỏi của bạn đang nói về một trang chính. xem câu trả lời được cập nhật cho các ví dụ navigation
Sten Petrov

Cái quái gì Navigationtrong ví dụ này? - Đó có phải là đồ vật bạn đã tạo ra ở đâu đó không? - Tôi không thấy nó trong mẫu mã này.
BrainSlugs83,

Điều hướng là tài sản trên một Trang
Sten Petrov

cảm ơn; FTR PushAsync()không hoạt động với tôi, trong khi PushModalAsync()đó
knocte

23

Đẩy một trang mới lên ngăn xếp, sau đó xóa trang hiện tại. Điều này dẫn đến một công tắc.

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

Trước tiên, bạn cần phải ở trong Trang điều hướng:

MainPage = NavigationPage(new FirstPage());

Việc chuyển đổi nội dung không phải là điều lý tưởng vì bạn chỉ có một trang lớn và một tập hợp các sự kiện trang như OnAppilities vv.


Navigation.RemovePage();không được hỗ trợ trên Android.
Rohit Vipin Mathews

1
Navigation.RemovePage (trang); hoạt động trong Android, trước tiên cần phải ở bên trong trang điều hướng.
Daniel Roberts

Tôi sử dụng nó rộng rãi trong dự án của tôi trên Biểu mẫu 1.4.2. Có lẽ họ đã sửa lỗi, hoặc tôi chỉ may mắn chưa đạt được nó.
Daniel Roberts

Tôi đang sử dụng phiên bản mới nhất và tôi có thể sao chép nó. Vì vậy, tôi tin rằng bạn quá may mắn.
Rohit Vipin Mathews

2
Handy gợi ý - để loại bỏ hiệu ứng chuyển tiếp khi thay đổi trang, thêm sai như tham số thứ hai:await Navigation.PushAsync(new SecondPage(),false);
Damian Green

8

Nếu bạn không muốn quay lại trang trước, tức là không cho phép người dùng quay lại màn hình đăng nhập sau khi ủy quyền xong, thì bạn có thể sử dụng;

 App.Current.MainPage = new HomePage();

Nếu bạn muốn bật lại chức năng, chỉ cần sử dụng

Navigation.PushModalAsync(new HomePage())

4

Có vẻ như chủ đề này rất phổ biến và sẽ rất buồn khi không đề cập ở đây rằng có một cách thay thế - ViewModel First Navigation. Hầu hết các khuôn khổ MVVM hiện có sử dụng nó, tuy nhiên nếu bạn muốn hiểu nội dung của nó, hãy tiếp tục đọc.

Tất cả tài liệu chính thức của Xamarin.Forms đang chứng minh một giải pháp MVVM đơn giản nhưng hơi không tinh khiết. Đó là bởi vì Page(Chế độ xem) không nên biết gì về ViewModelvà ngược lại. Đây là một ví dụ tuyệt vời về vi phạm này:

// C# version
public partial class MyPage : ContentPage
{
    public MyPage()
    {
        InitializeComponent();
        // Violation
        this.BindingContext = new MyViewModel();
    }
}

// XAML version
<?xml version="1.0" encoding="utf-8"?>
<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:viewmodels="clr-namespace:MyApp.ViewModel"
    x:Class="MyApp.Views.MyPage">
    <ContentPage.BindingContext>
        <!-- Violation -->
        <viewmodels:MyViewModel />
    </ContentPage.BindingContext>
</ContentPage>

Nếu bạn có một ứng dụng 2 trang, cách tiếp cận này có thể tốt cho bạn. Tuy nhiên, nếu bạn đang làm việc trên một giải pháp doanh nghiệp lớn, bạn tốt hơn nên ViewModel First Navigationtiếp cận. Đây là cách tiếp cận phức tạp hơn một chút nhưng rõ ràng hơn nhiều cho phép bạn điều hướng giữa ViewModelsthay vì điều hướng giữa Pages(Chế độ xem). Một trong những lợi thế bên cạnh việc tách biệt rõ ràng các mối quan tâm là bạn có thể dễ dàng chuyển các tham số cho phần tiếp theo ViewModelhoặc thực thi mã khởi tạo không đồng bộ ngay sau khi điều hướng. Bây giờ đến chi tiết.

(Tôi sẽ cố gắng đơn giản hóa tất cả các ví dụ mã càng nhiều càng tốt).

1. Trước hết, chúng ta cần một nơi mà chúng ta có thể đăng ký tất cả các đối tượng của mình và tùy chọn xác định thời gian tồn tại của chúng. Đối với vấn đề này, chúng ta có thể sử dụng một thùng chứa IOC, bạn có thể tự chọn một thùng chứa. Trong ví dụ này, tôi sẽ sử dụng Autofac (nó là một trong những cách nhanh nhất hiện có). Chúng tôi có thể giữ một tham chiếu đến nó Appđể nó sẽ có sẵn trên toàn cầu (không phải là một ý tưởng hay, nhưng cần thiết để đơn giản hóa):

public class DependencyResolver
{
    static IContainer container;

    public DependencyResolver(params Module[] modules)
    {
        var builder = new ContainerBuilder();

        if (modules != null)
            foreach (var module in modules)
                builder.RegisterModule(module);

        container = builder.Build();
    }

    public T Resolve<T>() => container.Resolve<T>();
    public object Resolve(Type type) => container.Resolve(type);
}

public partial class App : Application
{
    public DependencyResolver DependencyResolver { get; }

    // Pass here platform specific dependencies
    public App(Module platformIocModule)
    {
        InitializeComponent();
        DependencyResolver = new DependencyResolver(platformIocModule, new IocModule());
        MainPage = new WelcomeView();
    }

    /* The rest of the code ... */
}

2. Chúng ta sẽ cần một đối tượng chịu trách nhiệm truy xuất Page(View) cho một đối tượng cụ thể ViewModelvà ngược lại. Trường hợp thứ hai có thể hữu ích trong trường hợp đặt trang gốc / chính của ứng dụng. Đối với điều đó, chúng ta nên đồng ý về một quy ước đơn giản rằng tất cả những thứ ViewModelsphải có trong ViewModelsthư mục và Pages(Chế độ xem) phải ở trong Viewsthư mục. Nói cách khác ViewModelsnên sống trong [MyApp].ViewModelskhông gian tên và Pages(Chế độ xem) trong [MyApp].Viewskhông gian tên. Ngoài điều đó, chúng tôi nên đồng ý rằng WelcomeView(Trang) phải có WelcomeViewModelvà v.v. Đây là ví dụ mã của trình liên kết:

public class TypeMapperService
{
    public Type MapViewModelToView(Type viewModelType)
    {
        var viewName = viewModelType.FullName.Replace("Model", string.Empty);
        var viewAssemblyName = GetTypeAssemblyName(viewModelType);
        var viewTypeName = GenerateTypeName("{0}, {1}", viewName, viewAssemblyName);
        return Type.GetType(viewTypeName);
    }

    public Type MapViewToViewModel(Type viewType)
    {
        var viewModelName = viewType.FullName.Replace(".Views.", ".ViewModels.");
        var viewModelAssemblyName = GetTypeAssemblyName(viewType);
        var viewTypeModelName = GenerateTypeName("{0}Model, {1}", viewModelName, viewModelAssemblyName);
        return Type.GetType(viewTypeModelName);
    }

    string GetTypeAssemblyName(Type type) => type.GetTypeInfo().Assembly.FullName;
    string GenerateTypeName(string format, string typeName, string assemblyName) =>
        string.Format(CultureInfo.InvariantCulture, format, typeName, assemblyName);
}

3.Đối với trường hợp thiết lập một trang gốc, chúng tôi sẽ cần loại ViewModelLocatorsẽ thiết lập BindingContexttự động:

public static class ViewModelLocator
{
    public static readonly BindableProperty AutoWireViewModelProperty =
        BindableProperty.CreateAttached("AutoWireViewModel", typeof(bool), typeof(ViewModelLocator), default(bool), propertyChanged: OnAutoWireViewModelChanged);

    public static bool GetAutoWireViewModel(BindableObject bindable) =>
        (bool)bindable.GetValue(AutoWireViewModelProperty);

    public static void SetAutoWireViewModel(BindableObject bindable, bool value) =>
        bindable.SetValue(AutoWireViewModelProperty, value);

    static ITypeMapperService mapper = (Application.Current as App).DependencyResolver.Resolve<ITypeMapperService>();

    static void OnAutoWireViewModelChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var view = bindable as Element;
        var viewType = view.GetType();
        var viewModelType = mapper.MapViewToViewModel(viewType);
        var viewModel =  (Application.Current as App).DependencyResolver.Resolve(viewModelType);
        view.BindingContext = viewModel;
    }
}

// Usage example
<?xml version="1.0" encoding="utf-8"?>
<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:viewmodels="clr-namespace:MyApp.ViewModel"
    viewmodels:ViewModelLocator.AutoWireViewModel="true"
    x:Class="MyApp.Views.MyPage">
</ContentPage>

4.Cuối cùng, chúng tôi sẽ cần một phương pháp NavigationServicehỗ trợ ViewModel First Navigation:

public class NavigationService
{
    TypeMapperService mapperService { get; }

    public NavigationService(TypeMapperService mapperService)
    {
        this.mapperService = mapperService;
    }

    protected Page CreatePage(Type viewModelType)
    {
        Type pageType = mapperService.MapViewModelToView(viewModelType);
        if (pageType == null)
        {
            throw new Exception($"Cannot locate page type for {viewModelType}");
        }

        return Activator.CreateInstance(pageType) as Page;
    }

    protected Page GetCurrentPage()
    {
        var mainPage = Application.Current.MainPage;

        if (mainPage is MasterDetailPage)
        {
            return ((MasterDetailPage)mainPage).Detail;
        }

        // TabbedPage : MultiPage<Page>
        // CarouselPage : MultiPage<ContentPage>
        if (mainPage is TabbedPage || mainPage is CarouselPage)
        {
            return ((MultiPage<Page>)mainPage).CurrentPage;
        }

        return mainPage;
    }

    public Task PushAsync(Page page, bool animated = true)
    {
        var navigationPage = Application.Current.MainPage as NavigationPage;
        return navigationPage.PushAsync(page, animated);
    }

    public Task PopAsync(bool animated = true)
    {
        var mainPage = Application.Current.MainPage as NavigationPage;
        return mainPage.Navigation.PopAsync(animated);
    }

    public Task PushModalAsync<TViewModel>(object parameter = null, bool animated = true) where TViewModel : BaseViewModel =>
        InternalPushModalAsync(typeof(TViewModel), animated, parameter);

    public Task PopModalAsync(bool animated = true)
    {
        var mainPage = GetCurrentPage();
        if (mainPage != null)
            return mainPage.Navigation.PopModalAsync(animated);

        throw new Exception("Current page is null.");
    }

    async Task InternalPushModalAsync(Type viewModelType, bool animated, object parameter)
    {
        var page = CreatePage(viewModelType);
        var currentNavigationPage = GetCurrentPage();

        if (currentNavigationPage != null)
        {
            await currentNavigationPage.Navigation.PushModalAsync(page, animated);
        }
        else
        {
            throw new Exception("Current page is null.");
        }

        await (page.BindingContext as BaseViewModel).InitializeAsync(parameter);
    }
}

Như bạn có thể thấy, có một BaseViewModel- lớp cơ sở trừu tượng cho tất cả những ViewModelsnơi bạn có thể định nghĩa các phương thức như InitializeAsyncvậy sẽ được thực thi ngay sau điều hướng. Và đây là một ví dụ về điều hướng:

public class WelcomeViewModel : BaseViewModel
{
    public ICommand NewGameCmd { get; }
    public ICommand TopScoreCmd { get; }
    public ICommand AboutCmd { get; }

    public WelcomeViewModel(INavigationService navigation) : base(navigation)
    {
        NewGameCmd = new Command(async () => await Navigation.PushModalAsync<GameViewModel>());
        TopScoreCmd = new Command(async () => await navigation.PushModalAsync<TopScoreViewModel>());
        AboutCmd = new Command(async () => await navigation.PushModalAsync<AboutViewModel>());
    }
}

Như bạn hiểu, phương pháp này phức tạp hơn, khó gỡ lỗi hơn và có thể gây nhầm lẫn. Tuy nhiên, có rất nhiều lợi ích cộng với việc bạn thực sự không cần phải tự thực hiện vì hầu hết các khung công tác MVVM đều hỗ trợ nó. Ví dụ mã được trình bày ở đây có sẵn trên github .

Có rất nhiều bài viết hay về ViewModel First Navigationcách tiếp cận và có một Mẫu Ứng dụng Doanh nghiệp miễn phí sử dụng sách điện tử Xamarin.Forms giải thích chi tiết điều này và nhiều chủ đề thú vị khác.


3

Bằng cách sử dụng phương thức PushAsync (), bạn có thể đẩy và PopModalAsync (), bạn có thể bật các trang đến và đi từ ngăn xếp điều hướng. Trong ví dụ mã của tôi bên dưới, tôi có một trang Điều hướng (Trang gốc) và từ trang này, tôi đẩy một trang nội dung là trang đăng nhập khi tôi hoàn tất với trang đăng nhập của mình, tôi quay lại trang gốc

~~~ Điều hướng có thể được coi như một ngăn xếp cuối cùng vào, ra trước của các đối tượng Trang. Để di chuyển từ trang này sang trang khác, ứng dụng sẽ đẩy một trang mới lên ngăn xếp này. Để quay lại trang trước, ứng dụng sẽ bật trang hiện tại từ ngăn xếp. Điều hướng này trong Xamarin.Forms được xử lý bởi giao diện INavigation

Xamarin.Forms có một lớp NavigationPage triển khai giao diện này và sẽ quản lý chồng các Trang. Lớp NavigationPage cũng sẽ thêm thanh điều hướng vào đầu màn hình hiển thị tiêu đề và cũng sẽ có nút Quay lại phù hợp với nền tảng sẽ trở về trang trước. Đoạn mã sau đây cho thấy cách quấn một Trang điều hướng quanh trang đầu tiên trong một ứng dụng:

Tham khảo nội dung được liệt kê ở trên và liên kết bạn nên xem lại để biết thêm thông tin về Biểu mẫu Xamarin, hãy xem phần Điều hướng:

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);
    }
}

// Đã xóa mã để đơn giản chỉ cửa sổ bật lên được hiển thị

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

2

Điều hướng từ trang này sang trang khác trong Xamarin.forms sử dụng thuộc tính Điều hướng bên dưới mã mẫu

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());
        }

Để điều hướng một trang đến một trang khác với trong ô xem bên dưới mã Xamrian.forms

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

Ví dụ như bên dưới

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);
        }

    }

2

Gọi:

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

Tạo phương thức này bên trong App.xaml.cs:

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

2
In App.Xaml.Cs:

MainPage = new NavigationPage( new YourPage());

Khi bạn muốn điều hướng từ YourPage đến trang tiếp theo, bạn thực hiện:

await Navigation.PushAsync(new YourSecondPage());

Bạn có thể đọc thêm về điều hướng Xamarin Forms tại đây: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/hierarchical

Microsoft có tài liệu khá tốt về điều này.

Ngoài ra còn có khái niệm mới hơn về Shell. Nó cho phép một cách mới để cấu trúc ứng dụng của bạn và đơn giản hóa việc điều hướng trong một số trường hợp.

Giới thiệu: https://devblogs.microsoft.com/xamarin/shell-xamarin-forms-4-0-getting-started/

Video về kiến ​​thức cơ bản về Shell: https://www.youtube.com/watch?v=0y1bUAcOjZY&t=3112s

Tài liệu: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/


0

Trang XAML thêm cái này

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

</ContentPage.ToolbarItems>   

trên trang CS

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

0

Sau khi PushAsyncsử dụng PopAsync(với this) để loại bỏ trang hiện tại.

await Navigation.PushAsync(new YourSecondPage());
this.Navigation.PopAsync(this);

0

Trong Xamarin, chúng tôi có trang được gọi là NavigationPage. Nó chứa chồng các Trang nội dung. NavigationPage có phương thức như PushAsync () và PopAsync (). PushAsync thêm một trang ở đầu ngăn xếp, lúc đó trang đó sẽ trở thành trang hiện đang hoạt động. Phương thức PopAsync () xóa trang khỏi đầu ngăn xếp.

Trong App.Xaml.Cs, chúng ta có thể thiết lập như thế nào.

MainPage = new NavigationPage (Trang YourPage ()) mới;

đang chờ Navigation.PushAsync (new newPage ()); phương thức này sẽ thêm newPage ở đầu ngăn xếp. Lúc này nePage sẽ là trang đang hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.