Próbowałem użyć nawigacji wstecznej przez przesłonięcie OnBackButtonPressed
, ale jakoś nie został w ogóle wywołany. Korzystam z wersji ContentPage
i najnowszej wersji 1.4.2.Jak obsługiwać/anulować nawigację zwrotną w formularzach Xamarin
Odpowiedz
porządku, afte Przez wiele godzin to wymyśliłem. Istnieją trzy części tego.
# 1 Obsługa tylnego przycisku sprzętowego na Androidzie. Ta jest łatwa, nadpisz OnBackButtonPressed. Pamiętaj, że jest to tylko dla przycisku powrotu sprzętu i tylko dla Androida. Nie obsłuży przycisku wstecz paska nawigacji. Jak widać, starałem się z powrotem przez przeglądarkę przed wycofania się strony, ale można umieścić cokolwiek logika trzeba w.
protected override bool OnBackButtonPressed()
{
if (_browser.CanGoBack)
{
_browser.GoBack();
return true;
}
else
{
//await Navigation.PopAsync(true);
base.OnBackButtonPressed();
return true;
}
}
# 2 iOS nawigacji przycisk Wstecz. Ten był naprawdę trudny, jeśli rozejrzysz się po Internecie, znajdziesz kilka przykładów zastąpienia przycisku wstecz nowym przyciskiem niestandardowym, ale prawie niemożliwe jest sprawienie, by wyglądał jak inne strony. W tym przypadku zrobiłem przezroczysty przycisk, który znajduje się nad normalnym przyciskiem.
[assembly: ExportRenderer(typeof(MyAdvantagePage), typeof
(MyAdvantagePageRenderer))]
namespace Advantage.MyAdvantage.MobileApp.iOS.Renderers
{
public class MyAdvantagePageRenderer : Xamarin.Forms.Platform.iOS.PageRenderer
{
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
if (((MyAdvantagePage)Element).EnableBackButtonOverride)
{
SetCustomBackButton();
}
}
private void SetCustomBackButton()
{
UIButton btn = new UIButton();
btn.Frame = new CGRect(0, 0, 50, 40);
btn.BackgroundColor = UIColor.Clear;
btn.TouchDown += (sender, e) =>
{
// Whatever your custom back button click handling
if (((MyAdvantagePage)Element)?.
CustomBackButtonAction != null)
{
((MyAdvantagePage)Element)?.
CustomBackButtonAction.Invoke();
}
};
NavigationController.NavigationBar.AddSubview(btn);
}
}
}
Android, jest podchwytliwy.W starszych wersjach i przyszłymi wersjami Form raz rozwiązany, można po prostu zastąpić OnOptionsItemselected jak ten
public override bool OnOptionsItemSelected(IMenuItem item)
{
// check if the current item id
// is equals to the back button id
if (item.ItemId == 16908332)
{
// retrieve the current xamarin forms page instance
var currentpage = (MyAdvantagePage)
Xamarin.Forms.Application.
Current.MainPage.Navigation.
NavigationStack.LastOrDefault();
// check if the page has subscribed to
// the custom back button event
if (currentpage?.CustomBackButtonAction != null)
{
// invoke the Custom back button action
currentpage?.CustomBackButtonAction.Invoke();
// and disable the default back button action
return false;
}
// if its not subscribed then go ahead
// with the default back button action
return base.OnOptionsItemSelected(item);
}
else
{
// since its not the back button
//click, pass the event to the base
return base.OnOptionsItemSelected(item);
}
}
Jednakże, jeśli używasz FormsAppCompatActivity, to trzeba dodać na swojej onCreate w główną działalność to ustawić pasek narzędzi:
Android.Support.V7.Widget.Toolbar toolbar = this.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
SetSupportActionBar(toolbar);
Ale czekaj! Jeśli masz zbyt starą wersję .Forms lub zbyt nową wersję, pojawi się błąd, w którym pasek narzędzi ma wartość null. Jeśli tak się stanie, zhakowane razem sposób, w jaki udało mi się to zrobić, aby dotrzymać terminu jest właśnie taki. W OnCreate
w MainActivity
:
MobileApp.Pages.Articles.ArticleDetail.androdAction =() =>
{
Android.Support.V7.Widget.Toolbar toolbar = this.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
SetSupportActionBar(toolbar);
};
ArticleDetail jest strona, a androidAction jest Action
że biegnę na OnAppearing jeśli Platforma Android jest na mojej stronie. W tym momencie w aplikacji pasek narzędzi przestanie być pusty.
Jeszcze kilka kroków, a rendering na iOS, który stworzyliśmy powyżej, wykorzystuje właściwości, które należy dodać do strony, na której renderujesz renderer. Robiłem to dla mojej klasy MyAdvantagePage
, którą stworzyłem, która implementuje ContentPage. Więc w moim MyAdvantagePage
klasy I dodaje
public Action CustomBackButtonAction { get; set; }
public static readonly BindableProperty EnableBackButtonOverrideProperty =
BindableProperty.Create(
nameof(EnableBackButtonOverride),
typeof(bool),
typeof(MyAdvantagePage),
false);
/// <summary>
/// Gets or Sets Custom Back button overriding state
/// </summary>
public bool EnableBackButtonOverride
{
get
{
return (bool)GetValue(EnableBackButtonOverrideProperty);
}
set
{
SetValue(EnableBackButtonOverrideProperty, value);
}
}
Teraz, że wszystko jest zrobione, na żadnym z moich MyAdvantagePage
mogę dodać tego
:
this.EnableBackButtonOverride = true;
this.CustomBackButtonAction = async() =>
{
if (_browser.CanGoBack)
{
_browser.GoBack();
}
else
{
await Navigation.PopAsync(true);
}
};
To powinno być wszystko, aby zmusić go do pracy na Android sprzęt z powrotem i nawigacja wstecz dla systemu Android i iOS.
A więc ... okazuje się, że masz TabbedPage i używasz mojego strasznego hacka, aby obejść błąd Xamarin.Forms, że przechwytuje tylko przycisk Wstecz na przycisku wstecz na pierwszej stronie Najwyraźniej tylne przyciski na innych stronach są inne ...? Czy ktoś ma poprawkę dla wszystkich kart? – Kyle
wydaje się nie działać na stronie MasterDetail ... – Alex
Masz rację, w swojej klasie strony zastąpić OnBackButtonPressed
i wrócić true
, jeśli chcesz zapobiec nawigacji. Działa to dobrze dla mnie i mam tę samą wersję.
protected override bool OnBackButtonPressed()
{
if (Condition)
return true;
return base.OnBackButtonPressed();
}
Wygląda na to, że w Xamarin Forms jest błąd, który mówi, że jeśli użyję TabbedPage jako strony głównej, to OnBackButtonPressed nie zostanie wywołany. Powiedziano mi, że facet wydaje się pochodzić z Xamarin – imgen
Jak uzyskać stronę, do której prowadzi nawigacja? –
[Dokumenty] (https://developer.xamarin.com/api/member/Xamarin.Forms.NavigationPage.OnBackButtonPressed() /) mówią "To zdarzenie nie jest wywoływane w systemie iOS". –
W zależności od tego, co dokładnie szukasz (nie polecam za pomocą tego, czy chcesz po prostu zrezygnować z powrotem przycisk nawigacyjny), OnDisappearing
może być inna opcja:
protected override void OnDisappearing()
{
//back button logic here
}
Kiedy próbowałem przez zastąpienie OnDisappear są dwa problemy: 1. Strona już zniknęła, więc "Czy jesteś pewien?" pojawi się okno dialogowe na poprzedniej stronie. 2. Nie można anulować działania wstecz. – Amrut
[tutaj] (https://forums.xamarin.com/discussion/21631/is-there-nay-way-cancelling-the-back-button-event-from-the-navigationpage) to rozwiązania specyficzne dla platformy –
Funkcja OnDisappearing jest również wywoływana po zablokowaniu ekranu telefonu lub po przejściu do innej aplikacji. nie tylko przy przejściu do poprzedniej strony – batmaci
protected override bool OnBackButtonPressed()
{
base.OnBackButtonPressed();
return true;
}
base.OnBackButtonPressed() returns false on click of hardware back button.
In order to prevent operation of back button or prevent navigation to previous page. the overriding function should be returned as true. On return true, it stays on the current xamarin form page and state of page is also maintained.
OnBackButtonPressed() będzie to wywoływane, gdy zostanie naciśnięty przycisk powrotu sprzętu, tak jak w Androidzie. To nie zadziała na przycisku powrotu oprogramowania, jak w ios.
Dla każdego, kto wciąż walczy z tym problemem - zasadniczo nie można przechwytywać wstecznej między platformami nawigacyjnymi. Mimo, że istnieją dwa podejścia, które skutecznie rozwiązać problem:
ukryć przycisk NavigationPage z powrotem
NavigationPage.ShowHasBackButton(this, false)
i popychają stronę modalne, który ma zwyczaj Back/Cancel/przycisk ZamknijIntercept tył nawigacja natywnie dla każdej platformy. To jest dobry artykuł, który robi to dla iOS i Androida: https://theconfuzedsourcecode.wordpress.com/2017/03/12/lets-override-navigation-bar-back-button-click-in-xamarin-forms/
Dla UWP jesteś na własną rękę :)
Edit:
Cóż, już nie, ponieważ to zrobiłem :) faktycznie okazało się całkiem proste - jest tylko jeden przycisk z powrotem i jest obsługiwany przez form więc po prostu trzeba zastąpić ContentPage za OnBackButtonPressed:
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);
}
}
- 1. Jak nakładają się w formularzach Xamarin?
- 2. Jak utworzyć pole wyboru w formularzach xamarin
- 3. Element paska narzędzi niewidoczny w formularzach Xamarin
- 4. Jak zmienić kolory TabBar i NavigationBar w formularzach Xamarin?
- 5. Jak ustawić górne dopełnienie wpisu w formularzach Xamarin
- 6. Wyskakujące okienko dialogowe z wprowadzaniem tekstu w formularzach Xamarin
- 7. Ustawienie Frame.BackgroundColor traci zaokrąglone narożniki w formularzach Xamarin
- 8. Jak wygenerować nawigację w Middleman?
- 9. Zależności w formularzach Symfony2
- 10. Jak przesłać plik w formularzach okien?
- 11. Jak dodać pole autouzupełniania w formularzach Symfony2?
- 12. Jak wykluczyć foldery w formularzach kontroli żółwia
- 13. Jak używać niestandardowych szablonów w formularzach szkieletowych?
- 14. Jak uzyskać wartość zwracana przez funkcję zwrotną
- 15. redis jak ograniczyć liczbę zwrotną polecenia KEYS?
- 16. Jak uzyskać informację zwrotną dotykową z RecyclerView?
- 17. Wyświetl obraz w formularzach okienkowych
- 18. Jak połączyć TabBar + Nawigację z XCode
- 19. Powiąż zmienne z funkcją zwrotną
- 20. Rails ActiveAdmin - pobierz current_admin_user w nawigację narzędzia?
- 21. Jak zakończyć aplikację Xamarin?
- 22. Jak zdefiniować atrybuty na formularzach. Modelodbroj.pl?
- 23. Jak uruchomić funkcję zwrotną w wyzwalaczu jQuery ("kliknij")?
- 24. W Firemonkey, jak przekazać informację zwrotną dla użytkownika? (CrHourglass)
- 25. Jak powiązać funkcję zwrotną w przypadku pełnego przeładowania jstree?
- 26. OnBackPressed w Xamarin Androida
- 27. Xamarin Forms Picker Element binding wiązania w Xaml
- 28. Wyłącz nawigację klawiaturową w Google Map
- 29. Jak ręcznie dodawać błędy w formularzach w strukturze play 2
- 30. How to HTML.Encode w formularzach internetowych
Wydaje mi się, że wydarzenie jest przeznaczone specjalnie dla przycisku wstecznego sprzętu Android, a nie dla ogólnych wydarzeń nawigacyjnych "wstecz". – Jason
Wiem. Próbowałem na systemie Android i przycisk powrotu sprzętu, ale nie otrzymałem nazwy – imgen