La soluzione proposta può funzionare correttamente, ma non mi piace "esposizione delle proprietà statiche" per risolvere i problemi. Inoltre, non mi piace l'utilizzo delle soluzioni "proprietà come metodi", soprattutto quando è coinvolta molta logica.
Il problema principale qui è come possiamo gestire il metodo OnBackButton() dalla nostra classe Xamarin.Forms.Application.
Cosa ne pensi di fare la stessa cosa in un modo più elegante?
Per prima cosa è necessario estendere Xamarin.Forms.Classe di applicazione come questa:
namespace YourNameSpace
{
public class Application : Xamarin.Forms.Application
{
#region Public Methods
public bool HandleBackButton()
{
return OnBackPressed();
}
#endregion
#region Application Methods
protected virtual bool OnBackPressed()
{
return false;
}
#endregion
}
}
L'implementazione dell'app ora utilizzerà questa classe come classe base. Ricordarsi di modificare il vostro XAML e le vostre xaml.cs di conseguenza:
<common:Application xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:common="clr-namespace:YourNameSpace"
x:Class="YourNameSpace.App">
</common:Application>
Nell'implementazione App.cs ora è possibile ignorare il metodo OnBackButton().
public partial class App : YourNameSpace.Application
{
#region Constructors
public App()
{
InitializeComponent();
}
#endregion
#region App Methods
protected override bool OnBackPressed()
{
// Handle when the back button is pressed
return false;
}
#endregion
}
Quindi è necessario modificare leggermente l'implementazione della classe Attività.
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
#region Constants and Fields
private App _app;
#endregion
#region Activity Methods
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
_app = new App();
LoadApplication(_app);
}
public override void OnBackPressed()
{
if(!_app.HandleBackButton())
base.OnBackPressed();
}
#endregion
}
Questo non funzionerà, perché sto usando i moduli xamarin, così avrò solo un'attività – Chris