Xamarin.Forms Strony modalne
Xamarin.Forms Zapewnia obsługę modalnych stron. Modalna strona zachęca użytkowników do ukończenia samodzielnego zadania, z którego nie można przejść do momentu ukończenia lub anulowania zadania. W tym artykule pokazano, jak przejść do modalnych stron.
W tym artykule omówiono następujące zagadnienia:
- Wykonywanie nawigacji — wypychanie stron do modalnego stosu, wyświetlanie wyskakujących stron ze stosu modalnego, wyłączanie przycisku Wstecz i animowanie przejść strony.
- Przekazywanie danych podczas nawigowania — przekazywanie danych przez konstruktor strony i przez element
BindingContext
.
Omówienie
Modalna strona może być dowolnym typem strony obsługiwanym przez Xamarin.Formsusługę . Aby wyświetlić modalną stronę, aplikacja wypchnie ją do stosu modalnego, w którym stanie się aktywna strona, jak pokazano na poniższym diagramie:
Aby powrócić do poprzedniej strony, aplikacja wyświetli bieżącą stronę ze stosu modalnego, a nowa najbardziej górna strona stanie się aktywną stroną, jak pokazano na poniższym diagramie:
Wykonywanie nawigacji
Modalne metody nawigacji są uwidaczniane przez Navigation
właściwość na dowolnych Page
typach pochodnych. Metody te zapewniają możliwość wypychania modalnych stron do modalnego stosu i modalnych stron pop z modalnego stosu.
Właściwość Navigation
uwidacznia ModalStack
również właściwość, z której można uzyskać strony modalne w stosie modalnym. Nie ma jednak pojęcia o wykonywaniu modalnych manipulacji stosem ani pojawiania się na stronie głównej w nawigacji modalnej. Dzieje się tak, ponieważ te operacje nie są powszechnie obsługiwane na platformach bazowych.
Uwaga
Wystąpienie NavigationPage
nie jest wymagane do przeprowadzania modalnego nawigacji po stronie.
Wypychanie stron do stosu modalnego
Aby przejść do ModalPage
metody , należy wywołać metodę PushModalAsync
we Navigation
właściwości bieżącej strony, jak pokazano w poniższym przykładzie kodu:
async void OnItemSelected (object sender, SelectedItemChangedEventArgs e)
{
if (listView.SelectedItem != null) {
var detailPage = new DetailPage ();
...
await Navigation.PushModalAsync (detailPage);
}
}
ModalPage
Powoduje to wypchnięcie wystąpienia do stosu modalnego, w którym staje się aktywną stroną, pod warunkiem, że element został wybrany w ListView
wystąpieniuMainPage
. Wystąpienie ModalPage
zostało pokazane na następujących zrzutach ekranu:
Po PushModalAsync
wywołaniu wystąpią następujące zdarzenia:
- Wywołanie
PushModalAsync
strony maOnDisappearing
wywołaną przesłonięć, pod warunkiem, że podstawowa platforma nie jest systemem Android. - Po przejściu do strony jest wywoływana jego
OnAppearing
przesłonięć. - Zadanie
PushAsync
zostanie ukończone.
Jednak dokładna kolejność występowania tych zdarzeń jest zależna od platformy. Aby uzyskać więcej informacji, zobacz rozdział 24 książki Charlesa Petzolda Xamarin.Forms .
Uwaga
OnDisappearing
Wywołania funkcji i OnAppearing
przesłonięć nie mogą być traktowane jako gwarantowane wskazania nawigacji strony. Na przykład w systemie iOS przesłonięcia są wywoływane na aktywnej stronie po OnDisappearing
zakończeniu działania aplikacji.
Wyświetlanie wyskakujących stron ze stosu modalnego
Aktywną stronę można zwinąć ze stosu modalnego, naciskając przycisk Wstecz na urządzeniu, niezależnie od tego, czy jest to przycisk fizyczny na urządzeniu, czy przycisk na ekranie.
Aby programowo wrócić do oryginalnej strony, ModalPage
wystąpienie musi wywołać metodę PopModalAsync
, jak pokazano w poniższym przykładzie kodu:
async void OnDismissButtonClicked (object sender, EventArgs args)
{
await Navigation.PopModalAsync ();
}
ModalPage
Powoduje to usunięcie wystąpienia ze stosu modalnego, a nowa najbardziej górna strona staje się aktywną stroną. Po PopModalAsync
wywołaniu wystąpią następujące zdarzenia:
- Wywołanie
PopModalAsync
strony ma wywołanąOnDisappearing
przesłonięć. - Zwracana strona ma wywołaną
OnAppearing
przesłonięć, pod warunkiem że podstawowa platforma nie jest systemem Android. - Zadanie
PopModalAsync
zwraca.
Jednak dokładna kolejność występowania tych zdarzeń jest zależna od platformy. Aby uzyskać więcej informacji, zobacz rozdział 24 książki Charlesa Petzolda Xamarin.Forms .
Wyłączanie przycisku Wstecz
W systemie Android użytkownik może zawsze wrócić do poprzedniej strony, naciskając standardowy przycisk Wstecz na urządzeniu. Jeśli strona modalna wymaga od użytkownika wykonania samodzielnego zadania przed opuszczeniem strony, aplikacja musi wyłączyć przycisk Wstecz . Można to osiągnąć, przesłaniając metodę Page.OnBackButtonPressed
na stronie modalnej. Aby uzyskać więcej informacji, zobacz rozdział 24 książki Charlesa Petzolda Xamarin.Forms .
Animowanie przejść strony
Właściwość Navigation
każdej strony udostępnia również zastąpione metody wypychania i wyskakujące, które zawierają boolean
parametr, który kontroluje, czy wyświetlać animację strony podczas nawigacji, jak pokazano w poniższym przykładzie kodu:
async void OnNextPageButtonClicked (object sender, EventArgs e)
{
// Page appearance not animated
await Navigation.PushModalAsync (new DetailPage (), false);
}
async void OnDismissButtonClicked (object sender, EventArgs args)
{
// Page appearance not animated
await Navigation.PopModalAsync (false);
}
Ustawienie parametru boolean
w celu false
wyłączenia animacji przejścia strony, podczas ustawiania parametru w celu true
włączenia animacji przejścia strony, pod warunkiem, że jest obsługiwana przez platformę bazową. Jednak metody wypychania i wyskakujące, które nie mają tego parametru, domyślnie włączają animację.
Przekazywanie danych podczas nawigowania
Czasami konieczne jest przekazanie danych do innej strony podczas nawigacji. Dwie techniki tego celu to przekazywanie danych przez konstruktora strony i ustawienie nowej strony BindingContext
na dane. Każda z nich zostanie omówiona z kolei.
Przekazywanie danych za pośrednictwem konstruktora strony
Najprostszą techniką przekazywania danych do innej strony podczas nawigacji jest użycie parametru konstruktora strony, który jest pokazany w poniższym przykładzie kodu:
public App ()
{
MainPage = new MainPage (DateTime.Now.ToString ("u")));
}
Ten kod tworzy wystąpienie, przekazując bieżącą MainPage
datę i godzinę w formacie ISO8601.
MainPage
Wystąpienie odbiera dane za pośrednictwem parametru konstruktora, jak pokazano w poniższym przykładzie kodu:
public MainPage (string date)
{
InitializeComponent ();
dateLabel.Text = date;
}
Dane są następnie wyświetlane na stronie, ustawiając Label.Text
właściwość .
Przekazywanie danych za pośrednictwem elementu BindingContext
Alternatywną metodą przekazywania danych na inną stronę podczas nawigacji jest ustawienie danych nowej strony BindingContext
, jak pokazano w poniższym przykładzie kodu:
async void OnItemSelected (object sender, SelectedItemChangedEventArgs e)
{
if (listView.SelectedItem != null) {
var detailPage = new DetailPage ();
detailPage.BindingContext = e.SelectedItem as Contact;
listView.SelectedItem = null;
await Navigation.PushModalAsync (detailPage);
}
}
Ten kod ustawia BindingContext
DetailPage
wystąpienie na Contact
wystąpienie, a następnie przechodzi do .DetailPage
Następnie DetailPage
używa powiązania danych do wyświetlania Contact
danych wystąpienia, jak pokazano w poniższym przykładzie kodu XAML:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ModalNavigation.DetailPage">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness">
<On Platform="iOS" Value="0,40,0,0" />
</OnPlatform>
</ContentPage.Padding>
<ContentPage.Content>
<StackLayout HorizontalOptions="Center" VerticalOptions="Center">
<StackLayout Orientation="Horizontal">
<Label Text="Name:" FontSize="Medium" HorizontalOptions="FillAndExpand" />
<Label Text="{Binding Name}" FontSize="Medium" FontAttributes="Bold" />
</StackLayout>
...
<Button x:Name="dismissButton" Text="Dismiss" Clicked="OnDismissButtonClicked" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
W poniższym przykładzie kodu pokazano, jak można wykonać powiązanie danych w języku C#:
public class DetailPageCS : ContentPage
{
public DetailPageCS ()
{
var nameLabel = new Label {
FontSize = Device.GetNamedSize (NamedSize.Medium, typeof(Label)),
FontAttributes = FontAttributes.Bold
};
nameLabel.SetBinding (Label.TextProperty, "Name");
...
var dismissButton = new Button { Text = "Dismiss" };
dismissButton.Clicked += OnDismissButtonClicked;
Thickness padding;
switch (Device.RuntimePlatform)
{
case Device.iOS:
padding = new Thickness(0, 40, 0, 0);
break;
default:
padding = new Thickness();
break;
}
Padding = padding;
Content = new StackLayout {
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center,
Children = {
new StackLayout {
Orientation = StackOrientation.Horizontal,
Children = {
new Label{ Text = "Name:", FontSize = Device.GetNamedSize (NamedSize.Medium, typeof(Label)), HorizontalOptions = LayoutOptions.FillAndExpand },
nameLabel
}
},
...
dismissButton
}
};
}
async void OnDismissButtonClicked (object sender, EventArgs args)
{
await Navigation.PopModalAsync ();
}
}
Dane są następnie wyświetlane na stronie przez serię Label
kontrolek.
Aby uzyskać więcej informacji na temat powiązania danych, zobacz Podstawy powiązań danych.
Podsumowanie
W tym artykule pokazano, jak przejść do modalnych stron. Modalna strona zachęca użytkowników do ukończenia samodzielnego zadania, z którego nie można przejść do momentu ukończenia lub anulowania zadania.