11

Tôi có trang biểu mẫu xamarin nơi người dùng có thể cập nhật một số dữ liệu trong biểu mẫu. Tôi cần phải đánh chặn nút Navigation Bar Back Clicked để cảnh báo người dùng nếu một số dữ liệu chưa được lưu. Làm thế nào để làm điều đó?Làm cách nào để chặn Nút Quay lại Thanh Điều hướng Nhấp vào Biểu mẫu Xamarin?

Tôi có thể chặn phần cứng Nút quay lại được nhấp vào Android bằng cách sử dụng Android.MainActivity.OnBackPressed(), nhưng sự kiện đó chỉ được nâng lên trên phần cứng Nút Quay lại được nhấp, chứ không phải trên Nút Quay lại Thanh Điều hướng được Nhấp.

Tôi cũng đã cố gắng ghi đè Xamarin.Forms.NavigationPageOnBackButtonPressed() nhưng không hoạt động. Tại sao? Bất kỳ ai đã giải quyết vấn đề đó chưa?

Tôi cũng đã cố gắng bằng cách ghi đè OnDisappear(), có hai vấn đề: "Bạn có chắc chắn"

  1. Trang đã biến mất thị giác nên hộp thoại xuất hiện trên trang trước.
  2. Không thể hủy tác vụ ngược lại.

Vì vậy, có thể chặn nút thanh điều hướng quay lại không?

Trả lời

0

Đây là một nhiệm vụ khó khăn và cách duy nhất tôi có được xung quanh nó là loại bỏ hoàn toàn nút quay lại và sau đó xử lý điều hướng ngược từ nút 'lưu'.

Tôi đã làm một tìm kiếm ngắn gọn của diễn đàn Xamarin.Forms và sau đây đã được đề xuất:

public override bool OnOptionsItemSelected(Android.Views.IMenuItem item) 
{ 
    return false; 
} 

Liên kết cho bài viết như sau:

https://forums.xamarin.com/discussion/21631/is-there-nay-way-of-cancelling-the-back-button-event-from-the-navigationpage

-1

Trong Xamarin .Forms, lớp học Page có phương thức OnBackButtonPressed() mà bạn có thể nhấn vào cho tất cả nền tảng

+1

Điều này không cho bạn biết nút/biểu tượng điều hướng được nhấn hay không - chỉ khi nút quay lại hệ thống được nhấn – noelicus

3

Cách dễ nhất, như @JordanMazurke cũng phần nào đề cập, kể từ khi sự kiện cho nút quay lại không thể được xử lý hiện (trừ nút quay lại vật lý dành cho Android), là một trong hai:

  1. NavigationPage.ShowHasBackButton(this, false)
  2. Đẩy một Modal thay vì một Page

Sau đó, bạn có thể thêm ActionbarItem từ nơi bạn có thể xử lý Event.

Cá nhân tôi đã nói chuyện với nhóm iOS từ Xamarin về vấn đề này và về cơ bản họ đã nói với tôi rằng chúng tôi không nên mong đợi hỗ trợ xử lý Event cho số BackButtonPressed trong số NavigationBar. Lý do là, trên iOS, thực tế không tốt cho người dùng khi nhận được tin nhắn khi nhấn Back.

+0

: (điều này làm tôi buồn. –

7

Tôi có thể hiển thị hộp thoại xác nhận có thể hủy điều hướng bằng cách ghi đè các phương thức sau trong FormsApplicationActivity.

// navigation back button 
    public override bool OnOptionsItemSelected(IMenuItem item) 
    { 
    if (item.ItemId == 16908332) 
    { 
     var currentViewModel = (IViewModel)navigator.CurrentPage.BindingContext; 
     currentViewModel.CanNavigateFromAsync().ContinueWith(t => 
     { 
      if (t.Result) 
      { 
       navigator.PopAsync(); 
      } 
     }, TaskScheduler.FromCurrentSynchronizationContext()); 
     return false; 
    } 
    else 
    { 
     return base.OnOptionsItemSelected(item); 
    } 
    } 

    // hardware back button 
    public async override void OnBackPressed() 
    { 
    var currentViewModel = (IViewModel)navigator.CurrentPage.BindingContext; 

    // could display a confirmation dialog (ex: "Cancel changes?") 
    var canNavigate = await currentViewModel.CanNavigateFromAsync(); 
    if (canNavigate) 
    { 
     base.OnBackPressed(); 
    } 
    } 

Điều hướng.CurrentPage là một trình bao bọc xung quanh dịch vụ INavigation. Tôi không phải hủy điều hướng từ các trang phương thức vì vậy tôi chỉ đang xử lý NavigationStack.

this.navigation.NavigationStack[this.navigation.NavigationStack.Count - 1]; 
0

Như đã nói - bạn không thể làm điều này đa nền tảng. Tuy nhiên, bạn có thể xử lý nó một cách nguyên bản với nhiều nỗ lực không thể tranh cãi được: https://theconfuzedsourcecode.wordpress.com/2017/03/12/lets-override-navigation-bar-back-button-click-in-xamarin-forms/

Bài viết này bao gồm iOS và Android. Nếu bạn có một dự án UWP, bạn sẽ phải tự giải pháp cho nó.

Chỉnh sửa: Đây là giải pháp UWP! Nó thực sự hóa ra là khá dễ dàng - chỉ có một nút quay lại và được hỗ trợ bởi Biểu mẫu, do đó bạn chỉ cần ghi đè OnBackButtonPressed của ContentPage:

protected override bool OnBackButtonPressed() 
    { 
     if (Device.RuntimePlatform.Equals(Device.UWP)) 
     { 
      OnClosePageRequested(); 
      return true; 
     } 
     else 
     { 
      base.OnBackButtonPressed(); 
      return false; 
     } 
    } 

    async void OnClosePageRequested() 
    { 
     var tdvm = (TaskDetailsViewModel)BindingContext; 
     if (tdvm.CanSaveTask()) 
     { 
      var result = await DisplayAlert("Wait", "You have unsaved changes! Are you sure you want to go back?", "Discard changes", "Cancel"); 

      if (result) 
      { 
       tdvm.DiscardChanges(); 
       await Navigation.PopAsync(true); 
      } 
     } 
     else 
     { 
      await Navigation.PopAsync(true); 
     }   
    } 
Các vấn đề liên quan