2014-10-22 18 views
6

Tôi đang cố gắng tạo một Ứng dụng với Trang Đăng nhập làm trang đầu tiên.Các hình thức Xamarin Điều hướng và xử lý Trang Đăng nhập

Khi người dùng đăng nhập, các trang đến sau sẽ nằm trong tổ chức ngăn xếp trang chuẩn để tôi có thể dễ dàng sử dụng công cụ xây dựng trong đối tượng Navigation và bao bọc mọi thứ trong trang Điều hướng.

ví dụ:

Login Page -> MainAppPage |-> Category1Page -> Cat1SubPage 
          |-> Category2Page -> Cat2SubPage 

sự hiểu biết của tôi là tôi nên quấn MainAppPage với new NavigationPage(), và sau đó tôi sẽ được tiếp cận với các đối tượng Navigation cho phép tôi làm những việc như thế này:

await this.Navigation.PushAsync(new Category1Page()); 

Và các nền tảng khác nhau sẽ cung cấp cho tôi tự động quay lại nút hỗ trợ để quay trở lại trang trước.

Nhưng tôi không muốn người dùng điều hướng từ LoginPage -> MainAppPage theo cách này, bởi vì tôi không muốn nút quay lại đưa họ trở lại Đăng nhập mà không cần nhấn nút đăng xuất một cách rõ ràng.

Vậy làm cách nào tôi nên xử lý Chuyển đổi trang đầu tiên từ LoginPage -> Trang chính.

Có cách nào khác để có 2 Primary trang và trao đổi giữa chúng không? Hoặc là có một cách để đánh chặn các yêu cầu nút quay lại trên MainAppPage và loại bỏ chúng?

Không tìm một awful nhiều thông tin trong các tài liệu liên quan đến điều này, nhưng nó có vẻ như một yêu cầu khá chuẩn nên có thể PEBKAC

Trả lời

3

tôi có thể nghĩ đến ít nhất là hai giải pháp.

Một cách là tạo một MainAppPage trước và trong trang đó hiển thị Trang đăng nhập dưới dạng Phương thức.

Khác sẽ tạo trang nền tảng cụ thể, tải trang đăng nhập và chỉ khi đăng nhập thành công điều hướng đến MainPage sử dụng điều hướng nền tảng cụ thể (LoginPage phải là NoHistory hoặc một cái gì đó tương tự để tránh quay lại) chứ không phải Điều hướng biểu mẫu (ví dụ: trong Android cả hai trang phải là các hoạt động riêng biệt). Điều này liên quan đến một công việc nhiều hơn một chút kể từ khi bạn phải đối phó với ba nền tảng nhưng nó không nên được nhiều chi phí.

Điều đó nói rằng có điều hướng tốt hơn được cho là sắp tới, hy vọng là 1.3.0.

+0

Cảm ơn Miha, tôi sẽ xem xét tất cả các giải pháp này. cảm kích điều đó. –

0

Đây là những gì tôi đã làm việc trên Android:

protected override void OnCreate (Bundle bundle){ 
    base.OnCreate (bundle); 

    string start = "new"; 
    Bundle extras = Intent.Extras; 
    if (extras != null) { 
     start = extras.GetString ("start"); 
    } 

    if(start == "new"){ 
     SetPage (App.GetLoginPage (OnLoginCompleted)); 
    } else if (start == "login") { 
     SetPage (App.GetMainPage (OnSignOutCompleted)); 
    } 
} 

void OnLoginCompleted(){ 
    // ... 
    var refresh = new Intent (this, typeof(MainActivity)); 
    refresh.PutExtra ("start", "login"); 
    StartActivity (refresh); 
    Finish(); 
} 
void OnSignOutCompleted(){/* mirrors OnLoginCompleted */ } 

Đây là một cách hiệu quả hoạt động với một trang đích cấu hình. Để thay đổi nó, chúng tôi khởi động lại với một thiết lập khác. Đó là một chút chậm hơn so với điều hướng trên điện thoại của tôi nhưng chỉ đáng chú ý.

0

Như Miha Markic nói, một cửa sổ Phương thức là một lựa chọn tốt. Một điều khác bạn cũng có thể xem xét, đặc biệt là nếu bạn muốn trang đăng nhập có cùng một Thanh Điều hướng giống như các trang khác của bạn, sẽ giống như tôi đã đăng trong URL câu hỏi bên dưới.

Về cơ bản, bạn sẽ giữ một tham chiếu đến NavigationPage bạn trong lớp App (cho phép gọi nó là AppNavPage), sau đó, khi hiển thị trang đăng nhập của bạn, bạn đặt trang đăng nhập của bạn trong vòng một riêng biệt NavigationPage và làm một PushAsync() với mới NavigationPage của bạn và trang đăng nhập.

Khi người dùng đăng nhập thành công, bạn chỉ cần thay thế dòng điện MainPage với cũ NavigationPage sử dụng mã này của bạn: Application.Current.MainPage = App.AppNavPage

Kiểm tra các liên kết dưới đây để biết các ví dụ mã tốt hơn.

https://stackoverflow.com/a/32382852/3850012

5

Tôi vừa đăng một mẫu nhanh trên Github cho trường hợp này. Ý tưởng là bạn muốn ban đầu điều hướng đến NavigationPage của bạn, sau đó nếu cần thiết (có nghĩa là người dùng chưa đăng nhập), hãy đẩy LoginPage một cách bình thường. Sau đó, khi đăng nhập thành công, chỉ cần bật LoginPage từ ngăn xếp. Bạn có thể kiểm tra mẫu ở đây, https://github.com/jamesqquick/Xamarin-Forms-Login-Navigation/blob/master/ReadMe.MD

Screenshot from HomePage

+0

Nhưng hãy đảm bảo bạn đặt 'NavigationPage.HasBackButton =" False "' trên trang Đăng nhập của bạn, bởi vì một số nền tảng nhất định sẽ vẫn có nút Quay lại cho phép người dùng điều hướng khỏi phương thức đăng nhập. – DdW

+0

Liên kết chính xác cho mẫu này là https://github.com/jamesqquick/Xamarin-Forms-Login-Navigation/ –

0

Tôi nghĩ rằng cách tốt nhất là nên Tháo LoginPage từ ngăn xếp một khi bạn xác minh đăng nhập, sau đó nó không có sẵn nữa.

async void OnLoginButtonClicked (object sender, EventArgs e) 
{ 
    ... 
    var isValid = AreCredentialsCorrect (user); 
    if (isValid) { 
    App.IsUserLoggedIn = true; 
    Navigation.InsertPageBefore (new MainPage(), this); 
    await Navigation.PopAsync(); 
    } else { 
    // Login failed 
    } 
} 

Với điều kiện là các thông tin của người sử dụng là chính xác, các Mainpage dụ được đưa vào menu ngăn xếp trước khi hiện tại trang. Phương thức PopAsync sau đó xóa trang hiện tại khỏi ngăn xếp điều hướng , với trường hợp MainPage trở thành trang hoạt động.

Xem mô tả đầy đủ here

Các vấn đề liên quan