Aracılığıyla paylaş


.NET MAUI Shell navigasyonu

Örneğe göz atın. Örneğe göz atın

.NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) Kabuğu, belirli bir gezinti hiyerarşisini izlemek zorunda kalmadan uygulamadaki herhangi bir sayfaya gitmek için yolları kullanan URI tabanlı bir gezinti deneyimi içerir. Buna ek olarak, gezinti yığınındaki tüm sayfaları ziyaret etmek zorunda kalmadan geriye doğru gezinme olanağı da sağlar.

Shell sınıfı, gezintiyle ilgili aşağıdaki özellikleri tanımlar:

  • BackButtonBehavior, türünde BackButtonBehavior, geri tuşunun davranışını tanımlayan bir ek özelliktir.
  • CurrentItem, türüne ShellItemgöre seçili durumdaki öğedir.
  • CurrentPage, Page türündeki şu anda sunulan sayfadır.
  • CurrentState, ShellNavigationState türündeki, Shell geçerli gezinti durumu.
  • Current, türündeki Shell, geçerli Shell'e erişim sağlar.

BackButtonBehavior, CurrentItemve CurrentState özellikleri nesneler tarafından BindableProperty desteklenir; bu da bu özelliklerin veri bağlamalarının hedefleri olabileceği anlamına gelir.

Gezinti, GoToAsync sınıfından Shell yöntemi çağrılarak gerçekleştirilir. Gezinti gerçekleştirilmek üzereyken Navigating olayı tetiklenir ve gezinti tamamlandığında Navigated olayı tetiklenir.

Not

Özelliği kullanılarak Navigation bir Shell uygulamasındaki sayfalar arasında gezinti yine de gerçekleştirilebilir. Daha fazla bilgi için Modsuz gezinti gerçekleştirme konusuna bakın.

Güzergahlar

Gezinti, gidilmesi gereken bir URI belirtilerek bir Shell uygulamasında gerçekleştirilir. Gezinti URI'lerinin üç bileşeni olabilir:

  • Shell görsel hiyerarşisinin bir parçası olarak var olan içeriğe giden yolu tanımlayan bir yol.
  • Bir sayfa. Shell görsel hiyerarşisinde mevcut olmayan sayfalar, bir Shell uygulamasının içinde herhangi bir yerden gezinti yığınına gönderilebilir. Örneğin, ayrıntılar sayfası Kabuk görsel hiyerarşisinde tanımlanamaz, ancak gerektiğinde gezinti yığınına gönderilebilir.
  • Bir veya daha fazla sorgu parametresi. Sorgu parametreleri, gezinirken hedef sayfaya geçirilebilen parametrelerdir.

Gezinti URI'sinin üç bileşeni de içerdiğinde yapısı şöyle olur: //route/page?queryParameters

Yolları kaydetme

Yollar, kendi Route özellikleri üzerinden FlyoutItem, TabBar, Tab ve ShellContent nesnelerinde tanımlanabilir.

<Shell ...>
    <FlyoutItem ...
                Route="animals">
        <Tab ...
             Route="domestic">
            <ShellContent ...
                          Route="cats" />
            <ShellContent ...
                          Route="dogs" />
        </Tab>
        <ShellContent ...
                      Route="monkeys" />
        <ShellContent ...
                      Route="elephants" />  
        <ShellContent ...
                      Route="bears" />
    </FlyoutItem>
    <ShellContent ...
                  Route="about" />                  
    ...
</Shell>

Not

Kabuk hiyerarşisindeki tüm öğelerin kendisiyle ilişkilendirilmiş bir rotası vardır. Yol ayarlamazsanız, çalışma zamanında bir yol oluşturulur. Ancak oluşturulan yolların farklı uygulama oturumlarında tutarlı olması garanti edilmemektedir.

Yukarıdaki örnek, programlı gezintide kullanılabilecek aşağıdaki yol hiyerarşisini oluşturur:

animals
  domestic
    cats
    dogs
  monkeys
  elephants
  bears
about

ShellContent nesnesine gitmek için dogs rotası için mutlak yol URI'si //animals/domestic/dogs şeklindedir. Benzer şekilde, about yönü için ShellContent nesnesine gitmek üzere, mutlak yol URI'si //about şeklindedir.

Uyarı

Uygulama başlangıcında yinelenen bir yol algılanırsa bir ArgumentException atılır. Bu istisna, hiyerarşide aynı düzeydeki iki veya daha fazla rota aynı rota adını paylaşıyorsa da atılır.

Ayrıntı sayfası yollarını kaydetme

Alt sınıf oluşturucusunda Shell veya bir yol çağrılmadan önce çalışan başka bir konumda, Kabuk görsel hiyerarşisinde temsil edilmeyen tüm ayrıntı sayfaları için açıkça ek yollar kaydedilebilir. Bu, Routing.RegisterRoute yöntemi ile gerçekleştirilir.

Routing.RegisterRoute("monkeydetails", typeof(MonkeyDetailPage));
Routing.RegisterRoute("beardetails", typeof(BearDetailPage));
Routing.RegisterRoute("catdetails", typeof(CatDetailPage));
Routing.RegisterRoute("dogdetails", typeof(DogDetailPage));
Routing.RegisterRoute("elephantdetails", typeof(ElephantDetailPage));

Bu örnek, alt sınıfta tanımlanmayan Shell ayrıntı sayfalarını yol olarak kaydeder. Daha sonra, bu ayrıntı sayfalarına uygulamanın içindeki herhangi bir yerden URI tabanlı navigasyon kullanılarak gidilebilir. Bu tür sayfaların yolları genel yollar olarak bilinir.

Uyarı

Eğer Routing.RegisterRoute yöntemi, aynı rotayı iki veya daha fazla farklı türe kaydetmeye çalışırsa, bir ArgumentException atılır.

Alternatif olarak, sayfalar gerekirse farklı yol hiyerarşilerine kaydedilebilir:

Routing.RegisterRoute("monkeys/details", typeof(MonkeyDetailPage));
Routing.RegisterRoute("bears/details", typeof(BearDetailPage));
Routing.RegisterRoute("cats/details", typeof(CatDetailPage));
Routing.RegisterRoute("dogs/details", typeof(DogDetailPage));
Routing.RegisterRoute("elephants/details", typeof(ElephantDetailPage));

Bu örnek, details rotasına, monkeys rotasının sayfasından gidildiğinde MonkeyDetailPage öğesinin gösterildiği bağlamsal sayfa gezinmesini etkinleştirir. Benzer şekilde, details yolundaki sayfadan elephants yoluna geçiş yapmak, ElephantDetailPage öğesini görüntüler. Daha fazla bilgi için bkz . Bağlamsal gezinti.

Not

Routing.RegisterRoute yöntemiyle kaydedilmiş sayfaların kaydı, gerekirse Routing.UnRegisterRoute yöntemiyle silinebilir.

Gezinme işlemi yap.

Navigasyonu gerçekleştirebilmek için önce Shell alt sınıfına bir referans edinilmelidir. Bu referans, Shell.Current özelliği aracılığıyla alınabilir. Daha sonra nesnede GoToAsync yöntemi çağrılarak Shell gezinti gerçekleştirilebilir. Bu yöntem, bir ShellNavigationState 'e gider ve gezinti animasyonu tamamlandıktan sonra tamamlanacak olan bir Task döndürür. ShellNavigationState nesnesi, GoToAsync yöntemi tarafından, bir string veya bir Uri üzerinden oluşturulur ve Location özelliği, string ya da Uri bağımsız değişkenine ayarlanmıştır.

Önemli

Shell görsel hiyerarşisinden bir rotaya gidildiğinde, bir navigasyon yığını oluşturulmaz. Ancak, Kabuk görsel hiyerarşisinde olmayan bir sayfaya gidildiğinde bir gezinti yığını oluşturulur.

Shell nesnesinin geçerli gezinti durumu, görüntülenen yolun URI'sini içeren Location özelliği aracılığıyla Shell.Current.CurrentState özelliğinden alınabilir.

Mutlak rotalar

Gezinme, GoToAsync yöntemine parametre olarak geçerli bir mutlak URI belirtilerek gerçekleştirilebilir.

await Shell.Current.GoToAsync("//animals/monkeys");

Bu örnek, bir ShellContent nesnesinde tanımlanan monkeys rotasının sayfasına gider. ShellContent güzergahını temsil eden nesne, güzergahı animals olan bir FlyoutItem nesnenin alt öğesidir.

Uyarı

Mutlak yollar, Routing.RegisterRoute yöntemiyle kaydedilen sayfalarla çalışmaz.

Göreli yollar

Navigasyon, GoToAsync yöntemine bir bağımsız değişken olarak geçerli bir göreli URI belirtilerek de gerçekleştirilebilir. Yönlendirme sistemi, URI'yi bir ShellContent nesneyle eşleştirmeyi dener. Bu nedenle, bir uygulamadaki tüm yollar benzersizse, gezinti yalnızca benzersiz yol adı göreli URI olarak belirtilerek gerçekleştirilebilir.

Aşağıdaki örnek, güzergahın sayfasına monkeydetails yönlendirilir.

await Shell.Current.GoToAsync("monkeydetails");

Bu örnekte, eşleşen sayfa bulunana kadar monkeyDetails yolu aranılır. Sayfa bulunduğunda gezinti yığınına gönderilir.

Uyarı

Göreli yollar, genellikle Shellolan alt sınıf sınıfında tanımlanan sayfalarla çalışmaz. Bunun yerine, yalnızca Routing.RegisterRoute yöntemiyle kaydedilen sayfalar göreli yollar kullanılarak gezinti yığınına gönderilebilir. Daha fazla bilgi için kayıt ayrıntı sayfası yolları hakkında bkz..

Bağlamsal navigasyon

Göreli yollar bağlamsal gezintiyi etkinleştirir. Örneğin, aşağıdaki yol hiyerarşisini göz önünde bulundurun:

monkeys
  details
bears
  details

Rotanın monkeys için kayıtlı sayfa görüntülendiğinde, details rotasına gidildiğinde, monkeys/details rotası için kayıtlı sayfa görüntülenir. Benzer şekilde, bears rotasının kayıtlı sayfası görüntülendiğinde, details rotasına gidildiğinde, bears/details rotasının kayıtlı sayfası görüntülenir. Bu örnekteki yolları nasıl kaydedeceğiniz hakkında bilgi için bkz Sayfa yollarını kaydetme.

Geriye doğru gezinti

Yöntemin bağımsız değişkeni GoToAsync olarak ".." belirtilerek geriye doğru gezinti gerçekleştirilebilir:

await Shell.Current.GoToAsync("..");

".." ile geriye doğru gezinti bir yol ile de birleştirilebilir:

await Shell.Current.GoToAsync("../route");

Bu örnekte geriye doğru gezinti gerçekleştirilir ve ardından belirtilen yola gezinti yapılır.

Önemli

Geriye doğru ve belirtilen bir yola gitmek, yalnızca geriye doğru gezintinin sizi belirtilen yola gitmek için yol hiyerarşisindeki geçerli konuma getirmesi durumunda mümkündür.

Benzer şekilde, birden çok kez geriye gitmek ve ardından belirtilen bir yola gitmek mümkündür:

await Shell.Current.GoToAsync("../../route");

Bu örnekte, geriye doğru gezinti iki kez gerçekleştirilir ve ardından belirtilen yola gezinti yapılır.

Buna ek olarak, veriler geriye doğru gezinirken sorgu özellikleri aracılığıyla geçirilebilir:

await Shell.Current.GoToAsync($"..?parameterToPassBack={parameterValueToPassBack}");

Bu örnekte geriye doğru gezinti gerçekleştirilir ve sorgu parametresi değeri önceki sayfadaki sorgu parametresine geçirilir.

Not

Sorgu parametreleri herhangi bir geriye dönük gezinti isteğine eklenebilir.

Veri geçirme hakkında daha fazla bilgi için Veri Geçirme kısmına bakın.

Geçersiz yollar

Aşağıdaki yol biçimleri geçersiz:

Biçim Açıklama
// page veya ///page Küresel rotalar şu anda navigasyon yığınındaki tek sayfa olamaz. Bu nedenle, genel yollara mutlak yönlendirme desteklenmez.

Bu yol biçimlerinin kullanılması, bir Exception atılmasıyla sonuçlanıyor.

Uyarı

Varolmayan bir yola gitmeye çalışmak bir ArgumentException özel durumun fırlatılmasına neden olur.

Hata ayıklama navigasyonu

Shell sınıflarından bazıları, bir sınıfın veya alanın hata ayıklayıcı tarafından nasıl görüntüleneceğini belirten DebuggerDisplayAttribute ile süslenmiştir. Bu, gezinti isteğiyle ilgili verileri görüntüleyerek gezinti isteklerinde hata ayıklamaya yardımcı olabilir. Örneğin, aşağıdaki ekran görüntüsü nesnenin CurrentItem ve CurrentState özelliklerini Shell.Current gösterir:

Hata ayıklayıcının ekran görüntüsü.

Bu örnekte, türündeki CurrentItemFlyoutItemözelliği nesnenin FlyoutItem başlığını ve yolunu görüntüler. Benzer şekilde, türündeki CurrentStateShellNavigationStateözelliği, Shell uygulamasında görüntülenen yolun URI'sini görüntüler.

Tab sınıfı, Tab içindeki geçerli gezinti yığınını temsil eden IReadOnlyList<Page> türünde bir Stack özelliği tanımlar. Sınıf ayrıca aşağıdaki geçersiz kılınabilir gezinti yöntemlerini sağlar:

  • GetNavigationStack, geçerli gezinti yığınını döndürür IReadOnlyList<Page>.
  • INavigation.InsertPageBefore, OnInsertPageBefore çağrıldığında çağrılır.
  • OnPopAsync, Task<Page> döndürür ve INavigation.PopAsync çağrıldığında çağrılır.
  • OnPopToRootAsync, Task döndürür ve INavigation.OnPopToRootAsync çağrıldığında çağrılır.
  • OnPushAsync, Task döndürülür ve INavigation.PushAsync çağrıldığında çağrılır.
  • INavigation.RemovePage çağrıldığında OnRemovePage çağrılır.

Aşağıdaki örnekte, OnRemovePage yönteminin nasıl geçersiz kılınacağı gösterilmektedir.

public class MyTab : Tab
{
    protected override void OnRemovePage(Page page)
    {
        base.OnRemovePage(page);

        // Custom logic
    }
}

Bu örnekte, Tab nesneler yerine MyTab nesneler Shell görsel hiyerarşinizde kullanmalısınız.

sınıfı Shell , programlı gezinti veya kullanıcı etkileşimi nedeniyle gezinti gerçekleştirilmek üzereyken tetiklenen olayı tanımlar Navigating . ShellNavigatingEventArgs olayına eşlik eden Navigating nesnesi, aşağıdaki özellikleri sağlar:

Özellik Türü Açıklama
Current ShellNavigationState Geçerli sayfanın URI'sini.
Source ShellNavigationSource Gerçekleşen navigasyon türü.
Target ShellNavigationState Gezintinin hedeflendiği yeri temsil eden URI.
CanCancel bool Gezintiyi iptal etmek mümkün olup olmadığını gösteren bir değer.
Cancelled bool Gezintinin iptal edilip iptal edilmediğini gösteren değer.

ShellNavigatingEventArgs sınıfı, gezintiyi iptal etmek için kullanılabilecek bir Cancel yöntem ve gezintiyi tamamlamak için kullanılabilecek bir belirteç döndüren bir ShellNavigatingDeferral yöntemi sağlar. Gezinti erteleme hakkında daha fazla bilgi için bkz . Gezinti erteleme.

sınıfı Shell , gezinti tamamlandığında tetiklenen olayı da tanımlar Navigated . Navigated olayına eşlik eden ShellNavigatedEventArgs nesnesi aşağıdaki özellikleri sağlar:

Özellik Türü Açıklama
Current ShellNavigationState Geçerli sayfanın URI bağlantısı.
Previous ShellNavigationState Önceki sayfanın URI'sini.
Source ShellNavigationSource Gerçekleşen gezinme türü.

Önemli

OnNavigating yöntemi, Navigating olayı tetiklendiğinde çağrılır. Benzer şekilde, OnNavigated olay tetiklendiğinde Navigated yöntemi çağrılır. Gezinti taleplerini engellemek için her iki yöntem de Shell alt sınıfınızda geçersiz kılınabilir.

ShellNavigatedEventArgs ve ShellNavigatingEventArgs sınıflarının her ikisi de ShellNavigationSource türünde Source özelliklere sahiptir. Bu numaralandırma aşağıdaki değerleri sağlar:

  • Unknown
  • Push
  • Pop
  • PopToRoot
  • Insert
  • Remove
  • ShellItemChanged
  • ShellSectionChanged
  • ShellContentChanged

Bu nedenle, gezinti bir OnNavigating geçersiz kılma işlemi sırasında durdurulabilir ve gezinti kaynağına göre eylemler gerçekleştirilebilir. Örneğin, aşağıdaki kod sayfadaki veriler kaydedilmemişse geriye doğru gezinmeyi nasıl iptal edileceğini gösterir:

protected override void OnNavigating(ShellNavigatingEventArgs args)
{
    base.OnNavigating(args);

    // Cancel any back navigation.
    if (args.Source == ShellNavigationSource.Pop)
    {
        args.Cancel();
    }
}

Kabuk navigasyonu, kullanıcı seçimine göre kesilebilir, tamamlanabilir veya iptal edilebilir. Bu, Shell alt sınıfınızda OnNavigating yöntemini geçersiz kılarak ve ShellNavigatingEventArgs nesnesi üzerinde GetDeferral yöntemini çağırarak gerçekleştirilebilir. Bu yöntem, gezinti isteğini tamamlamak için kullanılabilecek bir yöntemi olan bir ShellNavigatingDeferral belirteç döndürürComplete:

public MyShell : Shell
{
    // ...
    protected override async void OnNavigating(ShellNavigatingEventArgs args)
    {
        base.OnNavigating(args);

        ShellNavigatingDeferral token = args.GetDeferral();

        var result = await DisplayActionSheet("Navigate?", "Cancel", "Yes", "No");
        if (result != "Yes")
        {
            args.Cancel();
        }
        token.Complete();
    }    
}
public MyShell : Shell
{
    // ...
    protected override async void OnNavigating(ShellNavigatingEventArgs args)
    {
        base.OnNavigating(args);

        ShellNavigatingDeferral token = args.GetDeferral();

        var result = await DisplayActionSheetAsync("Navigate?", "Cancel", "Yes", "No");
        if (result != "Yes")
        {
            args.Cancel();
        }
        token.Complete();
    }    
}

Bu örnekte, kullanıcıyı gezinti isteğini tamamlamaya veya iptal etmeye davet eden bir eylem sayfası görüntülenir. ShellNavigatingEventArgs nesnesi üzerinde Cancel yöntemi çağrılarak gezinti iptal edilir. Gezinti, nesnesindeki Complete yöntemi tarafından alınan belirteçte yöntemi ShellNavigatingDeferralGetDeferral çağrılarak ShellNavigatingEventArgs tamamlanır.

Uyarı

Bir GoToAsync kullanıcı bekleyen bir InvalidOperationException gezinti ertelemesi varken gezinmeyi denerse yöntemi bir oluşturur.

Verileri ilet

URI tabanlı programlı gezinti gerçekleştirilirken ilkel veriler dize tabanlı sorgu parametreleri olarak geçirilebilir. Bu, bir yolun arkasına ? eklenerek ve ardından bir sorgu parametresi kimliği ve bir değer eklenerek = elde edilir.

async void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string elephantName = (e.CurrentSelection.FirstOrDefault() as Animal).Name;
    await Shell.Current.GoToAsync($"elephantdetails?name={elephantName}");
}

Bu örnek, CollectionView içinde şu anda seçili olan fili alır, elephantName'yi sorgu parametresi olarak geçirerek elephantdetails yoluna gidilir.

Birden çok nesne tabanlı gezinti verisini iletme

Birden çok kullanımlı nesne tabanlı gezinti verileri, bağımsız değişken belirten GoToAsync bir IDictionary<string, object> aşırı yüklemeyle geçirilebilir:

async void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Animal animal = e.CurrentSelection.FirstOrDefault() as Animal;
    var navigationParameter = new Dictionary<string, object>
    {
        { "Bear", animal }
    };
    await Shell.Current.GoToAsync($"beardetails", navigationParameter);
}

Bu örnek, CollectionView içindeki seçili ayıyı bir Animal olarak getirir. Anahtar Bear kullanılarak Animal nesnesi Dictionary öğesine eklenir. Ardından, Dictionary parametresi olarak geçirilerek, beardetails rotasına bir gezinti gerçekleştirilir.

Argüman olarak IDictionary<string, object> geçirilen veriler, sayfanın ömrü boyunca bellekte tutulur ve sayfa gezinti yığınından kaldırılana kadar serbest bırakılmaz. Bu, aşağıdaki senaryoda gösterildiği gibi sorunlu olabilir:

  1. Page1, GoToAsync yöntemini kullanarak Page2'ye gider ve adı MyData olan bir nesneyi geçirir. Page2 ardından sorgu parametresi olarak alır MyData .
  2. Page2 herhangi bir veri geçirmeden GoToAsync yöntemini kullanarak Page3'e geçiş yapar.
  3. Page3 yöntemiyle GoToAsync geriye doğru gider. Page2 ardından sorgu parametresi olarak yeniden alır MyData .

Bu, birçok senaryoda istenen bir durum olsa da istenmiyorsa, bir sayfa tarafından ilk kez alındıktan sonra Clear yöntemini kullanarak IDictionary<string, object> bağımsız değişkenini temizlemelisiniz.

Tek kullanımlık nesne tabanlı gezinti verilerini aktar

Tek kullanımlık nesne tabanlı gezinti verileri, bağımsız değişken belirten GoToAsync bir ShellNavigationQueryParameters aşırı yüklemeyle geçirilebilir. ShellNavigationQueryParameters nesnesi, gezinti gerçekleştikten sonra temizlenen tek kullanımlık gezinti verileri için tasarlanmıştır. Aşağıdaki örnek, tek kullanımlık verileri geçirirken gezinmeyi gösterir:

async void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Animal animal = e.CurrentSelection.FirstOrDefault() as Animal;
    var navigationParameter = new ShellNavigationQueryParameters
    {
        { "Bear", animal }
    };
    await Shell.Current.GoToAsync($"beardetails", navigationParameter);
}

Şu anda seçili olan ayı, nesneye eklenen bir Animal olarak ShellNavigationQueryParameters içinden alınır. Ardından, beardetails rotasına yönlendirme gerçekleştirilir ve ShellNavigationQueryParameters nesnesi bir yönlendirme parametresi olarak geçirilir. Gezinti gerçekleştikten sonra nesnedeki ShellNavigationQueryParameters veriler temizlenir.

Gezinti verilerini alma

Gezinti verilerini almaya yönelik iki yaklaşım vardır:

  1. Gidilmekte olan sayfayı veya sayfanın BindingContextsınıfını temsil eden sınıf, her sorgu parametresi için bir QueryPropertyAttribute ile donatılabilir. Daha fazla bilgi için bkz . Sorgu özelliği özniteliklerini kullanarak gezinti verilerini işleme.
  2. Gezinilen sayfayı temsil eden sınıf veya sayfanın `BindingContext` sınıfı, `IQueryAttributable` arabirimini uygulayabilir. Daha fazla bilgi için bkz . Gezinti verilerini tek bir yöntem kullanarak işleme.

Sorgu özelliği özniteliklerini kullanarak gezinti verilerini işleme

Gezinme verileri, her dize tabanlı sorgu parametresi, nesne tabanlı gezinti parametresi veya QueryPropertyAttribute nesne için alıcı sınıfı bir ShellNavigationQueryParameters ile işaretlenerek alınabilir.

[QueryProperty(nameof(Bear), "Bear")]
public partial class BearDetailPage : ContentPage
{
    Animal bear;
    public Animal Bear
    {
        get => bear;
        set
        {
            bear = value;
            OnPropertyChanged();
        }
    }

    public BearDetailPage()
    {
        InitializeComponent();
        BindingContext = this;
    }
}

Bu örnekte için ilk bağımsız değişken QueryPropertyAttribute , verileri alacak özelliğin adını belirtir ve ikinci bağımsız değişken parametre kimliğini belirtir. Bu nedenle, QueryPropertyAttribute yukarıdaki örnekte özelliğin Bear yöntem çağrısındaki gezinti parametresinde BearGoToAsync geçirilen verileri alacağını belirtir.

Önemli

aracılığıyla QueryPropertyAttribute alınan dize tabanlı sorgu parametresi değerleri otomatik olarak URL kodunun çözülmesini sağlar.

Uyarı

kullanarak QueryPropertyAttribute gezinti verilerini almak güvenli değildir ve tam kırpma veya NativeAOT ile kullanılmamalıdır. Bunun yerine, sorgu parametrelerini kabul etmesi gereken türlerde IQueryAttributable arabirimini uygulamanız gerekir. Daha fazla bilgi için bkz. Tek bir yöntem kullanarak gezinti verilerini işleme, .NET MAUI uygulamasını düzenleme ve Yerel AOT dağıtımı.

Tek bir yöntem kullanarak gezinti verilerini işleme

Gezinti verileri, alma sınıfında arabirimi uygulanarak IQueryAttributable alınabiliyor. Arayüz, IQueryAttributable sınıfının ApplyQueryAttributes yöntemini uygulaması gerektiğini belirtir. Bu yöntemin, türü IDictionary<string, object> olan ve gezinti sırasında geçirilen verileri içeren bir query bağımsız değişkeni vardır. Sözlükteki her anahtar, verileri temsil eden nesneye karşılık gelen değeriyle bir sorgu parametresi kimliğidir. Bu yaklaşımı kullanmanın avantajı, gezinti verilerinin tek bir yöntem kullanılarak işlenebileceğidir. Bu yöntem, bir bütün olarak işlenmesi gereken birden çok gezinti verisi öğeniz olduğunda yararlı olabilir.

Aşağıdaki örnek, IQueryAttributable arabirimini uygulayan bir görünüm modeli sınıfını göstermektedir.

public class MonkeyDetailViewModel : IQueryAttributable, INotifyPropertyChanged
{
    public Animal Monkey { get; private set; }

    public void ApplyQueryAttributes(IDictionary<string, object> query)
    {
        Monkey = query["Monkey"] as Animal;
        OnPropertyChanged("Monkey");
    }
    ...
}

Bu örnekte, yöntem Monkey anahtarı ile query sözlüğünde karşılık gelen nesneyi alır; bu sözlük, GoToAsync yöntemi çağrısına bağımsız değişken olarak geçirilmiştir.

Önemli

Arabirim aracılığıyla IQueryAttributable alınan dize tabanlı sorgu parametresi değerleri otomatik olarak URL kodu çözülemez.

Birden çok veri öğesini geçirme ve işleme

Birden çok dize tabanlı sorgu parametresi & ile bağlanarak geçirilebilir. Örneğin, aşağıdaki kod iki veri öğesi geçirir:

async void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string elephantName = (e.CurrentSelection.FirstOrDefault() as Animal).Name;
    string elephantLocation = (e.CurrentSelection.FirstOrDefault() as Animal).Location;
    await Shell.Current.GoToAsync($"elephantdetails?name={elephantName}&location={elephantLocation}");
}

Bu kod örneği, CollectionView içinde şu anda seçili olan fili alır ve elephantName ve elephantLocation sorgu parametreleri olarak geçirerek elephantdetails rotasına gider.

Birden çok veri öğesi almak için, gidilmekte olan sayfayı temsil eden sınıf veya sayfanın BindingContextsınıfı, dize tabanlı her sorgu parametresi için bir QueryPropertyAttribute ile donatılabilir:

[QueryProperty(nameof(Name), "name")]
[QueryProperty(nameof(Location), "location")]
public partial class ElephantDetailPage : ContentPage
{
    public string Name
    {
        set
        {
            // Custom logic
        }
    }

    public string Location
    {
        set
        {
            // Custom logic
        }
    }
    ...    
}

Bu örnekte, sınıfı her sorgu parametresi için bir QueryPropertyAttribute ile dekore edilmiştir. birincisi QueryPropertyAttribute , özelliğin Name sorgu parametresinde name geçirilen verileri alacağını belirtirken, ikincisi QueryPropertyAttribute özelliğin Location sorgu parametresinde location geçirilen verileri alacağını belirtir. Her iki durumda da sorgu parametresi değerleri yöntem çağrısındaki URI'de GoToAsync belirtilir.

Uyarı

QueryPropertyAttribute kullanılarak gezinti verilerinin alınması güvenli değildir ve tam kırpma veya NativeAOT ile birlikte kullanılmamalıdır. Bunun yerine, sorgu parametrelerini kabul etmesi gereken türlerde IQueryAttributable arabirimini uygulamanız gerekir. Daha fazla bilgi için bkz . .NET MAUI uygulamasını kırpma ve Yerel AOT dağıtımı.

Alternatif olarak gezinti verileri, gezinilen sayfayı IQueryAttributable temsil eden sınıfta veya sayfanın sınıfı için BindingContextarabirimi uygulanarak tek bir yöntemle işlenebilir:

public class ElephantDetailViewModel : IQueryAttributable, INotifyPropertyChanged
{
    public Animal Elephant { get; private set; }

    public void ApplyQueryAttributes(IDictionary<string, object> query)
    {
        string name = HttpUtility.UrlDecode(query["name"].ToString());
        string location = HttpUtility.UrlDecode(query["location"].ToString());
        ...        
    }
    ...
}

Bu örnekte, ApplyQueryAttributes yöntemi URI içindeki name ve location sorgu parametre değerlerini GoToAsync yöntem çağrısından alır.

Not

Yol tabanlı gezinti gerçekleştirilirken dize tabanlı sorgu parametreleri ve nesne tabanlı gezinti parametreleri aynı anda geçirilebilir.

Geri düğmesi davranışı

Geri düğmesinin görünümü ve davranışı, bağlı özellik bir BackButtonBehavior nesnesine BackButtonBehavior ayarlanarak yeniden tanımlanabilir. BackButtonBehavior sınıfı aşağıdaki özellikleri tanımlar:

  • Command, ICommand türünde olup, geri düğmesine basıldığında yürütülür.
  • CommandParameter, object türündeki parametre olup Command öğesine geçirilir.
  • IconOverride, türünde ImageSource, geri düğmesi için kullanılan simge.
  • IsEnabled, türündeki boolean, geri düğmesinin etkinleştirilip etkinleştirilmediğini gösterir. Varsayılan değer şudur: true.
  • IsVisible, türündeki boolean, geri düğmesinin görünür olup olmadığını gösterir. Varsayılan değer şudur: true.
  • TextOverride, türündeki string, geri düğmesi için kullanılan metindir.

Bu özelliklerin tümü nesneler tarafından BindableProperty desteklenir, bu da özelliklerin veri bağlamalarının hedefleri olabileceği anlamına gelir. Veriler kaynaktan hedefe yalnızca BindingContext değiştiğinde gider; her BindableProperty birinin bir OneTime bağlama modu vardır.

Bu özelliklerin tümü nesneler tarafından BindableProperty desteklenir, bu da özelliklerin veri bağlamalarının hedefleri olabileceği anlamına gelir. Command, CommandParameter, IconOveride ve TextOverideBindableProperty nesnelerinin OneTime bağlama modları vardır, yani veriler kaynaktan hedefe yalnızca BindingContext değiştiğinde gider. ve IsEnabledIsVisible nesnelerinin BindableProperty bağlama modları vardırOneWay, bu da verilerin kaynaktan hedefe gittiği anlamına gelir.

Aşağıdaki kodda geri düğmesi görünümünü ve davranışını yeniden tanımlama örneği gösterilmektedir:

<ContentPage ...>    
    <Shell.BackButtonBehavior>
        <BackButtonBehavior Command="{Binding BackCommand}"
                            IconOverride="back.png" />   
    </Shell.BackButtonBehavior>
    ...
</ContentPage>

Command özelliği, geri düğmesine basıldığında yürütülecek şekilde ICommand ayarlanır ve IconOverride özellik de geri düğmesi için kullanılan simgeye ayarlanır:

Kabuk geri düğmesi simgesini geçersiz kılma ekran görüntüsü.