Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
NavigationView denetimi, uygulamanız için üst düzey gezinti sağlar. Çeşitli ekran boyutlarına uyum sağlar ve hem
NavigationView hem üst hem de sol gezinti bölmesini veya menüsünü destekler
Doğru kontrol bu mu?
NavigationView, şu işler için iyi çalışan uyarlamalı bir gezinti denetimidir:
- Uygulamanız genelinde tutarlı bir gezinti deneyimi sağlama.
- Küçük pencerelerde ekran alanını koruma.
- Birçok gezinti kategorisine erişimi düzenleme.
Diğer gezinti desenleri için bkz . Gezinti tasarımının temelleri.
Gezinti görünümü oluşturma
- Önemli API'ler:NavigationView sınıfı
WinUI 3 Galeri uygulaması çoğu WinUI 3 denetimi, özelliği ve işlevselliğine ilişkin etkileşimli örnekler içerir. Uygulamayı Microsoft Store'dan alın veya GitHub'dan kaynak kodunu alın
Bu örnekte XAML'de basit bir gezinti görünümünün nasıl oluşturulacağı gösterilmektedir.
<NavigationView>
<NavigationView.MenuItems>
<NavigationViewItem Content="Nav Item A"/>
<NavigationViewItem Content="Nav Item B"/>
<NavigationViewItem Content="Nav Item C"/>
</NavigationView.MenuItems>
<Frame x:Name="ContentFrame"/>
</NavigationView>
Görüntüleme modları
NavigationView için farklı gezinti stilleri veya görüntüleme modları yapılandırmak için PaneDisplayMode özelliğini kullanabilirsiniz.
Yukarı
İçeriğin üzerine bölme yerleştirilmiştir.PaneDisplayMode="Top"
Aşağıdaki durumlarda en üst gezintiyi öneririz:
- Eşit derecede önemli olan 5 veya daha az üst düzey gezinti kategoriniz vardır ve açılan taşma menüsündeki ek üst düzey gezinti kategorileri daha az önemli kabul edilir.
- Tüm gezinti seçeneklerini ekranda göstermeniz gerekir.
- Uygulama içeriğiniz için daha fazla alan istiyorsunuz.
- Simgeler, uygulamanızın gezinti kategorilerini açıkça açıklayamaz.
Sol
Bölme genişletilir ve içeriğin soluna yerleştirilir.PaneDisplayMode="Left"
Aşağıdaki durumlarda sol gezintinizi öneririz:
- 5-10 eşit derecede önemli üst düzey gezinti kategoriniz var.
- Gezinti kategorilerinin diğer uygulama içeriği için daha az alanla çok belirgin olmasını istiyorsunuz.
SolKompakt
Bölme yalnızca açılana kadar simgeleri gösterir ve içeriğin soluna konumlandırılır. Açıldığında, bölme içeriğin üzerine biner.PaneDisplayMode="LeftCompact"
SolMinimal
Bölme açılana kadar yalnızca menü düğmesi gösterilir. Açıldığında, bölme içeriğin sol tarafını kaplar.PaneDisplayMode="LeftMinimal"
Auto
PaneDisplayMode varsayılan olarak Autoolarak ayarlanır.
Auto modunda NavigationView, pencere dar olduğunda LeftMinimal modundan LeftCompactmoduna, ve ardından pencere genişlediğinde Left moduna geçecek şekilde uyarlanır. Daha fazla bilgi için uyarlamalı davranış bölümüne bakın.
sol gezinti varsayılan uyarlamalı davranışı
NavigationView varsayılan uyarlamalı davranışı
Anatomi
Bu görseller, üst veya sol gezinti için yapılandırıldığında, denetimin bölme, üst bilgi ve içerik alanlarının düzenini gösterir.
Üst gezinti düzeni
Sol gezinti düzeni
Panel
Bölmeyi içeriğin üzerine veya içeriğin soluna konumlandırmak için PaneDisplayMode özelliğini kullanabilirsiniz.
NavigationView bölmesi aşağıdakileri içerebilir:
- NavigationViewItem nesneleri. Belirli sayfalara gitmek için gezinti öğeleri.
- NavigationViewItemSeparator nesneleri. Gezinti öğelerini gruplandırma ayırıcıları. Ayırıcıyı boşluk olarak işlemek için Opacity özelliğini 0 olarak ayarlayın.
- NavigationViewItemHeader nesneleri. Öğe gruplarını etiketlemeye yönelik başlıklar.
- Uygulama düzeyinde aramaya izin vermek için isteğe bağlı bir AutoSuggestBox denetimi. Denetimi NavigationView.AutoSuggestBox özelliğine atayın.
-
Uygulama ayarları için isteğe bağlı bir giriş noktası. Ayarlar öğesini gizlemek için IsSettingsVisible özelliğini olarak
falseayarlayın.
Sol bölmede şunları da içerir:
- Açılan ve kapatılan bölmeyi açmak için bir menü düğmesi. Bölme açıkken büyük uygulama pencerelerinde , IsPaneToggleButtonVisible özelliğini kullanarak bu düğmeyi gizlemeyi seçebilirsiniz.
NavigationView'da, bölmenin sol üst köşesine yerleştirilmiş bir geri düğmesi vardır. Ancak, geriye doğru gezinmeyi otomatik olarak işlemez ve arka yığına içerik eklemez. Geriye doğru gezintiyi etkinleştirmek için geriye doğru gezinti bölümüne bakın.
Üst ve sol bölme konumları için ayrıntılı bölme anatomisi aşağıdadır.
Üst gezinti bölmesi
- Headers
- Gezinti öğeleri
- Ayırıcı
- AutoSuggestBox (isteğe bağlı)
- Ayarlar düğmesi (isteğe bağlı)
Sol gezinti bölmesi
- Menü düğmesi
- Gezinti öğeleri
- Ayırıcı
- Headers
- AutoSuggestBox (isteğe bağlı)
- Ayarlar düğmesi (isteğe bağlı)
Alt bilgi menü öğeleri
Gezinti öğelerini gezinti bölmesinin sonuna, öğeleri bölmenin başlangıcına yerleştiren MenuItems özelliğiyle karşıt olarak yerleştirmek için FooterMenuItems kullanabilirsiniz.
FooterMenuItems varsayılan olarak Settings öğesinden önce görüntülenir.
Settings öğesi hala IsSettingsVisible özelliği kullanılarak değiştirilebilir.
FooterMenuItems içine yalnızca Gezinti öğeleri yerleştirilmelidir. Bölmenin alt bilgisine hizalanması gereken diğer tüm içerikler PaneFooter'a yerleştirilmelidir.
NavigationView'ınıza FooterMenuItems ekleme örneği için,
Aşağıdaki resimde alt bilgi menüsünde Hesap, Sepetiniz ve Yardım gezinti öğeleri içeren bir NavigationView gösterilmektedir.
Bölme alt bilgisi
Bölmenin alt bilgisine, PaneFooter özelliğine ekleyerek serbest biçimli içerik yerleştirebilirsiniz.
Üst panel alt bilgisi
Sol bölme alt bilgisi
Bölme başlığı ve üst bilgisi
PaneTitle özelliğini ayarlayarak metin içeriğini bölme üst bilgisi alanına yerleştirebilirsiniz. Bir dize alır ve menü düğmesinin yanındaki metni gösterir.
Resim veya logo gibi metin olmayan içerik eklemek için, bölmenin üst bilgisine herhangi bir öğeyi PaneHeader özelliğine ekleyerek yerleştirebilirsiniz.
Hem PaneTitle hem de PaneHeader ayarlanırsa, içerik menü düğmesinin yanında yatay olarak yığılır ve PaneTitle menü düğmesine en yakın durumda olur.
Üst bölme üst bilgisi
Sol bölme üst bilgisi
Bölme içeriği
Bölmeye, PaneCustomContent özelliğine ekleyerek serbest biçimli içerik yerleştirebilirsiniz.
üst bölme özel içerik
Sol bölme özel içeriği
Header
Üstbilgi özelliğini ayarlayarak sayfa başlığı ekleyebilirsiniz.
NavigationView üst bilgisi
Üst bilgi alanı, sol bölme konumundaki gezinti düğmesiyle dikey olarak hizalanır ve üst bölme konumundaki bölmenin altında yer alır. Sabit yüksekliği 52 pikseldir. Amacı, seçili gezinti kategorisinin sayfa başlığını tutmaktır. Üst bilgi sayfanın en üstüne yerleştirilmiştir ve içerik alanı için bir kaydırma kırpma noktası işlevi görür.
NavigationView Minimal görüntüleme modunda olduğunda üst bilgi görünür. Üst bilgiyi, daha büyük pencere genişliklerinde kullanılan diğer modlarda gizlemeyi seçebilirsiniz. Üst bilgiyi gizlemek için AlwaysShowHeader
Content
NavigationView içeriği
İçerik alanı, seçili gezinti kategorisine ilişkin bilgilerin çoğunun görüntülendiği yerdir.
NavigationView Minimal modundayken içerik alanınız için 12 piksel kenar boşlukları ve aksi takdirde 24 piksel kenar boşlukları önerilir.
Uyarlamalı davranış
Varsayılan olarak, NavigationView ekran modunu, kullanılabilir ekran alanı miktarına göre otomatik olarak değiştirir. CompactModeThresholdWidth ve ExpandedModeThresholdWidth özellikleri, görüntüleme modunun değiştiği kesme noktalarını belirtir. Uyarlamalı görüntüleme modu davranışını özelleştirmek için bu değerleri değiştirebilirsiniz.
Varsayılan
PaneDisplayMode varsayılan Autodeğerine ayarlandığında uyarlamalı davranış şunları gösterir:
- Büyük pencere genişliklerinde (1008 piksel veya üzeri) genişletilmiş bir sol bölme.
- Orta pencere genişliklerinde (641 piksel - 1007 piksel) sol, yalnızca simge, gezinti bölmesi (
LeftCompact). - Yalnızca küçük pencere genişliklerinde (640 piksel veya daha az) bir menü düğmesi (
LeftMinimal).
Uyarlamalı davranış için pencere boyutları hakkında daha fazla bilgi için bkz. Ekran boyutları ve kesme noktaları.
sol gezinti varsayılan uyarlamalı davranışı
NavigationView varsayılan uyarlamalı davranışı
Minimal
İkinci yaygın uyarlamalı desen, geniş pencere genişliklerinde genişletilmiş bir sol bölme ve hem orta hem de küçük pencere genişliklerinde yalnızca bir menü düğmesi kullanmaktır.
Aşağıdaki durumlarda bunu öneririz:
- Daha küçük pencere genişliklerinde uygulama içeriği için daha fazla alan istiyorsunuz.
- Gezinti kategorileriniz simgelerle açıkça temsil edilemez.
sol gezinti en düşük uyarlamalı davranışı
NavigationView "en düşük" uyarlamalı davranış
Bu davranışı yapılandırmak için CompactModeThresholdWidth değerini bölmenin daraltılmasını istediğiniz genişliğe ayarlayın. Burada varsayılan değer olan 640'tan 1007'ye değiştirildi. Değerlerin çakışmadığından emin olmak için ExpandedModeThresholdWidth de ayarlamanız gerekir.
<NavigationView CompactModeThresholdWidth="1007" ExpandedModeThresholdWidth="1007"/>
Kompakt
Üçüncü yaygın uyarlamalı desen, geniş pencere genişliklerinde genişletilmiş bir sol bölme ve hem orta hem de küçük pencere genişliklerinde LeftCompact, yalnızca simge gezinti bölmesi kullanmaktır.
Aşağıdaki durumlarda bunu öneririz:
- Tüm gezinti seçeneklerinin her zaman ekranda gösterilmesi önemlidir.
- Gezinti kategorileriniz simgelerle açıkça gösterilebilir.
NavigationView "kompakt" uyarlamalı davranışı
Bu davranışı yapılandırmak için CompactModeThresholdWidth değerini 0 olarak ayarlayın.
<NavigationView CompactModeThresholdWidth="0"/>
Uyarlamalı davranış yok
Otomatik uyarlamalı davranışı devre dışı bırakmak için PaneDisplayMode değerini Autodışında bir değere ayarlayın. Burada LeftMinimal olarak ayarlandığından, pencere genişliği ne olursa olsun yalnızca menü düğmesi gösterilir.
PaneDisplayMode ayarı LeftMinimal olarak ayarlanmış
<NavigationView PaneDisplayMode="LeftMinimal" />
Görüntü modları bölümünde daha önce açıklandığı gibi, bölmeyi her zaman üstte, her zaman genişletilmiş, her zaman kompakt veya her zaman en az olacak şekilde ayarlayabilirsiniz. Görüntü modlarını uygulama kodunuzda kendiniz de yönetebilirsiniz. Bunun bir örneği sonraki bölümde gösterilmiştir.
Üstten sola yönlendirme
Uygulamanızda üst gezinmeyi kullandığınızda, pencere genişliği azaldıkça gezinme öğeleri bir taşma menüsünde küçültülür. Uygulama pencereniz dar olduğunda, tüm öğelerin taşma menüsüne daraltılması yerine PaneDisplayMode'un Top'den LeftMinimal gezintiye geçmesi daha iyi bir kullanıcı deneyimi sağlayabilir.
Aşağıdaki durumlarda büyük pencere boyutlarında üst gezintiyi ve küçük pencere boyutlarında sol gezintiyi kullanmanızı öneririz:
- Birlikte görüntülenecek eşit derecede önemli bir üst düzey gezinti kategoriniz vardır; bu kümedeki bir kategori ekrana sığmazsa, bunlara eşit önem vermek için sol gezintiye daraltabilirsiniz.
- Küçük pencere boyutlarında mümkün olduğunca çok içerik alanı korumak istiyorsunuz.
Bu örnek, ve gezintileri arasında geçiş yapmak için Top ve LeftMinimal özelliğinin nasıl kullanılacağını göstermektedir.
<Grid>
<NavigationView x:Name="NavigationViewControl" >
<NavigationView.MenuItems>
<NavigationViewItem Content="A" x:Name="A" />
<NavigationViewItem Content="B" x:Name="B" />
<NavigationViewItem Content="C" x:Name="C" />
</NavigationView.MenuItems>
</NavigationView>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState>
<VisualState.StateTriggers>
<AdaptiveTrigger
MinWindowWidth="{x:Bind NavigationViewControl.CompactModeThresholdWidth}" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="NavigationViewControl.PaneDisplayMode" Value="Top"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
İpucu
AdaptiveTrigger.MinWindowWidth kullandığınızda, pencere belirtilen minimum genişlikten daha geniş olduğunda görsel durum tetikleniyor. Bu, varsayılan XAML'nin dar pencereyi tanımladığı ve VisualState'in de pencere genişlediğinde uygulanan değişiklikleri tanımladığı anlamına gelir. NavigationView için varsayılan PaneDisplayMode Otomatik'tir, bu nedenle pencere genişliği CompactModeThresholdWidthküçük veya buna eşit olduğunda LeftMinimal gezinti kullanılır. Pencere genişlediğinde VisualState varsayılanı geçersiz kılar ve Top gezinti kullanılır.
Navigasyon
NavigationView hiçbir gezinti görevini otomatik olarak gerçekleştirmez. Kullanıcı bir gezinti öğesine dokunduğunda, NavigationView bu öğeyi seçili olarak gösterir ve ItemInvoked olayı oluşturur. Dokunma sonucunda yeni bir öğe seçilirse SelectionChanged olayı da tetiklenir.
İstenen gezintiyle ilgili görevleri gerçekleştirmek için iki olayı da işleyebilirsiniz. Hangisini işlemeniz gerektiği, uygulamanız için istediğiniz davranışa bağlıdır. Genellikle, istenen sayfaya gider ve bu olaylara yanıt olarak NavigationView üst bilgisini güncelleştirirsiniz.
- ItemInvoked , kullanıcı zaten seçili olsa bile bir gezinti öğesine dokunduğunda tetiklenir. (Öğe fare, klavye veya diğer girişler kullanılarak eşdeğer bir eylemle de çağrılabilir. Daha fazla bilgi için bkz . Giriş ve etkileşimler.) ItemInvoked işleyicisinde gezindiğinizde, varsayılan olarak sayfa yeniden yüklenir ve gezinti yığınına yinelenen bir giriş eklenir. Bir öğe çağrıldığında geziniyorsanız, sayfanın yeniden yüklenmesine izin vermemelisiniz veya sayfa yeniden yüklendiğinde gezinti arka yığınında yinelenen bir girdi oluşturulmadığından emin olmalısınız. (Bkz. kod örnekleri.)
- SelectionChanged , şu anda seçili olmayan bir öğeyi çağıran bir kullanıcı tarafından veya seçili öğe program aracılığıyla değiştirilerek oluşturulabilir. Bir kullanıcı bir öğeyi çağırdığı için seçim değişikliği gerçekleşirse, önce ItemInvoked olayı gerçekleşir. Seçim değişikliği programlıysa ItemInvoked tetiklenmez.
İster MenuItems ister FooterMenuItems öğesinin parçası olsun, tüm gezinti öğeleri aynı seçim modelinin bir parçasıdır. Aynı anda yalnızca bir gezinti öğesi seçilebilir.
Geriye doğru gezinti
NavigationView'da yerleşik bir arka düğme vardır; ancak ileri gezintide olduğu gibi otomatik olarak geriye doğru gezinti gerçekleştirmez. Kullanıcı geri düğmesine dokunduğunda BackRequested olayı oluşturulur. Geriye doğru gezinti gerçekleştirmek için bu olayı işlersiniz. Daha fazla bilgi ve kod örneği için bkz . Gezinti geçmişi ve geriye doğru gezinti.
Minimal veya Compact modunda NavigationView Pane açılır öğe olarak açıktır. Bu durumda, geri düğmesine tıklamak Pane'ı kapatır ve PaneClosing olayını başlatır.
Şu özellikleri ayarlayarak geri düğmesini gizleyebilir veya devre dışı bırakabilirsiniz:
-
IsBackButtonVisible: geri düğmesini göstermek ve gizlemek için kullanın. Bu özellik NavigationViewBackButtonVisible sabit listesi değerini alır ve varsayılan olarak
Autoayarlanır. Düğme daraltıldığında, düzende bu düğme için hiçbir alan ayrılmaz. -
IsBackEnabled: geri düğmesini etkinleştirmek veya devre dışı bırakmak için kullanın. Bu özelliği gezinti çerçevenizin CanGoBack özelliğine bağlayabilirsiniz.
olduğunda BackRequested tetiklenmez.
Sol gezinti bölmesindeki geri düğmesi
Üst gezinti bölmesindeki geri düğmesi
Kod örneği
Bu örnek, hem büyük pencere boyutlarında üst gezinti bölmesi hem de küçük pencere boyutlarında sol gezinti bölmesi ile NavigationView'ı nasıl kullanabileceğinizi gösterir. VisualStateManager'daki en üst gezinti ayarları kaldırılarak yalnızca sol gezintiye uyarlanabilir.
Örnek, birçok senaryo için çalışacak gezinti verilerini ayarlamanın yaygın bir yolunu gösterir. Bu örnekte, ilk olarak gezinmek istediğiniz sayfanın tam tür adını depolarsınız ( NavigationViewItem etiketinde). Olay işleyicisinde bu değerin kutusunu kaldırıp Type(C#) veya Windows::UI::Xaml::Interop::TypeName(C++/WinRT) nesnesine dönüştürür ve hedef sayfaya gitmek için bunu kullanırsınız. Bu, etiketlerinizin içindeki değerlerin geçerli bir türde olduğunu onaylamak için birim testleri oluşturmanıza olanak tanır. (Ayrıca bkz. C++/WinRT ile IInspectable için değerleri kutulama ve kutudan çıkarma). Ayrıca, NavigationView'un geri düğmesiyle geriye doğru gezintinin nasıl uygulanacağını da göstermektedir.
Bu kod, uygulamanızın şu adlara sahip sayfalar içerdiğini varsayar: HomePage, AppsPage, GamesPage, MusicPage, MyContentPage ve SettingsPage. Bu sayfaların kodu gösterilmez.
<Page ... >
<Grid>
<NavigationView x:Name="NavView"
Loaded="NavView_Loaded"
ItemInvoked="NavView_ItemInvoked"
BackRequested="NavView_BackRequested">
<NavigationView.MenuItems>
<NavigationViewItem Tag="NavigationViewDemo.HomePage" Icon="Home" Content="Home"/>
<NavigationViewItemSeparator/>
<NavigationViewItemHeader x:Name="MainPagesHeader"
Content="Main pages"/>
<NavigationViewItem Tag="NavigationViewDemo.AppsPage" Content="Apps">
<NavigationViewItem.Icon>
<FontIcon Glyph=""/>
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem Tag="NavigationViewDemo.GamesPage" Content="Games">
<NavigationViewItem.Icon>
<FontIcon Glyph=""/>
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem Tag="NavigationViewDemo.MusicPage" Icon="Audio" Content="Music"/>
</NavigationView.MenuItems>
<NavigationView.AutoSuggestBox>
<!-- See AutoSuggestBox documentation for
more info about how to implement search. -->
<AutoSuggestBox x:Name="NavViewSearchBox" QueryIcon="Find"/>
</NavigationView.AutoSuggestBox>
<ScrollViewer>
<Frame x:Name="ContentFrame" IsTabStop="True"
NavigationFailed="ContentFrame_NavigationFailed"/>
</ScrollViewer>
</NavigationView>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState>
<VisualState.StateTriggers>
<AdaptiveTrigger
MinWindowWidth="{x:Bind NavViewCompactModeThresholdWidth}"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<!-- Remove the next 3 lines for left-only navigation. -->
<Setter Target="NavView.PaneDisplayMode" Value="Top"/>
<Setter Target="NavViewSearchBox.Width" Value="200"/>
<Setter Target="MainPagesHeader.Visibility" Value="Collapsed"/>
<!-- Leave the next line for left-only navigation. -->
<Setter Target="ContentFrame.Padding" Value="24,0,24,24"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</Page>
private double NavViewCompactModeThresholdWidth { get { return NavView.CompactModeThresholdWidth; } }
private void ContentFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
}
private void NavView_Loaded(object sender, RoutedEventArgs e)
{
// You can also add items in code.
NavView.MenuItems.Add(new NavigationViewItemSeparator());
NavView.MenuItems.Add(new NavigationViewItem
{
Content = "My content",
Icon = new SymbolIcon((Symbol)0xF1AD),
Tag = "NavigationViewDemo.MyContentPage"
});
// Add handler for ContentFrame navigation.
ContentFrame.Navigated += On_Navigated;
// NavView doesn't load any page by default, so load home page.
NavView.SelectedItem = NavView.MenuItems[0];
// If navigation occurs on SelectionChanged, this isn't needed.
// Because we use ItemInvoked to navigate, we need to call Navigate
// here to load the home page.
NavView_Navigate(typeof(HomePage), new EntranceNavigationTransitionInfo());
}
private void NavView_ItemInvoked(NavigationView sender,
NavigationViewItemInvokedEventArgs args)
{
if (args.IsSettingsInvoked == true)
{
NavView_Navigate(typeof(SettingsPage), args.RecommendedNavigationTransitionInfo);
}
else if (args.InvokedItemContainer != null)
{
Type navPageType = Type.GetType(args.InvokedItemContainer.Tag.ToString());
NavView_Navigate(navPageType, args.RecommendedNavigationTransitionInfo);
}
}
// NavView_SelectionChanged is not used in this example, but is shown for completeness.
// You will typically handle either ItemInvoked or SelectionChanged to perform navigation,
// but not both.
private void NavView_SelectionChanged(NavigationView sender,
NavigationViewSelectionChangedEventArgs args)
{
if (args.IsSettingsSelected == true)
{
NavView_Navigate(typeof(SettingsPage), args.RecommendedNavigationTransitionInfo);
}
else if (args.SelectedItemContainer != null)
{
Type navPageType = Type.GetType(args.SelectedItemContainer.Tag.ToString());
NavView_Navigate(navPageType, args.RecommendedNavigationTransitionInfo);
}
}
private void NavView_Navigate(
Type navPageType,
NavigationTransitionInfo transitionInfo)
{
// Get the page type before navigation so you can prevent duplicate
// entries in the backstack.
Type preNavPageType = ContentFrame.CurrentSourcePageType;
// Only navigate if the selected page isn't currently loaded.
if (navPageType is not null && !Type.Equals(preNavPageType, navPageType))
{
ContentFrame.Navigate(navPageType, null, transitionInfo);
}
}
private void NavView_BackRequested(NavigationView sender,
NavigationViewBackRequestedEventArgs args)
{
TryGoBack();
}
private bool TryGoBack()
{
if (!ContentFrame.CanGoBack)
return false;
// Don't go back if the nav pane is overlayed.
if (NavView.IsPaneOpen &&
(NavView.DisplayMode == NavigationViewDisplayMode.Compact ||
NavView.DisplayMode == NavigationViewDisplayMode.Minimal))
return false;
ContentFrame.GoBack();
return true;
}
private void On_Navigated(object sender, NavigationEventArgs e)
{
NavView.IsBackEnabled = ContentFrame.CanGoBack;
if (ContentFrame.SourcePageType == typeof(SettingsPage))
{
// SettingsItem is not part of NavView.MenuItems, and doesn't have a Tag.
NavView.SelectedItem = (NavigationViewItem)NavView.SettingsItem;
NavView.Header = "Settings";
}
else if (ContentFrame.SourcePageType != null)
{
// Select the nav view item that corresponds to the page being navigated to.
NavView.SelectedItem = NavView.MenuItems
.OfType<NavigationViewItem>()
.First(i => i.Tag.Equals(ContentFrame.SourcePageType.FullName.ToString()));
NavView.Header =
((NavigationViewItem)NavView.SelectedItem)?.Content?.ToString();
}
}
// MainPage.idl
runtimeclass MainPage : Microsoft.UI.Xaml.Controls.Page
{
...
Double NavViewCompactModeThresholdWidth{ get; };
}
// pch.h
...
#include <winrt/Windows.UI.Xaml.Interop.h>
#include <winrt/Microsoft.UI.Xaml.Media.Animation.h>
// MainPage.h
#pragma once
#include "MainPage.g.h"
namespace muxc
{
using namespace winrt::Microsoft::UI::Xaml::Controls;
};
namespace winrt::NavigationViewDemo::implementation
{
struct MainPage : MainPageT<MainPage>
{
MainPage();
double NavViewCompactModeThresholdWidth();
void ContentFrame_NavigationFailed(
Windows::Foundation::IInspectable const& /* sender */,
Microsoft::UI::Xaml::Navigation::NavigationFailedEventArgs const& args);
void NavView_Loaded(
Windows::Foundation::IInspectable const& /* sender */,
Microsoft::UI::Xaml::RoutedEventArgs const& /* args */);
void NavView_ItemInvoked(
Windows::Foundation::IInspectable const& /* sender */,
muxc::NavigationViewItemInvokedEventArgs const& args);
// NavView_SelectionChanged is not used in this example, but is shown for completeness.
// You'll typically handle either ItemInvoked or SelectionChanged to perform navigation,
// but not both.
void NavView_SelectionChanged(
muxc::NavigationView const& /* sender */,
muxc::NavigationViewSelectionChangedEventArgs const& args);
void NavView_Navigate(
Windows::UI::Xaml::Interop::TypeName navPageType,
Microsoft::UI::Xaml::Media::Animation::NavigationTransitionInfo const& transitionInfo);
void NavView_BackRequested(
muxc::NavigationView const& /* sender */,
muxc::NavigationViewBackRequestedEventArgs const& /* args */);
void On_Navigated(
Windows::Foundation::IInspectable const& /* sender */,
Microsoft::UI::Xaml::Navigation::NavigationEventArgs const& args);
bool TryGoBack();
private:
};
}
namespace winrt::NavigationViewDemo::factory_implementation
{
struct MainPage : MainPageT<MainPage, implementation::MainPage>
{
};
}
// MainPage.cpp
#include "pch.h"
#include "MainPage.xaml.h"
#if __has_include("MainPage.g.cpp")
#include "MainPage.g.cpp"
#endif
using namespace winrt;
using namespace Microsoft::UI::Xaml;
namespace winrt::NavigationViewDemo::implementation
{
MainPage::MainPage()
{
InitializeComponent();
}
double MainPage::NavViewCompactModeThresholdWidth()
{
return NavView().CompactModeThresholdWidth();
}
void MainPage::ContentFrame_NavigationFailed(
Windows::Foundation::IInspectable const& /* sender */,
Microsoft::UI::Xaml::Navigation::NavigationFailedEventArgs const& args)
{
throw winrt::hresult_error(
E_FAIL, winrt::hstring(L"Failed to load Page ") + args.SourcePageType().Name);
}
void MainPage::NavView_Loaded(
Windows::Foundation::IInspectable const& /* sender */,
Microsoft::UI::Xaml::RoutedEventArgs const& /* args */)
{
// You can also add items in code.
NavView().MenuItems().Append(muxc::NavigationViewItemSeparator());
muxc::NavigationViewItem navigationViewItem;
navigationViewItem.Content(winrt::box_value(L"My content"));
navigationViewItem.Icon(muxc::SymbolIcon(static_cast<muxc::Symbol>(0xF1AD)));
navigationViewItem.Tag(winrt::box_value(L"NavigationViewDemo.MyContentPage"));
NavView().MenuItems().Append(navigationViewItem);
// Add handler for ContentFrame navigation.
ContentFrame().Navigated({ this, &MainPage::On_Navigated });
// NavView doesn't load any page by default, so load home page.
NavView().SelectedItem(NavView().MenuItems().GetAt(0));
// If navigation occurs on SelectionChanged, then this isn't needed.
// Because we use ItemInvoked to navigate, we need to call Navigate
// here to load the home page.
NavView_Navigate(winrt::xaml_typename<NavigationViewDemo::HomePage>(),
Microsoft::UI::Xaml::Media::Animation::EntranceNavigationTransitionInfo());
}
void MainPage::NavView_ItemInvoked(
Windows::Foundation::IInspectable const& /* sender */,
muxc::NavigationViewItemInvokedEventArgs const& args)
{
if (args.IsSettingsInvoked())
{
NavView_Navigate(winrt::xaml_typename<NavigationViewDemo::SettingsPage>(),
args.RecommendedNavigationTransitionInfo());
}
else if (args.InvokedItemContainer())
{
Windows::UI::Xaml::Interop::TypeName pageTypeName;
pageTypeName.Name = unbox_value<hstring>(args.InvokedItemContainer().Tag());
pageTypeName.Kind = Windows::UI::Xaml::Interop::TypeKind::Primitive;
NavView_Navigate(pageTypeName, args.RecommendedNavigationTransitionInfo());
}
}
// NavView_SelectionChanged is not used in this example, but is shown for completeness.
// You will typically handle either ItemInvoked or SelectionChanged to perform navigation,
// but not both.
void MainPage::NavView_SelectionChanged(
muxc::NavigationView const& /* sender */,
muxc::NavigationViewSelectionChangedEventArgs const& args)
{
if (args.IsSettingsSelected())
{
NavView_Navigate(winrt::xaml_typename<NavigationViewDemo::SettingsPage>(),
args.RecommendedNavigationTransitionInfo());
}
else if (args.SelectedItemContainer())
{
Windows::UI::Xaml::Interop::TypeName pageTypeName;
pageTypeName.Name = unbox_value<hstring>(args.SelectedItemContainer().Tag());
pageTypeName.Kind = Windows::UI::Xaml::Interop::TypeKind::Primitive;
NavView_Navigate(pageTypeName, args.RecommendedNavigationTransitionInfo());
}
}
void MainPage::NavView_Navigate(
Windows::UI::Xaml::Interop::TypeName navPageType,
Microsoft::UI::Xaml::Media::Animation::NavigationTransitionInfo const& transitionInfo)
{
// Get the page type before navigation so you can prevent duplicate
// entries in the backstack.
Windows::UI::Xaml::Interop::TypeName preNavPageType =
ContentFrame().CurrentSourcePageType();
// Navigate only if the selected page isn't currently loaded.
if (navPageType.Name != L"" && preNavPageType.Name != navPageType.Name)
{
ContentFrame().Navigate(navPageType, nullptr, transitionInfo);
}
}
void MainPage::NavView_BackRequested(
muxc::NavigationView const& /* sender */,
muxc::NavigationViewBackRequestedEventArgs const& /* args */)
{
TryGoBack();
}
bool MainPage::TryGoBack()
{
if (!ContentFrame().CanGoBack())
return false;
// Don't go back if the nav pane is overlayed.
if (NavView().IsPaneOpen() &&
(NavView().DisplayMode() == muxc::NavigationViewDisplayMode::Compact ||
NavView().DisplayMode() == muxc::NavigationViewDisplayMode::Minimal))
return false;
ContentFrame().GoBack();
return true;
}
void MainPage::On_Navigated(
Windows::Foundation::IInspectable const& /* sender */,
Microsoft::UI::Xaml::Navigation::NavigationEventArgs const& args)
{
NavView().IsBackEnabled(ContentFrame().CanGoBack());
if (ContentFrame().SourcePageType().Name ==
winrt::xaml_typename<NavigationViewDemo::SettingsPage>().Name)
{
// SettingsItem is not part of NavView.MenuItems, and doesn't have a Tag.
NavView().SelectedItem(NavView().SettingsItem().as<muxc::NavigationViewItem>());
NavView().Header(winrt::box_value(L"Settings"));
}
else if (ContentFrame().SourcePageType().Name != L"")
{
for (auto&& eachMenuItem : NavView().MenuItems())
{
auto navigationViewItem =
eachMenuItem.try_as<muxc::NavigationViewItem>();
{
if (navigationViewItem)
{
winrt::hstring hstringValue =
winrt::unbox_value_or<winrt::hstring>(
navigationViewItem.Tag(), L"");
if (hstringValue == ContentFrame().SourcePageType().Name)
{
NavView().SelectedItem(navigationViewItem);
NavView().Header(navigationViewItem.Content());
}
}
}
}
}
}
}
Hiyerarşik gezinti
Bazı uygulamalar, yalnızca düz bir gezinti öğeleri listesinden daha fazlasını gerektiren daha karmaşık bir hiyerarşik yapıya sahip olabilir. Sayfa kategorilerini görüntülemek için üst düzey gezinti öğelerini, belirli sayfaları görüntülemek için ise alt öğeleri kullanmak isteyebilirsiniz. Yalnızca diğer sayfalara bağlanan hub stili sayfalarınız varsa da kullanışlıdır. Bu tür durumlar için hiyerarşik bir NavigationView oluşturmanız gerekir.
Bölmede iç içe gezinti öğelerinin hiyerarşik listesini göstermek için MenuItems özelliğini veya NavigationViewItem'inMenuItemsSource özelliğini kullanın. Her bir NavigationViewItem, diğer NavigationViewItem'leri ve öğeleri düzenlemek için, öğe başlıkları ve ayırıcılar gibi unsurları içerebilir.
MenuItemsSourcekullanırken hiyerarşik bir liste göstermek için ItemTemplate NavigationViewItem olarak ayarlayın ve MenuItemsSource özelliğini hiyerarşinin bir sonraki düzeyine bağlayın.
NavigationViewItem herhangi bir sayıda iç içe düzey içerse de, uygulamanızın gezinti hiyerarşisini sığ tutmanızı öneririz. İki düzeyin kullanılabilirlik ve kavrama için ideal olduğuna inanıyoruz.
NavigationView Top, Leftve LeftCompact bölme görüntüleme modlarında hiyerarşiyi gösterir. Genişletilmiş alt ağaç, bölme görüntüleme modlarının her birinde şöyle görünür:
İşaretlemeye öğe hiyerarşisi ekleme
Bu örnek, XAML işaretlemesinde hiyerarşik uygulama gezintisi bildirmeyi gösterir.
<NavigationView>
<NavigationView.MenuItems>
<NavigationViewItem Content="Home" Icon="Home" ToolTipService.ToolTip="Home"/>
<NavigationViewItem Content="Collections" Icon="Keyboard" ToolTipService.ToolTip="Collections">
<NavigationViewItem.MenuItems>
<NavigationViewItem Content="Notes" Icon="Page" ToolTipService.ToolTip="Notes"/>
<NavigationViewItem Content="Mail" Icon="Mail" ToolTipService.ToolTip="Mail"/>
</NavigationViewItem.MenuItems>
</NavigationViewItem>
</NavigationView.MenuItems>
</NavigationView>
Veri bağlama kullanarak öğe hiyerarşisi ekleme
NavigationView'e menü öğelerinin bir hiyerarşisini ekleyin.
- MenuItemsSource özelliğini hiyerarşik verilere bağlama
- öğe şablonunu NavigationViewMenuItem olarak tanımlama, İçerik öğesinin menü öğesinin etiketi olarak ayarlanması ve menuItemsSource özelliğinin hiyerarşinin bir sonraki düzeyine bağlı olması
Bu örnek ayrıca Genişletme ve Daraltma olaylarını da göstermektedir. Çocuk ögelere sahip bir menü ögesi için bu olaylar oluşturulur.
<Page ... >
<Page.Resources>
<DataTemplate x:Key="NavigationViewMenuItem" x:DataType="local:Category">
<NavigationViewItem Content="{x:Bind Name}" MenuItemsSource="{x:Bind Children}"/>
</DataTemplate>
</Page.Resources>
<Grid>
<NavigationView x:Name="navview"
MenuItemsSource="{x:Bind Categories, Mode=OneWay}"
MenuItemTemplate="{StaticResource NavigationViewMenuItem}"
ItemInvoked="{x:Bind OnItemInvoked}"
Expanding="OnItemExpanding"
Collapsed="OnItemCollapsed"
PaneDisplayMode="Left">
<StackPanel Margin="10,10,0,0">
<TextBlock Margin="0,10,0,0" x:Name="ExpandingItemLabel" Text="Last Expanding: N/A"/>
<TextBlock x:Name="CollapsedItemLabel" Text="Last Collapsed: N/A"/>
</StackPanel>
</NavigationView>
</Grid>
</Page>
public class Category
{
public String Name { get; set; }
public String CategoryIcon { get; set; }
public ObservableCollection<Category> Children { get; set; }
}
public sealed partial class HierarchicalNavigationViewDataBinding : Page
{
public HierarchicalNavigationViewDataBinding()
{
this.InitializeComponent();
}
public ObservableCollection<Category> Categories = new ObservableCollection<Category>()
{
new Category(){
Name = "Menu item 1",
CategoryIcon = "Icon",
Children = new ObservableCollection<Category>() {
new Category(){
Name = "Menu item 2",
CategoryIcon = "Icon",
Children = new ObservableCollection<Category>() {
new Category() {
Name = "Menu item 3",
CategoryIcon = "Icon",
Children = new ObservableCollection<Category>() {
new Category() { Name = "Menu item 4", CategoryIcon = "Icon" },
new Category() { Name = "Menu item 5", CategoryIcon = "Icon" }
}
}
}
}
}
},
new Category(){
Name = "Menu item 6",
CategoryIcon = "Icon",
Children = new ObservableCollection<Category>() {
new Category(){
Name = "Menu item 7",
CategoryIcon = "Icon",
Children = new ObservableCollection<Category>() {
new Category() { Name = "Menu item 8", CategoryIcon = "Icon" },
new Category() { Name = "Menu item 9", CategoryIcon = "Icon" }
}
}
}
},
new Category(){ Name = "Menu item 10", CategoryIcon = "Icon" }
};
private void OnItemInvoked(object sender, NavigationViewItemInvokedEventArgs e)
{
var clickedItem = e.InvokedItem;
var clickedItemContainer = e.InvokedItemContainer;
}
private void OnItemExpanding(object sender, NavigationViewItemExpandingEventArgs e)
{
var nvib = e.ExpandingItemContainer;
var name = "Last expanding: " + nvib.Content.ToString();
ExpandingItemLabel.Text = name;
}
private void OnItemCollapsed(object sender, NavigationViewItemCollapsedEventArgs e)
{
var nvib = e.CollapsedItemContainer;
var name = "Last collapsed: " + nvib.Content;
CollapsedItemLabel.Text = name;
}
}
// Category.idl
namespace HierarchicalNavigationViewDataBinding
{
runtimeclass Category
{
String Name;
String CategoryIcon;
Windows.Foundation.Collections.IObservableVector<Category> Children;
}
}
// Category.h
#pragma once
#include "Category.g.h"
namespace winrt::HierarchicalNavigationViewDataBinding::implementation
{
struct Category : CategoryT<Category>
{
Category();
Category(winrt::hstring name,
winrt::hstring categoryIcon,
Windows::Foundation::Collections::
IObservableVector<HierarchicalNavigationViewDataBinding::Category> children);
winrt::hstring Name();
void Name(winrt::hstring const& value);
winrt::hstring CategoryIcon();
void CategoryIcon(winrt::hstring const& value);
Windows::Foundation::Collections::
IObservableVector<HierarchicalNavigationViewDataBinding::Category> Children();
void Children(Windows::Foundation::Collections:
IObservableVector<HierarchicalNavigationViewDataBinding::Category> const& value);
private:
winrt::hstring m_name;
winrt::hstring m_categoryIcon;
Windows::Foundation::Collections::
IObservableVector<HierarchicalNavigationViewDataBinding::Category> m_children;
};
}
// Category.cpp
#include "pch.h"
#include "Category.h"
#include "Category.g.cpp"
namespace winrt::HierarchicalNavigationViewDataBinding::implementation
{
Category::Category()
{
m_children = winrt::single_threaded_observable_vector<HierarchicalNavigationViewDataBinding::Category>();
}
Category::Category(
winrt::hstring name,
winrt::hstring categoryIcon,
Windows::Foundation::Collections::
IObservableVector<HierarchicalNavigationViewDataBinding::Category> children)
{
m_name = name;
m_categoryIcon = categoryIcon;
m_children = children;
}
hstring Category::Name()
{
return m_name;
}
void Category::Name(hstring const& value)
{
m_name = value;
}
hstring Category::CategoryIcon()
{
return m_categoryIcon;
}
void Category::CategoryIcon(hstring const& value)
{
m_categoryIcon = value;
}
Windows::Foundation::Collections::IObservableVector<HierarchicalNavigationViewDataBinding::Category>
Category::Children()
{
return m_children;
}
void Category::Children(
Windows::Foundation::Collections::IObservableVector<HierarchicalNavigationViewDataBinding::Category>
const& value)
{
m_children = value;
}
}
// MainPage.idl
import "Category.idl";
namespace HierarchicalNavigationViewDataBinding
{
[default_interface]
runtimeclass MainPage : Windows.UI.Xaml.Controls.Page
{
MainPage();
Windows.Foundation.Collections.IObservableVector<Category> Categories{ get; };
}
}
// MainPage.h
#pragma once
#include "MainPage.g.h"
namespace muxc
{
using namespace winrt::Microsoft::UI::Xaml::Controls;
};
namespace winrt::HierarchicalNavigationViewDataBinding::implementation
{
struct MainPage : MainPageT<MainPage>
{
MainPage();
Windows::Foundation::Collections::IObservableVector<HierarchicalNavigationViewDataBinding::Category>
Categories();
void OnItemInvoked(muxc::NavigationView const& sender, muxc::NavigationViewItemInvokedEventArgs const& args);
void OnItemExpanding(
muxc::NavigationView const& sender,
muxc::NavigationViewItemExpandingEventArgs const& args);
void OnItemCollapsed(
muxc::NavigationView const& sender,
muxc::NavigationViewItemCollapsedEventArgs const& args);
private:
Windows::Foundation::Collections::
IObservableVector<HierarchicalNavigationViewDataBinding::Category> m_categories;
};
}
namespace winrt::HierarchicalNavigationViewDataBinding::factory_implementation
{
struct MainPage : MainPageT<MainPage, implementation::MainPage>
{
};
}
// MainPage.cpp
#include "pch.h"
#include "MainPage.h"
#include "MainPage.g.cpp"
#include "Category.h"
namespace winrt::HierarchicalNavigationViewDataBinding::implementation
{
MainPage::MainPage()
{
InitializeComponent();
m_categories =
winrt::single_threaded_observable_vector<HierarchicalNavigationViewDataBinding::Category>();
auto menuItem10 = winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 10", L"Icon", nullptr);
auto menuItem9 = winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 9", L"Icon", nullptr);
auto menuItem8 = winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 8", L"Icon", nullptr);
auto menuItem7Children =
winrt::single_threaded_observable_vector<HierarchicalNavigationViewDataBinding::Category>();
menuItem7Children.Append(*menuItem9);
menuItem7Children.Append(*menuItem8);
auto menuItem7 = winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 7", L"Icon", menuItem7Children);
auto menuItem6Children =
winrt::single_threaded_observable_vector<HierarchicalNavigationViewDataBinding::Category>();
menuItem6Children.Append(*menuItem7);
auto menuItem6 = winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 6", L"Icon", menuItem6Children);
auto menuItem5 = winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 5", L"Icon", nullptr);
auto menuItem4 = winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 4", L"Icon", nullptr);
auto menuItem3Children =
winrt::single_threaded_observable_vector<HierarchicalNavigationViewDataBinding::Category>();
menuItem3Children.Append(*menuItem5);
menuItem3Children.Append(*menuItem4);
auto menuItem3 = winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 3", L"Icon", menuItem3Children);
auto menuItem2Children =
winrt::single_threaded_observable_vector<HierarchicalNavigationViewDataBinding::Category>();
menuItem2Children.Append(*menuItem3);
auto menuItem2 = winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 2", L"Icon", menuItem2Children);
auto menuItem1Children =
winrt::single_threaded_observable_vector<HierarchicalNavigationViewDataBinding::Category>();
menuItem1Children.Append(*menuItem2);
auto menuItem1 = winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 1", L"Icon", menuItem1Children);
m_categories.Append(*menuItem1);
m_categories.Append(*menuItem6);
m_categories.Append(*menuItem10);
}
Windows::Foundation::Collections::IObservableVector<HierarchicalNavigationViewDataBinding::Category>
MainPage::Categories()
{
return m_categories;
}
void MainPage::OnItemInvoked(
muxc::NavigationView const& /* sender */,
muxc::NavigationViewItemInvokedEventArgs const& args)
{
auto clickedItem = args.InvokedItem();
auto clickedItemContainer = args.InvokedItemContainer();
}
void MainPage::OnItemExpanding(
muxc::NavigationView const& /* sender */,
muxc::NavigationViewItemExpandingEventArgs const& args)
{
auto nvib = args.ExpandingItemContainer();
auto name = L"Last expanding: " + winrt::unbox_value<winrt::hstring>(nvib.Content());
ExpandingItemLabel().Text(name);
}
void MainPage::OnItemCollapsed(
muxc::NavigationView const& /* sender */,
muxc::NavigationViewItemCollapsedEventArgs const& args)
{
auto nvib = args.CollapsedItemContainer();
auto name = L"Last collapsed: " + winrt::unbox_value<winrt::hstring>(nvib.Content());
CollapsedItemLabel().Text(name);
}
}
Seleksiyon
Varsayılan olarak, herhangi bir öğe alt öğe içerebilir, çağrılabilir veya seçilebilir.
Kullanıcılara hiyerarşik gezinti seçenekleri ağacı sağlarken, örneğin uygulamanızın bu üst öğeyle ilişkilendirilmiş bir hedef sayfası olmadığında üst öğeleri seçilemez hale getirebilirsiniz. Üst öğeleriniz seçilebilirse, Left-Expanded veya Üst bölme görüntüleme modlarını kullanmanız önerilir. LeftCompact modu, her çağrıldığında kullanıcının alt dalı açabilmesi için üst öğeye gitmesini gerektirir.
Seçili öğeler, sol moddayken seçim göstergelerini sol kenarlarına veya üst moddayken alt kenarlarına çizer. Aşağıda, bir ana öğenin seçildiği sol ve üst moddaki NavigationViews gösterilmektedir.
Seçili öğe her zaman görünür durumda olmayabilir. Daraltılmış/genişletilmemiş alt ağaçtaki bir alt öğe seçilirse, onların ilk görünür üst öğesi seçili olarak gösterilecektir. Alt ağaç genişletildiğinde seçim göstergesi seçili öğeye geri taşınır.
Örneğin, yukarıdaki görüntüde Takvim öğesi kullanıcı tarafından seçilebilir ve ardından kullanıcı alt ağacını daraltma işlemi gerçekleştirebilir. Bu durumda, seçim göstergesi, Takvim'in ilk görünen üst öğesi olan Hesap öğesinin altında belirir. Kullanıcı alt ağacı yeniden genişletirken seçim göstergesi Takvim öğesine geri taşınır.
NavigationView'un tamamında birden fazla seçim göstergesi gösterilmez.
Hem Üst hem de Sol modlarda NavigationViewItems üzerindeki oklara tıklanması alt ağacı genişletir veya daraltacaktır. NavigationViewItem'da başka bir
Bir öğenin çağrıldığında seçim göstergesini göstermesini önlemek için, aşağıda gösterildiği gibi SelectsOnInvoked özelliğini False olarak ayarlayın:
<Page ...>
<Page.Resources>
<DataTemplate x:Key="NavigationViewMenuItem" x:DataType="local:Category">
<NavigationViewItem Content="{x:Bind Name}"
MenuItemsSource="{x:Bind Children}"
SelectsOnInvoked="{x:Bind IsLeaf}"/>
</DataTemplate>
</Page.Resources>
<Grid>
<NavigationView x:Name="navview"
MenuItemsSource="{x:Bind Categories, Mode=OneWay}"
MenuItemTemplate="{StaticResource NavigationViewMenuItem}">
</NavigationView>
</Grid>
</Page>
public class Category
{
public String Name { get; set; }
public String CategoryIcon { get; set; }
public ObservableCollection<Category> Children { get; set; }
public bool IsLeaf { get; set; }
}
public sealed partial class HierarchicalNavigationViewDataBinding : Page
{
public HierarchicalNavigationViewDataBinding()
{
this.InitializeComponent();
}
public ObservableCollection<Category> Categories = new ObservableCollection<Category>()
{
new Category(){
Name = "Menu item 1",
CategoryIcon = "Icon",
Children = new ObservableCollection<Category>() {
new Category(){
Name = "Menu item 2",
CategoryIcon = "Icon",
Children = new ObservableCollection<Category>() {
new Category() {
Name = "Menu item 3",
CategoryIcon = "Icon",
Children = new ObservableCollection<Category>() {
new Category() { Name = "Menu item 4", CategoryIcon = "Icon", IsLeaf = true },
new Category() { Name = "Menu item 5", CategoryIcon = "Icon", IsLeaf = true }
}
}
}
}
}
},
new Category(){
Name = "Menu item 6",
CategoryIcon = "Icon",
Children = new ObservableCollection<Category>() {
new Category(){
Name = "Menu item 7",
CategoryIcon = "Icon",
Children = new ObservableCollection<Category>() {
new Category() { Name = "Menu item 8", CategoryIcon = "Icon", IsLeaf = true },
new Category() { Name = "Menu item 9", CategoryIcon = "Icon", IsLeaf = true }
}
}
}
},
new Category(){ Name = "Menu item 10", CategoryIcon = "Icon", IsLeaf = true }
};
}
// Category.idl
namespace HierarchicalNavigationViewDataBinding
{
runtimeclass Category
{
...
Boolean IsLeaf;
}
}
// Category.h
...
struct Category : CategoryT<Category>
{
...
Category(winrt::hstring name,
winrt::hstring categoryIcon,
Windows::Foundation::Collections::IObservableVector<HierarchicalNavigationViewDataBinding::Category> children,
bool isleaf = false);
...
bool IsLeaf();
void IsLeaf(bool value);
private:
...
bool m_isleaf;
};
// Category.cpp
...
Category::Category(winrt::hstring name,
winrt::hstring categoryIcon,
Windows::Foundation::Collections::IObservableVector<HierarchicalNavigationViewDataBinding::Category> children,
bool isleaf) : m_name(name), m_categoryIcon(categoryIcon), m_children(children), m_isleaf(isleaf) {}
...
bool Category::IsLeaf()
{
return m_isleaf;
}
void Category::IsLeaf(bool value)
{
m_isleaf = value;
}
// MainPage.h and MainPage.cpp
// Delete OnItemInvoked, OnItemExpanding, and OnItemCollapsed.
// MainPage.cpp
...
MainPage::MainPage()
{
InitializeComponent();
m_categories = winrt::single_threaded_observable_vector<HierarchicalNavigationViewDataBinding::Category>();
auto menuItem10 =
winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 10", L"Icon", nullptr, true);
auto menuItem9 =
winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 9", L"Icon", nullptr, true);
auto menuItem8 =
winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 8", L"Icon", nullptr, true);
auto menuItem7Children =
winrt::single_threaded_observable_vector<HierarchicalNavigationViewDataBinding::Category>();
menuItem7Children.Append(*menuItem9);
menuItem7Children.Append(*menuItem8);
auto menuItem7 =
winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 7", L"Icon", menuItem7Children);
auto menuItem6Children =
winrt::single_threaded_observable_vector<HierarchicalNavigationViewDataBinding::Category>();
menuItem6Children.Append(*menuItem7);
auto menuItem6 =
winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 6", L"Icon", menuItem6Children);
auto menuItem5 =
winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 5", L"Icon", nullptr, true);
auto menuItem4 =
winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 4", L"Icon", nullptr, true);
auto menuItem3Children =
winrt::single_threaded_observable_vector<HierarchicalNavigationViewDataBinding::Category>();
menuItem3Children.Append(*menuItem5);
menuItem3Children.Append(*menuItem4);
auto menuItem3 =
winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 3", L"Icon", menuItem3Children);
auto menuItem2Children =
winrt::single_threaded_observable_vector<HierarchicalNavigationViewDataBinding::Category>();
menuItem2Children.Append(*menuItem3);
auto menuItem2 =
winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 2", L"Icon", menuItem2Children);
auto menuItem1Children =
winrt::single_threaded_observable_vector<HierarchicalNavigationViewDataBinding::Category>();
menuItem1Children.Append(*menuItem2);
auto menuItem1 =
winrt::make_self<HierarchicalNavigationViewDataBinding::implementation::Category>
(L"Menu item 1", L"Icon", menuItem1Children);
m_categories.Append(*menuItem1);
m_categories.Append(*menuItem6);
m_categories.Append(*menuItem10);
}
...
Hiyerarşik NavigationView içinde klavye kullanımı
Kullanıcılar klavyelerini kullanarak odağı NavigationView çevresinde taşıyabilir. Ok tuşları bölmenin içinde "iç gezintiyi" gösterir ve ağaç görünümünde sağlanan etkileşimleri izler. NavigationView'de veya HierarchicalNavigationView'un Üst ve Sol-sıkıştırılmış modlarında görüntülenen açılır menüde gezinirken temel eylemler değişir. Her anahtarın hiyerarşik NavigationView'da gerçekleştirebileceği belirli eylemler aşağıdadır:
| Key | Sol Modda | En Üst Modda | Açılır Menüde |
|---|---|---|---|
| Up | Odağı, şu anda odakta olan öğenin hemen üstündeki öğeye taşır. | Hiçbir şey yapmaz. | Odağı, şu anda odakta olan öğenin hemen üstündeki öğeye taşır. |
| Aşağıya doğru | Odağı şu anda odakta olan öğenin hemen altına taşır.* | Hiçbir şey yapmaz. | Odağı şu anda odakta olan öğenin hemen altına taşır.* |
| Doğru | Hiçbir şey yapmaz. | Odağı, şu anda odakta olan öğenin sağındaki öğeye taşır. | Hiçbir şey yapmaz. |
| Sol | Hiçbir şey yapmaz. | Odağı, o anda odakta olan öğenin doğrudan soluna taşır. | Hiçbir şey yapmaz. |
| Boşluk/Enter | Öğenin alt öğeleri varsa öğeyi genişletir/daraltır ve odağı değiştirmez. | Öğenin alt öğeleri varsa, alt öğeleri açılır menüye genişletir ve açılır menüdeki ilk öğeye odaklanır. | Öğeyi çağırır/seçer ve açılır menüyü kapatır. |
| Esc | Hiçbir şey yapmaz. | Hiçbir şey yapmaz. | Açılır menüyü kapatır. |
Boşluk veya enter tuşu her zaman bir öğeyi çağırır/seçer.
*Öğelerin görsel olarak bitişik olması gerekmediğini, odağın bölmenin listesindeki son öğeden ayarlar öğesine taşınacağını unutmayın.
NavigationView özelleştirmesi
Bölme Arka Planları
Varsayılan olarak, NavigationView bölmesi görüntüleme moduna bağlı olarak farklı bir arka plan kullanır:
- bölme, solda genişletildiğinde, içerikle yan yana (Sol modda) yerleşir ve düz gri bir renk alır.
- bölme, içeriğin üzerine katman olarak açıldığında uygulama içi akrilik kullanır (Üst, En Az veya Sıkıştırılmış modda).
Bölme arka planını değiştirmek için, arka planı her modda işlemek için kullanılan XAML tema kaynaklarını geçersiz kılabilirsiniz. (Bu teknik, farklı görüntü modlarında farklı arka planları desteklemek amacıyla tek bir PaneBackground özelliği yerine kullanılır.)
Bu tablo, her görüntüleme modunda hangi tema kaynağının kullanıldığını gösterir.
| Görüntüleme modu | Tema kaynağı |
|---|---|
| Sol | GezinimGörünümüGenişletilmişBölmeArkaPlan |
| SolKompakt SolMinimal |
GezinimGörünümüVarsayılanPanelArkaPlanı |
| Yukarı | GezinmeGörünümüÜstPanelArkaplan |
Bu örnekte, App.xaml'de tema kaynaklarının nasıl geçersiz kılınacakları gösterilmektedir. Tema kaynaklarını geçersiz kıldığınızda, her zaman en azından "Varsayılan" ve "Yüksek Kontrast" kaynak sözlüklerini sağlamalı, ayrıca gerekirse "Açık" veya "Koyu" kaynaklar için sözlükler eklemelisiniz. Daha fazla bilgi için bkz. ResourceDictionary.ThemeDictionaries.
Önemli
Bu kod, Akrilik Fırça'nın WinUI 2 sürümünün nasıl kullanılacağını gösterir. Bunun yerine Akrilik Fırça'nın platform sürümünü kullanıyorsanız, uygulama projenizin en düşük sürümü SDK 16299 veya üzeri olmalıdır. Platform sürümünü kullanmak için muxm:'e yapılan tüm referansları kaldırın.
<Application ... xmlns:muxm="using:Microsoft.UI.Xaml.Media" ...>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls"/>
<ResourceDictionary>
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Default">
<!-- The "Default" theme dictionary is used unless a specific
light, dark, or high contrast dictionary is provided. These
resources should be tested with both the light and dark themes,
and specific light or dark resources provided as needed. -->
<muxm:AcrylicBrush x:Key="NavigationViewDefaultPaneBackground"
BackgroundSource="Backdrop"
TintColor="LightSlateGray"
TintOpacity=".6"/>
<muxm:AcrylicBrush x:Key="NavigationViewTopPaneBackground"
BackgroundSource="Backdrop"
TintColor="{ThemeResource SystemAccentColor}"
TintOpacity=".6"/>
<LinearGradientBrush x:Key="NavigationViewExpandedPaneBackground"
StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="LightSlateGray" Offset="0.0" />
<GradientStop Color="White" Offset="1.0" />
</LinearGradientBrush>
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrast">
<!-- Always include a "HighContrast" dictionary when you override
theme resources. This empty dictionary ensures that the
default high contrast resources are used when the user
turns on high contrast mode. -->
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
Üst boşluk
özelliği
IsTitleBarAutoPaddingEnabledWinUI 2.2 veya sonraki bir sürümü gerektirir.
Bazı uygulamalar, pencerelerinin başlık çubuğunu
Uygulamanız
<muxc:NavigationView x:Name="NavView" IsTitleBarAutoPaddingEnabled="False">
Açıklamalar
NavigationView'un üst bilgi alanının konumunu daha fazla ayarlamak için, Örneğin Sayfa kaynaklarınızda NavigationViewHeaderMargin XAML tema kaynağını geçersiz kılın.
<Page.Resources>
<Thickness x:Key="NavigationViewHeaderMargin">12,0</Thickness>
</Page.Resources>
Bu tema kaynağı NavigationView.Header'ın etrafındaki kenar boşluğunu değiştirir.
UWP ve WinUI 2
Önemli
Bu makaledeki bilgiler ve örnekler, Windows Uygulama SDK'sı ve WinUI 3kullanan uygulamalar için iyileştirilmiştir, ancak genellikle WinUI 2kullanan UWP uygulamaları için geçerlidir. Platforma özgü bilgiler ve örnekler için UWP API başvurusuna bakın.
Bu bölüm, denetimi bir UWP veya WinUI 2 uygulamasında kullanmak için ihtiyacınız olan bilgileri içerir.
UWP uygulamaları için NavigationView denetimi WinUI 2'nin bir parçası olarak dahil edilir. Yükleme yönergeleri de dahil olmak üzere daha fazla bilgi için bkz. WinUI 2. Bu denetimin API'leri hem Windows.UI.Xaml.Controls hem de Microsoft.UI.Xaml.Controls ad alanlarında mevcuttur.
- UWP API'leri:Windows.UI.Xaml.Controls.NavigationView sınıfı
- WinUI 2 Apis:Microsoft.UI.Xaml.Controls.NavigationView sınıfı
- WinUI 2 Galeri uygulamasını açın ve NavigationView'un nasıl çalıştığını görün. WinUI 2 Galeri uygulaması çoğu WinUI 2 denetimi, özelliği ve işlevselliğine ilişkin etkileşimli örnekler içerir. Uygulamayı Microsoft Store'dan alın veya GitHub'dan kaynak kodunu alın.
Tüm denetimler için en güncel stilleri, şablonları ve özellikleri almak için en son WinUI 2'yi kullanmanızı öneririz. NavigationView'un üst ve hiyerarşik gezinti gibi bazı özellikleri Windows 10, sürüm 1809 (SDK 17763) veya üzeri ya da WinUI 2 gerektirir.
Bu makaledeki kodu WinUI 2 ile kullanmak için, projenize dahil edilen Windows UI Kitaplığı API'lerini temsil etmek için XAML'de bir diğer ad kullanın (muxckullanıyoruz). Daha fazla bilgi için WinUI 2'yi kullanmaya başlama hakkında bölümüne bakın.
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
<muxc:NavigationView />
İlgili konular
Windows developer