我正在尝试使用 Xamarin Forms 开发 android 应用程序。我想要嵌套导航
Header (on tap dropdown items show)
Item1
Item2
从带有子菜单的显示弹出(shell)中,我为此使用了大部分代码,但它不起作用
这是我添加到默认应用程序的代码
FlyoutItemTemplateSelector.cs
using System;
using System.Collections.Generic;
using System.Text;
using Xamarin.Forms;
namespace MauiApp.Shared
{
public class FlyoutItemTemplateSelector : DataTemplateSelector
{
public DataTemplate NavigationHeaderTemplate { get; set; }
public DataTemplate NavigationItemTemplate { get; set; }
private List<string> list = new List<string> { "Header1","Header2"};
//There should be more than one header in shell
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
if (item is ShellGroupItem && list.Contains(((ShellGroupItem)item).Title))
{
// Make sure a header item is not clickable.
((ShellGroupItem)item).IsEnabled = false;
return NavigationHeaderTemplate;
}
else
return NavigationItemTemplate;
}
}
}
AppShell.xaml
<DataTemplate x:Key="FlyoutItemTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.25*" />
<ColumnDefinition Width="0.75*" />
</Grid.ColumnDefinitions>
<Label Grid.Column="1"
Text="{Binding Title}"
TextColor="White"
VerticalTextAlignment="Center"
BackgroundColor="Aqua"/>
</Grid>
</DataTemplate>
<DataTemplate x:Key="FlyoutHeaderTemplate">
<StackLayout Orientation="Vertical">
<Label HeightRequest="35"
Margin="20,0,0,0"
Text="{Binding Title}"
TextColor="Black"
VerticalTextAlignment="Center" >
<Label.GestureRecognizers>
<TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"></TapGestureRecognizer>
</Label.GestureRecognizers>
</Label>
</StackLayout>
</DataTemplate>
<controls:FlyoutItemTemplateSelector
x:Key="FlyoutTemplateSelector"
NavigationHeaderTemplate="{StaticResource FlyoutHeaderTemplate}"
NavigationItemTemplate="{StaticResource FlyoutItemTemplate}" />
</ResourceDictionary>
</Shell.Resources>
<FlyoutItem Title="Example" Shell.TabBarIsVisible="False" FlyoutDisplayOptions="AsMultipleItems" x:Name="example" Style="{StaticResource BaseStyle}">
<ShellContent Title="Header1" ContentTemplate="{DataTemplate local:AboutPage}"/>
<ShellContent Title="Item1" IsVisible="{Binding Changed}" ContentTemplate="{DataTemplate local:AboutPage}"/>
<ShellContent Title="Item2" IsVisible="{Binding Changed}" ContentTemplate="{DataTemplate local:AboutPage}"/>
</FlyoutItem>
和回码
using MauiApp.ViewModels;
using MauiApp.Views;
using System;
using System.Collections.Generic;
using Xamarin.Forms;
using MauiApp.Shared;
using System.ComponentModel;
namespace MauiApp
{
public partial class AppShell : Xamarin.Forms.Shell
{
Status status;
public AppShell()
{
InitializeComponent();
Routing.RegisterRoute(nameof(ItemDetailPage), typeof(ItemDetailPage));
Routing.RegisterRoute(nameof(NewItemPage), typeof(NewItemPage));
status = new Status();
this.BindingContext = status;
}
private async void OnMenuItemClicked(object sender, EventArgs e)
{
await Shell.Current.GoToAsync("//LoginPage");
}
private void TapGestureRecognizer_Tapped(object sender, EventArgs e)
{
status.Changed = !status.Changed;
}
}
public class Status : INotifyPropertyChanged
{
bool _changed = false;
public bool Changed
{
get
{
return _changed;
}
set
{
if (_changed != value)
{
_changed = value;
OnPropertyChanged("Changed");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我现在得到的只是将 Header1 设置为 NavigationItemTemplate 而不是 NavigationHeaderTemplate 的导航。
我的问题是:
- 这是获得“嵌套”导航的好方法吗(如果不是更好的方法)
- 为什么 Header 被识别为 Item 以及如何修复它?