Aracılığıyla paylaş


Gezinti

.NET MAUI , genellikle kullanıcının kullanıcı arabirimiyle etkileşiminden veya iç mantık temelli durum değişikliklerinin bir sonucu olarak uygulamanın kendisinden kaynaklanan sayfa gezintisi desteği içerir. Ancak, aşağıdaki zorlukların karşılanması gerektiğinden, gezintinin Model-View-ViewModel (MVVM) desenini kullanan uygulamalarda uygulanması karmaşık olabilir:

  • Görünümler arasında sıkı bağlama ve bağımlılıklar içermeyen bir yaklaşım kullanarak gidilecek görünümü tanımlama.
  • Gidilecek görünümün örneği oluşturulup başlatıldığı işlemi koordine etme. MVVM kullanılırken görünümün ve görünüm modelinin örneği oluşturulup görünümün bağlama bağlamı aracılığıyla birbirleriyle ilişkilendirilmesi gerekir. Bir uygulama bağımlılık ekleme kapsayıcısı kullandığında, görünümlerin ve görünüm modellerinin örneğini oluşturmak için belirli bir yapı mekanizması gerekebilir.
  • İlk görünüm gezintisi mi yoksa görünüm modeli öncelikli gezinti mi gerçekleştirebilirsiniz? Görünüm öncelikli gezintide, gidecek sayfa görünüm türünün adına başvurur. Gezinti sırasında, belirtilen görünüme karşılık gelen görünüm modeli ve diğer bağımlı hizmetlerle birlikte örnek oluşturulur. Alternatif bir yaklaşım, gidileceği sayfanın görünüm modeli türünün adına başvurduğu görünüm-model öncelikli gezintiyi kullanmaktır.
  • Görünümler ve görünüm modelleri arasında uygulamanın gezinti davranışının nasıl temiz bir şekilde ayrılacaklarını belirleme. MVVM düzeni, uygulamanın kullanıcı arabirimiyle sunu ve iş mantığını birbirinden ayırır, ancak bunları birbirine bağlamaya yönelik doğrudan bir mekanizma sağlamaz. Ancak, bir uygulamanın gezinti davranışı genellikle uygulamanın kullanıcı arabirimine ve sunu bölümlerine yayılır. Kullanıcı genellikle bir görünümden gezinti başlatır ve gezintinin bir sonucu olarak görünüm değiştirilir. Ancak, gezintinin genellikle görünüm modeli içinden başlatılması veya koordine edilmesi gerekebilir.
  • Başlatma amacıyla gezinti sırasında parametreleri geçirmeyi belirleme. Örneğin, kullanıcı sipariş ayrıntılarını güncelleştirmek için bir görünüme giderse, doğru verileri görüntüleyebilmesi için sipariş verilerinin görünüme geçirilmesi gerekir.
  • Belirli iş kurallarına uyulmasını sağlamak için gezintiyi koordine etme. Örneğin, kullanıcılardan bir görünümden ayrılmadan önce, geçersiz verileri düzeltebilmeleri veya görünümde yapılan veri değişikliklerini göndermeleri veya atmaları istenmesi istenebilir.

Bu bölüm, görünüm-model-ilk sayfa gezintisi gerçekleştirmek için kullanılan adlı MauiNavigationService bir gezinti hizmeti sınıfı sunarak bu zorlukları ele alır.

Not

MauiNavigationService Uygulama tarafından kullanılan basit bir işlemdir ve tüm olası gezinti türlerini kapsamaz. Uygulamanızın ihtiyaç duyduğu gezinti türleri ek işlevsellik gerektirebilir.

Gezinti mantığı bir görünümün arka planında veya verilere bağlı bir görünüm modelinde bulunabilir. Gezinti mantığını bir görünüme yerleştirmek en basit yaklaşım olsa da, birim testleri aracılığıyla kolayca test edilemez. Görünüm modeli sınıflarında gezinti mantığı koymak, mantığın birim testleri aracılığıyla doğrulanabilir olduğu anlamına gelir. Ayrıca, görünüm modeli daha sonra belirli iş kurallarının uygulandığından emin olmak için gezintiyi denetlemek için mantık uygulayabilir. Örneğin bir uygulama, girilen verilerin geçerli olduğundan emin olmadan kullanıcının sayfadan uzaklaşmasına izin vermeyebilir.

Bir gezinti hizmeti genellikle test edilebilirliği artırmak için görünüm modellerinden çağrılır. Ancak görünüm modellerinden görünümlere gitmek için görünüm modellerinin görünümlere ve özellikle etkin görünüm modelinin ilişkilendirilmediği görünümlere başvurması gerekir ve bu önerilmez. Bu nedenle, MauiNavigationService burada sunulan görünüm-model türü gitmek için hedef olarak belirtir.

eShop çok platformlu uygulaması, view-model-first gezintisi sağlamak için sınıfını MauiNavigationService kullanır. Bu sınıf, aşağıdaki kod örneğinde gösterilen arabirimini uygular INavigationService :

public interface INavigationService
{
    Task InitializeAsync();

    Task NavigateToAsync(string route, IDictionary<string, object> routeParameters = null);

    Task PopAsync();
}

Bu arabirim, uygulayan bir sınıfın aşağıdaki yöntemleri sağlaması gerektiğini belirtir:

Yöntem Purpose
InitializeAsync Uygulama başlatıldığında iki sayfadan birine gezinti gerçekleştirir.
NavigateToAsync(string route, IDictionary<string, object> routeParameters = null) Kayıtlı bir gezinti yolu kullanarak belirtilen sayfaya hiyerarşik gezinti gerçekleştirir. İsteğe bağlı olarak hedef sayfada işlenmek üzere kullanılacak adlandırılmış yol parametrelerini geçirebilir
PopAsync Geçerli sayfayı gezinti yığınından kaldırır.

Not

Bir INavigationService arabirim genellikle gezinti yığınındaki önceki sayfaya program aracılığıyla dönmek için kullanılan bir GoBackAsync yöntem de belirtir. Ancak, gerekli olmadığından bu yöntem eShop çok platformlu uygulamasında eksiktir.

MauiNavigationService örneği oluşturma

MauiNavigationService arabirimini INavigationService uygulayan sınıfı, aşağıdaki kod örneğinde gösterildiği gibi yönteminde MauiProgram.CreateMauiApp() bağımlılık ekleme kapsayıcısı ile tekil olarak kaydedilir:

mauiAppBuilder.Services.AddSingleton<INavigationService, MauiNavigationService>();

Arabirim INavigationService , aşağıdaki kod örneğinde gösterildiği gibi görünümlerimizin ve görünüm modellerimizin oluşturucusunun eklenmesiyle çözülebilir:

public AppShell(INavigationService navigationService)

Bu, bağımlılık ekleme kapsayıcısında depolanan nesneye bir başvuru MauiNavigationService döndürür.

ViewModelBase sınıfı örneği türünde INavigationServicebir NavigationService özellikte depolarMauiNavigationService. Bu nedenle, sınıfından ViewModelBase türetilen tüm görünüm modeli sınıfları, arabirimi tarafından INavigationService belirtilen yöntemlere erişmek için özelliğini kullanabilirNavigationService.

Gezinti isteklerini işleme

.NET MAUI , bir uygulama içinde gezinmek için birden çok yol sağlar. Gezinmenin geleneksel yolu, kullanıcının sayfalarda istediğiniz gibi ileri ve geri gezinebileceği hiyerarşik bir gezinti deneyimi uygulayan sınıfıdır NavigationPage . eShop uygulaması, bileşeni uygulamanın kök kapsayıcısı ve gezinti konağı olarak kullanır Shell . Kabuk gezintisi hakkında daha fazla bilgi için bkz . Microsoft Geliştirici Merkezi'nin Kabuk Gezintisi .

Gezinti, aşağıdaki kod örneğinde gösterildiği gibi, görünüm modeli sınıflarının içinde yöntemlerden biri NavigateToAsync çağrılarak, gidilmekte olan sayfanın yol yolu belirtilerek gerçekleştirilir:

await NavigationService.NavigateToAsync("//Main");

Aşağıdaki kod örneği, sınıfı tarafından MauiNavigationService sağlanan yöntemi gösterirNavigateToAsync:

public Task NavigateToAsync(string route, IDictionary<string, object> routeParameters = null)
{
    return
        routeParameters != null
            ? Shell.Current.GoToAsync(route, routeParameters)
            : Shell.Current.GoToAsync(route);
}

.NET MAUIShell denetimi yol tabanlı gezinti hakkında zaten bilgi sahibidir, bu nedenle NavigateToAsync yöntemi bu işlevselliği maskelemeye çalışır. NavigateToAsync yöntemi, gezinti verilerinin genellikle başlatma gerçekleştirmek için kullanıldığı görünüm modeline geçirilen bir bağımsız değişken olarak belirtilmesine olanak tanır. Daha fazla bilgi için bkz . Gezinti sırasında parametreleri geçirme.

Önemli

.NET'te MAUIgezinti gerçekleştirmenin birden çok yolu vardır. MauiNavigationService özellikle ile Shellçalışacak şekilde oluşturulur. Veya TabbedPage veya farklı bir NavigationPage gezinti mekanizması kullanıyorsanız, bu yönlendirme hizmetinin bu bileşenler kullanılarak çalışacak şekilde güncelleştirilmiş olması gerekir.

için yolları kaydetmek için MauiNavigationService XAML'den veya arka planda yol bilgilerini sağlamamız gerekir. Aşağıdaki örnekte XAML aracılığıyla yolların kaydı gösterilmektedir.

<?xml version="1.0" encoding="UTF-8" ?>
<Shell
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:views="clr-namespace:eShop.Views"
    x:Class="eShop.AppShell">

    <!-- Omitted for brevity -->

    <FlyoutItem >
        <ShellContent x:Name="login" ContentTemplate="{DataTemplate views:LoginView}" Route="Login" />
    </FlyoutItem>

    <TabBar x:Name="main" Route="Main">
        <ShellContent Title="CATALOG" Route="Catalog" Icon="{StaticResource CatalogIconImageSource}" ContentTemplate="{DataTemplate views:CatalogView}" />
        <ShellContent Title="PROFILE" Route="Profile" Icon="{StaticResource ProfileIconImageSource}" ContentTemplate="{DataTemplate views:ProfileView}" />
    </TabBar>
</Shell>

Bu örnekte ShellContent , ve TabBar kullanıcı arabirimi nesneleri özelliklerini Route ayarlar. Bu, tarafından Shelldenetlenen kullanıcı arabirimi nesneleri için yolları kaydetmek için tercih edilen yöntemdir.

Daha sonra gezinti yığınına eklenecek nesnelerimiz varsa bunları arka planda kod aracılığıyla eklememiz gerekir. Aşağıdaki örnekte arka planda kod içinde yolların kaydı gösterilmektedir.

Routing.RegisterRoute("Filter", typeof(FiltersView));
Routing.RegisterRoute("Basket", typeof(BasketView));

Arka planda kodda, ilk parametre olarak bir yol adı ve ikinci parametre olarak bir görünüm türü alan yöntemini çağıracağız Routing.RegisterRoute . Görünüm modeli gezinmek için özelliğini kullandığında NavigationService , uygulamanın Shell nesnesi kayıtlı yolları arar ve bunları gezinti yığınına yönlendirir.

Görünüm oluşturulduktan ve öğesine gidildikten sonra, ApplyQueryAttributes görünümün ilişkili görünüm modelinin ve InitializeAsync yöntemleri yürütülür. Daha fazla bilgi için bkz . Gezinti sırasında parametreleri geçirme.

Uygulama başlatıldığında, uygulamanın kök görünümü olarak bir Shell nesne ayarlanır. Ayarlandıktan sonra, Shell yol kaydını denetlemek için kullanılır ve ileriye doğru uygulamamızın kökünde bulunur. Shell oluşturulduktan sonra, gezinti rotamızı başlatmak için yöntemini kullanarak OnParentSet uygulamaya eklenmesini bekleyebiliriz. Aşağıdaki kod örneği bu yöntemi gösterir:

protected override async void OnParentSet()
{
    base.OnParentSet();

    if (Parent is not null)
    {
        await _navigationService.InitializeAsync();
    }
}

yöntemi, bağımlılık eklemeden oluşturucunun sağlandığı ve yöntemini çağıran InitializeAsync bir örneğini INavigationService kullanır.

Aşağıdaki kod örneği yönteminin MauiNavigationService.InitializeAsync uygulamasını gösterir:

public Task InitializeAsync()
{
    return NavigateToAsync(string.IsNullOrEmpty(_settingsService.AuthAccessToken)
        ? "//Login"
        : "//Main/Catalog");
}

Uygulamanın //Main/Catalog kimlik doğrulaması için kullanılan önbelleğe alınmış bir erişim belirteci varsa, bu yola gidilir. Aksi takdirde rotaya //Login gidilir.

Gezinti sırasında parametreleri geçirme

NavigateToAsync arabirimi tarafından INavigationService belirtilen yöntemi, gezinti verilerinin genellikle başlatma gerçekleştirmek için kullanıldığı, gidilmekte olan görünüm modeline geçirilen verilerden biri IDictionary<string, object> olarak belirtilmesine olanak tanır.

Örneğin, sınıfı, ProfileViewModel kullanıcı sayfadan bir OrderDetailCommand sipariş ProfileView seçtiğinde yürütülen bir içerir. Bu da aşağıdaki kod örneğinde gösterilen yöntemini yürütür OrderDetailAsync :

private async Task OrderDetailAsync(Order order)
{
    if (order is null)
    {
        return;
    }

    await NavigationService.NavigateToAsync(
        "OrderDetail",
        new Dictionary<string, object>{ { "OrderNumber", order.OrderNumber } });
}

Bu yöntem, kullanıcının seçtiği sipariş numarası bilgilerini geçirerek rotaya gezintiyi OrderDetail çağırır. Bağımlılık ekleme çerçevesi, görünümün öğesine atanan sınıfıyla OrderDetailViewModel birlikte yol için öğesini oluşturduğundaOrderDetailView.OrderDetail BindingContext , OrderDetailViewModel aşağıdaki kod örneğinde gösterildiği gibi gezinti hizmetinden veri almasına olanak tanıyan bir özniteliğine sahiptir.

[QueryProperty(nameof(OrderNumber), "OrderNumber")]
public class OrderDetailViewModel : ViewModelBase
{
    public int OrderNumber { get; set; }
}

QueryProperty özniteliği, değerleri eşlemek için bir özellik için bir parametre ve sorgu parametreleri sözlüğündeki değerleri bulmak için bir anahtar sağlamamıza olanak tanır. Bu örnekte, çağrı sırasında NavigateToAsync "OrderNumber" anahtarı ve sipariş numarası değeri sağlanmıştır. Görünüm modeli "OrderNumber" anahtarını buldu ve değeri özelliğine eşledi OrderNumber . Daha OrderNumber sonra özelliği, örnekten tam sipariş ayrıntılarını OrderService almak için daha sonra kullanılabilir.

Davranışları kullanarak gezintiyi çağırma

Gezinti genellikle bir kullanıcı etkileşimi tarafından bir görünümden tetikler. Örneğin, başarılı kimlik doğrulamasından LoginView sonra gezinti gerçekleştirir. Aşağıdaki kod örneği, gezintinin bir davranış tarafından nasıl çağrıldığı gösterir:

<WebView>
    <WebView.Behaviors>
        <behaviors:EventToCommandBehavior
            EventName="Navigating"
            EventArgsConverter="{StaticResource WebNavigatingEventArgsConverter}"
            Command="{Binding NavigateCommand}" />
    </WebView.Behaviors>
</WebView>

çalışma zamanında ile EventToCommandBehavior etkileşime WebViewyanıt verir. WebView bir web sayfasına gittiği zaman, Navigating olay tetiklenir ve bu da l dosyasında LoginViewModeyürütülürNavigateCommand. Varsayılan olarak, olayın olay bağımsız değişkenleri komutuna geçirilir. Bu veriler, özelliğinde EventArgsConverter belirtilen dönüştürücü tarafından kaynak ve hedef arasında geçirildikçe dönüştürülür ve bu da dosyasından WebNavigatingEventArgsdeğerini Url döndürür. Bu nedenle, yürütülürken NavigationCommand web Url sayfasının değeri kayıtlı Eylem'e parametre olarak geçirilir.

Buna karşılık, NavigationCommand aşağıdaki kod örneğinde gösterilen yöntemi yürütülür NavigateAsync :

private async Task NavigateAsync(string url)
{
    // Omitted for brevity.
    if (!string.IsNullOrWhiteSpace(accessToken))
    {
        _settingsService.AuthAccessToken = accessToken;
        _settingsService.AuthIdToken = authResponse.IdentityToken;
        await NavigationService.NavigateToAsync("//Main/Catalog");
    }
}

Bu yöntem, uygulamayı yola yönlendirmeyi //Main/Catalog çağırırNavigationService.

Gezintiyi onaylama veya iptal etme

Kullanıcının gezintiyi onay edebilmesi veya iptal edebilmesi için bir uygulamanın gezinti işlemi sırasında kullanıcıyla etkileşim kurması gerekebilir. Örneğin, kullanıcı bir veri giriş sayfasını tam olarak tamamlamadan önce gezinmeyi denediğinde bu gerekli olabilir. Bu durumda, bir uygulama kullanıcının sayfadan uzaklaşmasına veya gezinti işlemini gerçekleşmeden önce iptal etmesine olanak tanıyan bir bildirim sağlamalıdır. Bu, gezintinin çağrılıp çağrılmayacağını denetlemek için bir bildirimden gelen yanıt kullanılarak bir görünüm modeli sınıfında elde edilebilir.

Özet

.NET MAUI , genellikle kullanıcının kullanıcı arabirimiyle etkileşiminden veya iç mantık temelli durum değişikliklerinin bir sonucu olarak uygulamanın kendisinden kaynaklanan sayfa gezintisi desteği içerir. Ancak, gezintinin MVVM desenini kullanan uygulamalarda uygulanması karmaşık olabilir.

Bu bölümde, görünüm modellerinden görünüm modeli öncelikli gezinti gerçekleştirmek için kullanılan bir NavigationService sınıfı sunulmuştur. Gezinti mantığının görünüm modeli sınıflarında yerleştirilmesi, mantığın otomatikleştirilmiş testler aracılığıyla kullanılabilmesi anlamına gelir. Ayrıca, görünüm modeli daha sonra belirli iş kurallarının uygulandığından emin olmak için gezintiyi denetlemek için mantık uygulayabilir.