Xamarin.Forms in nativen Xamarin-Projekten
In der Regel enthält eine Xamarin.Forms Anwendung eine oder mehrere Seiten, die von ContentPage
abgeleitet sind, und diese Seiten werden von allen Plattformen in einem .NET Standard-Bibliotheksprojekt oder einem freigegebenen Projekt gemeinsam genutzt. Native Forms ermöglicht ContentPage
jedoch das direkte Hinzufügen von abgeleiteten Seiten zu nativen Xamarin.iOS-, Xamarin.Android- und UWP-Anwendungen. Im Vergleich dazu, dass das native Projekt abgeleitete Seiten aus einem .NET Standard-Bibliotheksprojekt oder einem freigegebenen Projekt verwendet ContentPage
, besteht der Vorteil des direkten Hinzufügens von Seiten zu nativen Projekten darin, dass die Seiten mit nativen Ansichten erweitert werden können. Systemeigene Ansichten können dann in XAML mit x:Name
benannt und vom CodeBehind aus referenziert werden. Weitere Informationen zu nativen Ansichten finden Sie unter Native Ansichten.
Der Prozess zum Verwenden einer Xamarin.FormsContentPage
abgeleiteten Seite in einem nativen Projekt sieht wie folgt aus:
- Fügen Sie dem nativen Projekt das Xamarin.Forms NuGet-Paket hinzu.
- Fügen Sie dem nativen Projekt die
ContentPage
abgeleitete Seite und alle Abhängigkeiten hinzu. - Rufen Sie die
Forms.Init
-Methode auf. - Erstellen Sie eine instance der
ContentPage
abgeleiteten Seite, und konvertieren Sie sie mithilfe einer der folgenden Erweiterungsmethoden in den entsprechenden nativen Typ:CreateViewController
für iOS,CreateSupportFragment
für Android oderCreateFrameworkElement
für UWP. - Navigieren Sie mithilfe der nativen Navigations-API zur nativen Typdarstellung der
ContentPage
abgeleiteten Seite.
Xamarin.Forms muss durch Aufrufen der Forms.Init
-Methode initialisiert werden, bevor ein systemeigenes Projekt eine ContentPage
abgeleitete Seite erstellen kann. Die Entscheidung, wann dies erfolgen soll, hängt in erster Linie davon ab, wann dies in Ihrem Anwendungsfluss am bequemsten ist – er kann beim Anwendungsstart oder kurz vor dem Erstellen der ContentPage
abgeleiteten Seite ausgeführt werden. In diesem Artikel und den zugehörigen Beispielanwendungen wird die Forms.Init
-Methode beim Anwendungsstart aufgerufen.
Hinweis
Die NativeForms-Beispielanwendungslösung enthält keine Xamarin.Forms Projekte. Stattdessen besteht es aus einem Xamarin.iOS-Projekt, einem Xamarin.Android-Projekt und einem UWP-Projekt. Jedes Projekt ist ein natives Projekt, das native Formulare verwendet, um abgeleitete Seiten zu nutzen ContentPage
. Es gibt jedoch keinen Grund, warum die nativen Projekte keine von einem .NET Standard-Bibliotheksprojekt oder einem freigegebenen Projekt abgeleiteten Seiten nutzen ContentPage
konnten.
Bei Verwendung von nativen Formularen Xamarin.Forms funktionieren Funktionen wie DependencyService
, MessagingCenter
und die Datenbindungs-Engine weiterhin. Die Seitennavigation muss jedoch mithilfe der nativen Navigations-API ausgeführt werden.
iOS
Unter iOS ist die FinishedLaunching
Außerkraftsetzung in der Klasse in der AppDelegate
Regel der Ort, an dem Aufgaben im Zusammenhang mit dem Anwendungsstart ausgeführt werden. Sie wird aufgerufen, nachdem die Anwendung gestartet wurde, und wird in der Regel überschrieben, um das Standard Fenster und den Ansichtscontroller zu konfigurieren. Das folgende Codebeispiel zeigt die AppDelegate
-Klasse in der Beispielanwendung:
[Register("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
public static AppDelegate Instance;
UIWindow _window;
AppNavigationController _navigation;
public static string FolderPath { get; private set; }
public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
Forms.Init();
// Create app-level resource dictionary.
Xamarin.Forms.Application.Current = new Xamarin.Forms.Application();
Xamarin.Forms.Application.Current.Resources = new MyDictionary();
Instance = this;
_window = new UIWindow(UIScreen.MainScreen.Bounds);
UINavigationBar.Appearance.SetTitleTextAttributes(new UITextAttributes
{
TextColor = UIColor.Black
});
FolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));
NotesPage notesPage = new NotesPage()
{
// Set the parent so that the app-level resource dictionary can be located.
Parent = Xamarin.Forms.Application.Current
};
UIViewController notesPageController = notesPage.CreateViewController();
notesPageController.Title = "Notes";
_navigation = new AppNavigationController(notesPageController);
_window.RootViewController = _navigation;
_window.MakeKeyAndVisible();
notesPage.Parent = null;
return true;
}
// ...
}
Die Methode FinishedLaunching
führt die folgenden Aufgaben aus:
- Xamarin.Forms wird durch Aufrufen der
Forms.Init
-Methode initialisiert. - Ein neues
Xamarin.Forms.Application
ist -Objekt wird erstellt, und sein Ressourcenverzeichnis auf Anwendungsebene wird auf einResourceDictionary
festgelegt, das in XAML definiert ist. - Im Feld wird ein Verweis auf die
AppDelegate
static
Instance
-Klasse gespeichert. Dadurch wird ein Mechanismus bereitgestellt, mit dem andere Klassen methoden aufrufen können, die in derAppDelegate
-Klasse definiert sind. - Die
UIWindow
, die der Standard Container für Ansichten in nativen iOS-Anwendungen ist, wird erstellt. - Die
FolderPath
-Eigenschaft wird in einen Pfad auf dem Gerät initialisiert, in dem Notizdaten gespeichert werden. - Es
NotesPage
wird ein -Objekt erstellt, bei dem es sich um eine Xamarin.FormsContentPage
in XAML definierte abgeleitete Seite handelt, und das übergeordnete Element wird auf das zuvor erstellteXamarin.Forms.Application
Objekt festgelegt. - Das
NotesPage
-Objekt wird mithilfe derCreateViewController
Erweiterungsmethode in einUIViewController
konvertiert. - Die
Title
-Eigenschaft vonUIViewController
ist festgelegt, die imUINavigationBar
angezeigt wird. - Ein
AppNavigationController
wird für die Verwaltung der hierarchischen Navigation erstellt. Dies ist eine benutzerdefinierte Navigationscontrollerklasse, die vonUINavigationController
abgeleitet wird. DasAppNavigationController
-Objekt verwaltet einen Stapel von Ansichtscontrollern, und dasUIViewController
an den Konstruktor übergebene wird zunächst angezeigt, wenn geladenAppNavigationController
wird. - Das
AppNavigationController
-Objekt wird als oberste EbeneUIViewController
fürUIWindow
festgelegt, und dasUIWindow
wird als Schlüsselfenster für die Anwendung festgelegt und sichtbar gemacht. - Die
Parent
-Eigenschaft desNotesPage
-Objekts wird aufnull
festgelegt, um einen Speicherverlust zu verhindern.
Nachdem die FinishedLaunching
Methode ausgeführt wurde, wird die in der Xamarin.FormsNotesPage
-Klasse definierte Benutzeroberfläche angezeigt, wie im folgenden Screenshot gezeigt:
Wichtig
Alle ContentPage
abgeleiteten Seiten können Ressourcen nutzen, die in der Anwendungsebene ResourceDictionary
definiert sind, vorausgesetzt, dass die Parent
-Eigenschaft der Seite auf das Application
-Objekt festgelegt ist.
Wenn Sie mit der Benutzeroberfläche interagieren, z. B. durch Tippen auf +Button
, wird der folgende Ereignishandler in der NotesPage
CodeBehind-Ausführung ausgeführt:
void OnNoteAddedClicked(object sender, EventArgs e)
{
AppDelegate.Instance.NavigateToNoteEntryPage(new Note());
}
Das static
AppDelegate.Instance
-Feld ermöglicht das Aufrufen der AppDelegate.NavigateToNoteEntryPage
-Methode, was im folgenden Codebeispiel gezeigt wird:
public void NavigateToNoteEntryPage(Note note)
{
NoteEntryPage noteEntryPage = new NoteEntryPage
{
BindingContext = note,
// Set the parent so that the app-level resource dictionary can be located.
Parent = Xamarin.Forms.Application.Current
};
var noteEntryViewController = noteEntryPage.CreateViewController();
noteEntryViewController.Title = "Note Entry";
_navigation.PushViewController(noteEntryViewController, true);
noteEntryPage.Parent = null;
}
Die NavigateToNoteEntryPage
-Methode konvertiert die Xamarin.FormsContentPage
-abgeleitete Seite mit der CreateViewController
Erweiterungsmethode in ein UIViewController
und legt die Title
-Eigenschaft des UIViewController
fest. Die UIViewController
wird dann von der PushViewController
-Methode an AppNavigationController
gepusht. Daher wird die in der Xamarin.FormsNoteEntryPage
-Klasse definierte Benutzeroberfläche angezeigt, wie im folgenden Screenshot gezeigt:
Wenn die NoteEntryPage
angezeigt wird, wird die Zurücknavigation für UIViewController
die NoteEntryPage
-Klasse aus AppNavigationController
der -Klasse auffüllen, wodurch der Benutzer zu der UIViewController
für die NotesPage
Klasse zurückgibt. Das Popping eines UIViewController
aus dem nativen iOS-Navigationsstapel führt jedoch nicht automatisch zum Verwerfen des und des UIViewController
angefügten Page
Objekts. Daher überschreibt die AppNavigationController
-Klasse die PopViewController
-Methode, um Ansichtscontroller bei der Rückwärtsnavigation zu verwerfen:
public class AppNavigationController : UINavigationController
{
//...
public override UIViewController PopViewController(bool animated)
{
UIViewController topView = TopViewController;
if (topView != null)
{
// Dispose of ViewController on back navigation.
topView.Dispose();
}
return base.PopViewController(animated);
}
}
Die PopViewController
-Außerkraftsetzung ruft die Dispose
-Methode für das UIViewController
Objekt auf, das aus dem nativen iOS-Navigationsstapel übertragen wurde. Andernfalls wird das UIViewController
angefügte Page
Objekt und verwaist.
Wichtig
Verwaiste Objekte können nicht mit Garbage Collection erfasst werden, sodass es zu einem Speicherverlust kommen kann.
Android
Unter Android ist die OnCreate
Außerkraftsetzung in der Klasse in der MainActivity
Regel der Ort, um Aufgaben im Zusammenhang mit dem Anwendungsstart auszuführen. Das folgende Codebeispiel zeigt die MainActivity
-Klasse in der Beispielanwendung:
public class MainActivity : AppCompatActivity
{
public static string FolderPath { get; private set; }
public static MainActivity Instance;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
Forms.Init(this, bundle);
// Create app-level resource dictionary.
Xamarin.Forms.Application.Current = new Xamarin.Forms.Application();
Xamarin.Forms.Application.Current.Resources = new MyDictionary();
Instance = this;
SetContentView(Resource.Layout.Main);
var toolbar = FindViewById<Toolbar>(Resource.Id.toolbar);
SetSupportActionBar(toolbar);
SupportActionBar.Title = "Notes";
FolderPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData));
NotesPage notesPage = new NotesPage()
{
// Set the parent so that the app-level resource dictionary can be located.
Parent = Xamarin.Forms.Application.Current
};
AndroidX.Fragment.App.Fragment notesPageFragment = notesPage.CreateSupportFragment(this);
SupportFragmentManager
.BeginTransaction()
.Replace(Resource.Id.fragment_frame_layout, mainPage)
.Commit();
//...
notesPage.Parent = null;
}
...
}
Die Methode OnCreate
führt die folgenden Aufgaben aus:
- Xamarin.Forms wird durch Aufrufen der
Forms.Init
-Methode initialisiert. - Ein neues
Xamarin.Forms.Application
ist -Objekt wird erstellt, und sein Ressourcenverzeichnis auf Anwendungsebene wird auf einResourceDictionary
festgelegt, das in XAML definiert ist. - Im Feld wird ein Verweis auf die
MainActivity
static
Instance
-Klasse gespeichert. Dadurch wird ein Mechanismus bereitgestellt, mit dem andere Klassen methoden aufrufen können, die in derMainActivity
-Klasse definiert sind. - Der
Activity
Inhalt wird aus einer Layoutressource festgelegt. In der Beispielanwendung besteht das Layout aus einemLinearLayout
, das einToolbar
enthält, und ein ,FrameLayout
das als Fragmentcontainer fungiert. - Wird
Toolbar
abgerufen und als Aktionsleiste fürActivity
festgelegt, und der Titel der Aktionsleiste ist festgelegt. - Die
FolderPath
-Eigenschaft wird in einen Pfad auf dem Gerät initialisiert, in dem Notizdaten gespeichert werden. - Es
NotesPage
wird ein -Objekt erstellt, bei dem es sich um eine Xamarin.FormsContentPage
in XAML definierte abgeleitete Seite handelt, und das übergeordnete Element wird auf das zuvor erstellteXamarin.Forms.Application
Objekt festgelegt. - Das
NotesPage
-Objekt wird mithilfe derCreateSupportFragment
Erweiterungsmethode in einFragment
konvertiert. - Die
SupportFragmentManager
-Klasse erstellt und committet eine Transaktion, die dieFrameLayout
instance durch denFragment
für dieNotesPage
-Klasse ersetzt. - Die
Parent
-Eigenschaft desNotesPage
-Objekts wird aufnull
festgelegt, um einen Speicherverlust zu verhindern.
Weitere Informationen zu Fragmenten finden Sie unter Fragmente.
Nachdem die OnCreate
Methode ausgeführt wurde, wird die in der Xamarin.FormsNotesPage
-Klasse definierte Benutzeroberfläche angezeigt, wie im folgenden Screenshot gezeigt:
Wichtig
Alle ContentPage
abgeleiteten Seiten können Ressourcen nutzen, die in der Anwendungsebene ResourceDictionary
definiert sind, vorausgesetzt, dass die Parent
-Eigenschaft der Seite auf das Application
-Objekt festgelegt ist.
Wenn Sie mit der Benutzeroberfläche interagieren, z. B. durch Tippen auf +Button
, wird der folgende Ereignishandler in der NotesPage
CodeBehind-Ausführung ausgeführt:
void OnNoteAddedClicked(object sender, EventArgs e)
{
MainActivity.Instance.NavigateToNoteEntryPage(new Note());
}
Das static
MainActivity.Instance
-Feld ermöglicht das Aufrufen der MainActivity.NavigateToNoteEntryPage
-Methode, was im folgenden Codebeispiel gezeigt wird:
public void NavigateToNoteEntryPage(Note note)
{
NoteEntryPage noteEntryPage = new NoteEntryPage
{
BindingContext = note,
// Set the parent so that the app-level resource dictionary can be located.
Parent = Xamarin.Forms.Application.Current
};
AndroidX.Fragment.App.Fragment noteEntryFragment = noteEntryPage.CreateSupportFragment(this);
SupportFragmentManager
.BeginTransaction()
.AddToBackStack(null)
.Replace(Resource.Id.fragment_frame_layout, noteEntryFragment)
.Commit();
noteEntryPage.Parent = null;
}
Die NavigateToNoteEntryPage
-Methode konvertiert die Xamarin.FormsContentPage
-abgeleitete Seite mit der CreateSupportFragment
Erweiterungsmethode in eine Fragment
und fügt dem Fragmentbackstapel hinzuFragment
. Daher wird die in Xamarin.FormsNoteEntryPage
definierte Benutzeroberfläche angezeigt, wie im folgenden Screenshot gezeigt:
Wenn der NoteEntryPage
angezeigt wird, wird durch Tippen auf den Zurück-Pfeil der für aus NoteEntryPage
Fragment
dem Fragmentbackstapel eingeblendet, und der Benutzer wird zum Fragment
-Element für die NotesPage
-Klasse zurückgegeben.
Aktivieren der Rücknavigationsunterstützung
Die SupportFragmentManager
-Klasse verfügt über ein BackStackChanged
Ereignis, das immer dann ausgelöst wird, wenn sich der Inhalt des Fragmentbackstapels ändert. Die OnCreate
-Methode in der MainActivity
-Klasse enthält einen anonymen Ereignishandler für dieses Ereignis:
SupportFragmentManager.BackStackChanged += (sender, e) =>
{
bool hasBack = SupportFragmentManager.BackStackEntryCount > 0;
SupportActionBar.SetHomeButtonEnabled(hasBack);
SupportActionBar.SetDisplayHomeAsUpEnabled(hasBack);
SupportActionBar.Title = hasBack ? "Note Entry" : "Notes";
};
Dieser Ereignishandler zeigt eine Zurück-Schaltfläche auf der Aktionsleiste an, vorausgesetzt, es gibt eine oder Fragment
mehrere Instanzen im Fragmentbackstapel. Die Antwort auf das Tippen auf die Zurück-Schaltfläche wird von der OnOptionsItemSelected
Überschreibung behandelt:
public override bool OnOptionsItemSelected(Android.Views.IMenuItem item)
{
if (item.ItemId == global::Android.Resource.Id.Home && SupportFragmentManager.BackStackEntryCount > 0)
{
SupportFragmentManager.PopBackStack();
return true;
}
return base.OnOptionsItemSelected(item);
}
Die OnOptionsItemSelected
Außerkraftsetzung wird immer dann aufgerufen, wenn ein Element im Optionsmenü ausgewählt wird. Diese Implementierung füllt das aktuelle Fragment aus dem Zurück-Fragmentstapel ein, vorausgesetzt, dass die Schaltfläche Zurück ausgewählt wurde und eine oder Fragment
mehrere Instanzen im Fragmentbackstapel vorhanden sind.
Mehrere Aktivitäten
Wenn eine Anwendung aus mehreren Aktivitäten besteht, ContentPage
können abgeleitete Seiten in jede der Aktivitäten eingebettet werden. In diesem Szenario muss die Forms.Init
-Methode nur in der OnCreate
Überschreibung der ersten Activity
aufgerufen werden, die eine Xamarin.FormsContentPage
einbettet. Dies hat jedoch folgende Auswirkungen:
- Der Wert von
Xamarin.Forms.Color.Accent
wird von der übernommen, dieActivity
dieForms.Init
-Methode aufgerufen hat. - Der Wert von
Xamarin.Forms.Application.Current
wird dem zugeordnet, dasActivity
dieForms.Init
-Methode aufgerufen hat.
Datei auswählen
Beim Einbetten einer ContentPage
-abgeleiteten Seite, die eine WebView
verwendet, die eine HTML-Schaltfläche "Datei auswählen" unterstützen muss, muss die Activity
OnActivityResult
-Methode überschrieben werden:
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
ActivityResultCallbackRegistry.InvokeCallback(requestCode, resultCode, data);
}
UWP
In UWP ist die native App
Klasse in der Regel der Ort, um Aufgaben im Zusammenhang mit dem Anwendungsstart auszuführen. Xamarin.Forms wird normalerweise in Xamarin.Forms UWP-Anwendungen in der OnLaunched
Überschreibung in der nativen App
Klasse initialisiert, um das LaunchActivatedEventArgs
Argument an die Forms.Init
-Methode zu übergeben. Aus diesem Grund können native UWP-Anwendungen, die eine Xamarin.FormsContentPage
abgeleitete Seite nutzen, die Methode am einfachsten von der Forms.Init
App.OnLaunched
-Methode aufrufen:
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
// ...
Xamarin.Forms.Forms.Init(e);
// Create app-level resource dictionary.
Xamarin.Forms.Application.Current = new Xamarin.Forms.Application();
Xamarin.Forms.Application.Current.Resources = new MyDictionary();
// ...
}
Darüber hinaus kann die OnLaunched
-Methode auch ein beliebiges Ressourcenwörterbuch auf Anwendungsebene erstellen, das von der Anwendung benötigt wird.
Standardmäßig startet die native App
Klasse die MainPage
-Klasse als erste Seite der Anwendung. Das folgende Codebeispiel zeigt die MainPage
-Klasse in der Beispielanwendung:
public sealed partial class MainPage : Page
{
NotesPage notesPage;
NoteEntryPage noteEntryPage;
public static MainPage Instance;
public static string FolderPath { get; private set; }
public MainPage()
{
this.NavigationCacheMode = NavigationCacheMode.Enabled;
Instance = this;
FolderPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData));
notesPage = new Notes.UWP.Views.NotesPage
{
// Set the parent so that the app-level resource dictionary can be located.
Parent = Xamarin.Forms.Application.Current
};
this.Content = notesPage.CreateFrameworkElement();
// ...
notesPage.Parent = null;
}
// ...
}
Der MainPage
Konstruktor führt die folgenden Aufgaben aus:
- Die Zwischenspeicherung ist für die Seite aktiviert, sodass kein neues
MainPage
erstellt wird, wenn ein Benutzer zurück zur Seite navigiert. - Im Feld wird ein Verweis auf die
MainPage
static
Instance
-Klasse gespeichert. Dadurch wird ein Mechanismus für andere Klassen bereitgestellt, um in derMainPage
-Klasse definierte Methoden aufzurufen. - Die
FolderPath
-Eigenschaft wird in einen Pfad auf dem Gerät initialisiert, auf dem Notizdaten gespeichert werden. - Es
NotesPage
wird ein Objekt erstellt, bei dem es sich um eine Xamarin.FormsContentPage
in XAML definierte abgeleitete Seite handelt, und das übergeordnete Objekt wird auf das zuvor erstellteXamarin.Forms.Application
Objekt festgelegt. - Das
NotesPage
Objekt wird mithilfe derCreateFrameworkElement
Erweiterungsmethode in einFrameworkElement
konvertiert und dann als Inhalt derMainPage
Klasse festgelegt. - Die
Parent
-Eigenschaft desNotesPage
-Objekts ist aufnull
festgelegt, um einen Speicherverlust zu verhindern.
Nachdem der MainPage
Konstruktor ausgeführt wurde, wird die in der Xamarin.FormsNotesPage
-Klasse definierte Benutzeroberfläche angezeigt, wie im folgenden Screenshot gezeigt:
Wichtig
Alle ContentPage
abgeleiteten Seiten können Ressourcen nutzen, die in der Anwendungsebene ResourceDictionary
definiert sind, vorausgesetzt, die Parent
Eigenschaft der Seite ist auf das Application
-Objekt festgelegt.
Wenn Sie mit der Benutzeroberfläche interagieren, z. B. durch Tippen auf +Button
, wird der folgende Ereignishandler in der NotesPage
CodeBehind-Ausführung ausgeführt:
void OnNoteAddedClicked(object sender, EventArgs e)
{
MainPage.Instance.NavigateToNoteEntryPage(new Note());
}
Das static
MainPage.Instance
Feld ermöglicht das Aufrufen der MainPage.NavigateToNoteEntryPage
-Methode, was im folgenden Codebeispiel gezeigt wird:
public void NavigateToNoteEntryPage(Note note)
{
noteEntryPage = new Notes.UWP.Views.NoteEntryPage
{
BindingContext = note,
// Set the parent so that the app-level resource dictionary can be located.
Parent = Xamarin.Forms.Application.Current
};
this.Frame.Navigate(noteEntryPage);
noteEntryPage.Parent = null;
}
Die Navigation in UWP wird in der Regel mit der Frame.Navigate
-Methode ausgeführt, die ein Page
Argument akzeptiert. Xamarin.Formsdefiniert eine Frame.Navigate
Erweiterungsmethode, die eine ContentPage
abgeleitete Seite instance. Wenn die NavigateToNoteEntryPage
Methode ausgeführt wird, wird daher die in Xamarin.FormsNoteEntryPage
definierte Benutzeroberfläche angezeigt, wie im folgenden Screenshot gezeigt:
Wenn der NoteEntryPage
angezeigt wird, wird durch Tippen auf den Zurück-Pfeil das für den NoteEntryPage
FrameworkElement
aus dem In-App-Back-Stapel angezeigt, wodurch der Benutzer zu der FrameworkElement
für die NotesPage
-Klasse zurückgibt.
Aktivieren der Unterstützung für Die Seitengrößesänderung
Wenn die Größe des UWP-Anwendungsfensters geändert wird, sollte auch die Größe des Xamarin.Forms Inhalts geändert werden. Dies wird durch Registrieren eines Ereignishandlers für das Loaded
Ereignis im MainPage
Konstruktor erreicht:
public MainPage()
{
// ...
this.Loaded += OnMainPageLoaded;
// ...
}
Das Loaded
Ereignis wird ausgelöst, wenn die Seite angelegt, gerendert und für die Interaktion bereit ist, und führt die OnMainPageLoaded
-Methode als Antwort aus:
void OnMainPageLoaded(object sender, RoutedEventArgs e)
{
this.Frame.SizeChanged += (o, args) =>
{
if (noteEntryPage != null)
noteEntryPage.Layout(new Xamarin.Forms.Rectangle(0, 0, args.NewSize.Width, args.NewSize.Height));
else
notesPage.Layout(new Xamarin.Forms.Rectangle(0, 0, args.NewSize.Width, args.NewSize.Height));
};
}
Die OnMainPageLoaded
-Methode registriert einen anonymen Ereignishandler für das -Ereignis, das Frame.SizeChanged
ausgelöst wird, wenn sich entweder die ActualHeight
-Eigenschaft oder die ActualWidth
-Eigenschaft für ändern Frame
. Als Reaktion wird die Größe des Xamarin.Forms Inhalts für die aktive Seite geändert, indem die Layout
-Methode aufgerufen wird.
Aktivieren der Rücknavigationsunterstützung
Auf UWP müssen Anwendungen die Zurücknavigation für alle Hardware- und Softwarerückschaltflächen für verschiedene Geräteformfaktoren aktivieren. Dies kann erreicht werden, indem Sie einen Ereignishandler für das BackRequested
Ereignis registrieren, das im MainPage
Konstruktor ausgeführt werden kann:
public MainPage()
{
// ...
SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
}
Wenn die Anwendung gestartet wird, ruft die GetForCurrentView
-Methode das SystemNavigationManager
der aktuellen Ansicht zugeordnete Objekt ab und registriert dann einen Ereignishandler für das BackRequested
Ereignis. Die Anwendung empfängt dieses Ereignis nur, wenn es sich um die Vordergrundanwendung handelt, und ruft als Antwort den OnBackRequested
Ereignishandler auf:
void OnBackRequested(object sender, BackRequestedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame.CanGoBack)
{
e.Handled = true;
rootFrame.GoBack();
noteEntryPage = null;
}
}
Der OnBackRequested
Ereignishandler ruft die GoBack
-Methode im Stammframe der Anwendung auf und legt die BackRequestedEventArgs.Handled
-Eigenschaft auf fest, um true
das Ereignis als behandelt zu markieren. Wenn das Ereignis nicht als behandelt markiert wird, kann dies dazu führen, dass das Ereignis ignoriert wird.
Die Anwendung wählt aus, ob eine Zurück-Schaltfläche auf der Titelleiste angezeigt werden soll. Dies wird erreicht, indem die AppViewBackButtonVisibility
-Eigenschaft auf einen der AppViewBackButtonVisibility
Enumerationswerte in der App
-Klasse festgelegt wird:
void OnNavigated(object sender, NavigationEventArgs e)
{
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
((Frame)sender).CanGoBack ? AppViewBackButtonVisibility.Visible : AppViewBackButtonVisibility.Collapsed;
}
Der OnNavigated
Ereignishandler, der als Reaktion auf das Auslösen des Navigated
Ereignisses ausgeführt wird, aktualisiert die Sichtbarkeit der Schaltfläche "Zurück" in der Titelleiste, wenn die Seitennavigation erfolgt. Dadurch wird sichergestellt, dass die Schaltfläche "Zurück" in der Titelleiste sichtbar ist, wenn der In-App-Back-Stapel nicht leer ist, oder aus der Titelleiste entfernt wird, wenn der In-App-Back-Stapel leer ist.
Weitere Informationen zur Unterstützung der Backnavigation in UWP finden Sie unter Navigationsverlauf und Rückwärtsnavigation für UWP-Apps.