Xamarin.Forms Kalıcı Sayfalar
Xamarin.Forms kalıcı sayfalar için destek sağlar. Kalıcı bir sayfa, kullanıcıların görev tamamlanana veya iptal edilene kadar kendi kendine gezinilemeyen bir görevi tamamlamalarını teşvik eder. Bu makalede kalıcı sayfalara nasıl gidebileceğiniz gösterilmektedir.
Bu makalede aşağıdaki konular ele alınmaktadır:
- Gezinti gerçekleştirme– sayfaları kalıcı yığına gönderme, kalıcı yığından sayfaları açma, geri düğmesini devre dışı bırakma ve sayfa geçişlerini animasyonlama.
- Gezinirken veri geçirme – verileri bir sayfa oluşturucudan ve üzerinden
BindingContext
geçirme.
Genel bakış
Kalıcı bir sayfa, tarafından Xamarin.Formsdesteklenen Sayfa türlerinden herhangi biri olabilir. Kalıcı bir sayfa görüntülemek için uygulama, aşağıdaki diyagramda gösterildiği gibi kalıcı yığına gönderir ve burada etkin sayfa olur:
Önceki sayfaya dönmek için uygulama geçerli sayfayı kalıcı yığından açar ve aşağıdaki diyagramda gösterildiği gibi en üstteki yeni sayfa etkin sayfa olur:
Gezinti Gerçekleştirme
Kalıcı gezinti yöntemleri, türetilmiş türlerdeki Page
özelliği tarafından Navigation
kullanıma sunulur. Bu yöntemler kalıcı sayfaları kalıcı yığına gönderme ve kalıcı yığından modal sayfaları pop yapma olanağı sağlar.
Navigation
özelliği, kalıcı yığındaki kalıcı sayfaların alınabildiği bir ModalStack
özelliği de kullanıma sunar. Ancak, kalıcı yığın işleme gerçekleştirme veya kalıcı gezintide kök sayfaya giriş yapma kavramı yoktur. Bunun nedeni, bu işlemlerin temel platformlarda evrensel olarak desteklenmemesidir.
Not
NavigationPage
Kalıcı sayfa gezintisi gerçekleştirmek için örnek gerekli değildir.
Sayfaları Kalıcı Yığına Gönderme
öğesine gitmek içinModalPage
, aşağıdaki kod örneğinde gösterildiği gibi geçerli sayfanın özelliğinde yöntemini Navigation
çağırmak PushModalAsync
gerekir:
async void OnItemSelected (object sender, SelectedItemChangedEventArgs e)
{
if (listView.SelectedItem != null) {
var detailPage = new DetailPage ();
...
await Navigation.PushModalAsync (detailPage);
}
}
Bu, örneğin örnekte bir öğenin seçilmesi koşuluyla etkin sayfa haline geldiği kalıcı yığına gönderilmesine ListView
MainPage
neden olurModalPage
. Örnek ModalPage
aşağıdaki ekran görüntülerinde gösterilmiştir:
Çağrıldığında PushModalAsync
aşağıdaki olaylar gerçekleşir:
- Temel alınan platformun
OnDisappearing
Android olmadığı takdirde sayfa çağrısınınPushModalAsync
geçersiz kılması çağrılır. - Gidilmekte
OnAppearing
olan sayfanın geçersiz kılması çağrılır. - Görev
PushAsync
tamamlar.
Ancak, bu olayların tam sırası platforma bağlıdır. Daha fazla bilgi için bkz. Charles Petzold'un Xamarin.Forms kitabının 24. bölümü.
Not
ve OnAppearing
geçersiz kılmalarına yapılan OnDisappearing
çağrılar, sayfa gezintisinin garantili göstergeleri olarak kabul edilemez. Örneğin, iOS'ta, OnDisappearing
uygulama sonlandırıldığında etkin sayfada geçersiz kılma çağrılır.
Kalıcı Yığından Sayfalar Açılan
Etkin sayfa, cihazdaki fiziksel bir düğme veya ekran düğmesi olmasına bakılmaksızın cihazdaki Geri düğmesine basılarak kalıcı yığından çıkarılabilir.
Program aracılığıyla özgün sayfaya ModalPage
dönmek için aşağıdaki kod örneğinde gösterildiği gibi örneğin yöntemini çağırması PopModalAsync
gerekir:
async void OnDismissButtonClicked (object sender, EventArgs args)
{
await Navigation.PopModalAsync ();
}
Bu, örneğin kalıcı yığından kaldırılmasına neden olur ModalPage
ve en üstteki yeni sayfa etkin sayfa olur. Çağrıldığında PopModalAsync
aşağıdaki olaylar gerçekleşir:
- Sayfa çağrısının
PopModalAsync
OnDisappearing
geçersiz kılması çağrılır. - Temel alınan platformun
OnAppearing
Android olmadığı koşuluyla, döndürülmekte olan sayfanın geçersiz kılması çağrılır. - Görev
PopModalAsync
döndürür.
Ancak, bu olayların tam sırası platforma bağlıdır. Daha fazla bilgi için bkz. Charles Petzold'un Xamarin.Forms kitabının 24. bölümü.
Geri Düğmesini Devre Dışı Bırakma
Android'de kullanıcı, cihazdaki standart Geri düğmesine basarak her zaman önceki sayfaya dönebilir. Kalıcı sayfa, kullanıcının sayfadan çıkmadan önce bağımsız bir görevi tamamlamasını gerektiriyorsa, uygulamanın Geri düğmesini devre dışı bırakması gerekir. Bu, kalıcı sayfadaki yöntemi geçersiz kılarak Page.OnBackButtonPressed
gerçekleştirilebilir. Daha fazla bilgi için bkz. Charles Petzold'un Xamarin.Forms kitabının 24. bölümü.
Sayfa Geçişlerini Animasyona Ekleme
Navigation
Her sayfanın özelliği, aşağıdaki kod örneğinde gösterildiği gibi gezinti sırasında sayfa animasyonu görüntülenip görüntülenmeyeceğini denetleyen bir boolean
parametre içeren geçersiz kılınmış gönderme ve pop yöntemleri de sağlar:
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);
}
parametresinin ayarlanarak boolean
false
sayfa geçişi animasyonu devre dışı bırakılırken, parametresinin true
olarak ayarlanması, temel platform tarafından desteklenmesi koşuluyla sayfa geçişi animasyonunu etkinleştirir. Ancak, bu parametreden yoksun gönderme ve pop yöntemleri animasyonu varsayılan olarak etkinleştirir.
Gezinirken Veri Geçirme
Bazen bir sayfanın gezinti sırasında verileri başka bir sayfaya geçirmesi gerekir. Bunu yapmak için iki teknik, verileri bir sayfa oluşturucusunun içinden geçirmek ve yeni sayfaları BindingContext
verilere ayarlamaktır. Her bir konu artık sırayla tartışılacaktır.
Sayfa Oluşturucudan Veri Geçirme
Gezinti sırasında verileri başka bir sayfaya geçirmenin en basit tekniği, aşağıdaki kod örneğinde gösterilen bir sayfa oluşturucu parametresidir:
public App ()
{
MainPage = new MainPage (DateTime.Now.ToString ("u")));
}
Bu kod, geçerli tarih ve saati ISO8601 biçimde geçirerek bir MainPage
örnek oluşturur.
Örnek MainPage
, aşağıdaki kod örneğinde gösterildiği gibi bir oluşturucu parametresi aracılığıyla verileri alır:
public MainPage (string date)
{
InitializeComponent ();
dateLabel.Text = date;
}
Ardından veriler, özelliği ayarlanarak Label.Text
sayfada görüntülenir.
BindingContext aracılığıyla Veri Geçirme
Gezinti sırasında verileri başka bir sayfaya geçirmek için alternatif bir yaklaşım, aşağıdaki kod örneğinde gösterildiği gibi yeni sayfaları BindingContext
verilere ayarlamaktır:
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);
}
}
Bu kod örneğini DetailPage
örneğine Contact
ayarlar BindingContext
ve sonra öğesine DetailPage
gider.
DetailPage
ardından, aşağıdaki XAML kod örneğinde gösterildiği gibi örnek verilerini görüntülemek Contact
için veri bağlamayı kullanır:
<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>
Aşağıdaki kod örneği, C# dilinde veri bağlamanın nasıl gerçekleştirilebileceğini gösterir:
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 ();
}
}
Ardından veriler sayfada bir dizi Label
denetim tarafından görüntülenir.
Veri bağlama hakkında daha fazla bilgi için bkz . Veri Bağlama Temelleri.
Özet
Bu makalede kalıcı sayfalara nasıl gidebileceğiniz gösterilmiştir. Kalıcı bir sayfa, kullanıcıların görev tamamlanana veya iptal edilene kadar kendi kendine gezinilemeyen bir görevi tamamlamalarını teşvik eder.