2017-02-01 10 views
0

私は ViewListがリフレッシュされたとき、私はナビゲーションバーのボタンをバック無効にするにはどうすればよい、Xamairn.Formsを使用しています。Xamarin.Forms

実は、私はデフォルトの[戻る]ボタンを無効にするには、次のコードを使用していますが、今の私はボタンを私が戻る無効にすることができますどのように

protected override bool OnBackButtonPressed() 
    { 
    if (ListView.IsRefreshing) 
     return true; 
     return false; 
    } 

任意のアイデアをナビゲーションバーをバック無効にすることも離れて見つけようとしていますボタンナビゲーションバーに?

+1

バックボタンを無効にすると、アプリが反応しないと感じるようになります。代わりに、現在の方法が正しいです。メッセージを表示するToastメッセージを提供してください。または、円の進捗状況を表示して、ユーザーがアプリがビジーであることを知ることができます。 –

+0

実際には、リストビューのインジケータは、リフレッシュ中に機能していますが、何らかの理由でユーザーが押し返す場合、リストビューがリフレッシュされているときにのみ検索を停止します。 –

答えて

2

全体的なAndroidとiOSにはナビゲーションバーの戻るボタンが非常に良い理由で実行されないようにするためのAPIはありません。ユーザーは元に戻ることができると予想しています。

代わりに、ナビゲーションバーを完全に作成または非表示にし、独自のボタンで独自のバーを作成できるようにするオプションだけをユーザーに与えてデザインを変更する必要があります。

Adam's guideは、この問題に直面したときに私が見つけたと思っていたであろう被験者の素晴らしい見解を提供します。 Androidでは

彼は私がちょうどやっただけでなく、あなたが(次のコードは、上記のリンク先の記事からほとんど変わらず持ち上げて)あなたのデザインを変更することを拒否した場合に戻ってナビゲート防ぐことが非常にハック方法を提供し、同じ事を示唆します戻るボタンを探して、ContentPageのViewModelメソッドを使用して、戻ることを許可するかどうかを調べることができます。独自のカスタム1のための本当の戻るボタンスイッチアウトするためのカスタムレンダラを必要 iOSでは

public override bool OnOptionsItemSelected(IMenuItem item) { 
    var app = Application.Current; 

    if (item.ItemId == 16908332) { // This makes me feel dirty. 
     var navPage = ((app.MainPage.Navigation.ModalStack[0] as MasterDetailPage).Detail as NavigationPage); // Notice this code assumes it is looking for a MasterDetailPage being shown as a modal 

     if (app != null && navPage.Navigation.NavigationStack.Count > 0) { 
      int index = navPage.Navigation.NavigationStack.Count - 1; 

      var currentPage = navPage.Navigation.NavigationStack[index]; 

      var vm = currentPage.BindingContext as ViewModel; //You would want to cast this to a base ViewModel or a specific one so that OnBackButtonPressed() can be called 

      if (vm != null) { 
       var answer = vm.OnBackButtonPressed(); 
       if (answer) { 
        return true; 
       } 
      } 
     } 
    } 

    return base.OnOptionsItemSelected(item); 
} 

:あなたはMainActivityOnOptionsItemSelectedを上書きするのWindows Phone

[assembly: ExportRenderer(typeof(Page), typeof(CustomPageRenderer))] 
namespace Mobile.iOS.CustomRenderer { 
    public class CustomPageRenderer : PageRenderer { 

     public override void ViewWillAppear(bool animated) { 
      base.ViewWillAppear(animated); 

      var page = Element as CorePage; 

      if (page != null) { 
       if ((page).OverrideBackButton) { 
        var root = this.NavigationController.TopViewController; 
        // NOTE: this doesn't look exactly right, you need to create an image to replicate the back arrow properly 
        root.NavigationItem.SetLeftBarButtonItem(new UIBarButtonItem("< Back", UIBarButtonItemStyle.Plain, (sender, args) => { 
         var navPage = page.Parent as NavigationPage; 
         var vm = page.BindingContext as ViewModel; 

         if (vm != null) { 
          var answer = vm.OnBackButtonPressed(); 

          if (!answer) 
           navPage.PopAsync(); 
         } else { 
          navPage.PopAsync(); 
         } 
        }), true); 
       } 
      }  
     } 
    } 
} 

を..ちょうどOnBackButtonPressedを無効にする... WPとの作業は実際に一度簡単です。