Gezinti
İpucu
Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak bulunan .NET MAUIKullanan Kurumsal Uygulama Desenleri adlı e-Kitap'tan bir alıntıdır.
.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.
Sayfalar arasında gezinme
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 INavigationService
bir 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 Shell
denetlenen 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 gezinme
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 WebView
yanıt verir. WebView
bir web sayfasına gittiği zaman, Navigating
olay tetiklenir ve bu da l dosyasında LoginViewMode
yü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 WebNavigatingEventArgs
değ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.