Aracılığıyla paylaş


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 BindingContextgeç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:

Bir Sayfayı Kalıcı Yığına Gönderme

Ö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:

Kalıcı Yığından Sayfa Açma

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 ListViewMainPage neden olurModalPage. Örnek ModalPage aşağıdaki ekran görüntülerinde gösterilmiştir:

Kalıcı Sayfa Örneği

Ç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ın PushModalAsync 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 PopModalAsyncOnDisappearing 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 booleanfalse 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 DetailPagegider.

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.