Ajout du code nécessaire
- Ajoutez une interface
INavigationService
public interface INavigationService
{
event Action Action;
NavigationManager Navigation { get; protected set; }
List<string> HistoryUrls { get; protected set; }
void Initialize(NavigationManager navigation);
void NavigateTo(string url);
void NavigateToBack();
bool OnBackButtonPressed();
}
- Ajoutez la classe d'implémentation
NavigationService
public class NavigationService : INavigationService
{
public NavigationManager Navigation { get; set; } = default!;
public event Action? Action;
public void Initialize(NavigationManager navigation)
{
Navigation = navigation;
}
public List<string> HistoryUrls { get; set; } = new List<string>();
public void NavigateTo(string url)
{
var currentUrl = Navigation.ToBaseRelativePath(Navigation.Uri);
HistoryUrls.Add(currentUrl);
Navigation.NavigateTo(url);
}
public void NavigateToBack()
{
if (HistoryUrls.Count > 0)
{
string lastUrl = HistoryUrls.Last();
Navigation.NavigateTo(lastUrl);
HistoryUrls.RemoveAt(HistoryUrls.Count - 1);
}
}
public bool OnBackButtonPressed()
{
if (Action != null && Action?.GetInvocationList().Length > 0)
{
var delegates = Action!.GetInvocationList();
(delegates.Last() as Action)!.Invoke();
return true;
}
if (HistoryUrls.Count > 0)
{
NavigateToBack();
return true;
}
return false;
}
}
- Ajoutez une classe de gestion du bouton retour pour Android, placez-la dans le dossier
Platforms/Androidet ajustez l'espace de noms si nécessaire
using Android.OS;
using Android.Views;
using Android.Widget;
using YourNamespace.IServices;
using Application = Android.App.Application;
namespace YourNamespace.Platforms.Android
{
public static class BackButtonHandler
{
private static byte BackPressCount;
public static bool OnBackButtonPressed(KeyEvent e)
{
if (e.KeyCode == Keycode.Back && e.Action == KeyEventActions.Down)
{
var service = MauiApplication.Current.Services.GetRequiredService<INavigationService>();
bool handled = service!.OnBackButtonPressed();
if (!handled)
{
ExitApp();
}
return true;
}
return false;
}
public static void ExitApp()
{
if (BackPressCount == 1)
{
Process.KillProcess(Process.MyPid());
}
else if (BackPressCount == 0)
{
BackPressCount++;
Toast.MakeText(Application.Context, "Appuyez encore une fois pour quitter", ToastLength.Long).Show();
Task.Run(async () =>
{
await Task.Delay(2000);
BackPressCount = 0;
});
}
}
}
}
- Modifiez
Platforms/Android/MainActivity.cspour ajouter le code suivant
public override bool DispatchKeyEvent(KeyEvent e)
{
var handled = BackButtonHandler.OnBackButtonPressed(e);
if (handled)
{
return true;
}
return base.DispatchKeyEvent(e);
}
- Ajoutez
MainLayout.razor.csdans le dossierShared
public partial class MainLayout
{
[Inject]
NavigationManager Navigation { get; set; } = default!;
[Inject]
INavigationService NavigationService { get; set; } = default!;
protected override void OnInitialized()
{
NavigationService.Initialize(Navigation);
base.OnInitialized();
}
}
- Modifiez
MauiProgram.cspour ajouter le code suivant
builder.Services.AddSingleton<INavigationService, NavigationService>();
Utilisation
Inejctez INavigationService
[Inject]
protected INavigationService NavigationService { get; set; } = default!;
Si vous souhaitez enregistrer l'historique des pages visitées, uitlisez NavigationService.NavigateTo(url). Lorsque vous appelez NavigationService.NavigateToBack() ou appuyez sur le bouton retour d'Android, la page précédente enregistrée sera affichée. Si vous voulez que le bouton retour exécute une méthode spécifique, ajoutez-la à l'événement NavigationService.Action += VotreMethode;. N'oubliez pas de la supprimer de l'événement après son exécution ou lors de la suppression du composant NavigationService.Action -= VotreMethode;