Как скрыть вкладки Top Navigation в вкладках Shell TabBar - PullRequest
0 голосов
/ 29 апреля 2020

Я вложил много усилий в исследования, но не могу решить свою проблему.

Чего я хочу достичь:

Я хотел бы использовать Xamarin Shell Navigation и скрыть верхние вкладки навигации (не строка заголовка -> называется «панель навигации», а не «панель вкладок»). Следите за изображением и оранжевой помеченной областью.

Shell.TabBarIsVisible="False" hides Bottom "TabBar" ("Tab 1", "Tab 2", "Tab 3")
Shell.NavBarIsVisible="False" hides Title Bar ("Page 1 Full Title")

Ничто не скрывает верхние навигационные вкладки под этой строкой заголовка



То есть моя структура:

 <Shell>
    <TabBar x:Name="RootTab">
        <Tab 
            Title="Tab1" >
            <ShellContent 
                Route="page1" 
                Title="page1" 
                ContentTemplate="{DataTemplate view:Page1}" />
            <ShellContent 
                Route="page2" 
                Title="page2" 
                ContentTemplate="{DataTemplate view:Page2}" />
            <ShellContent 
                Route="page3" 
                Title="page3" 
                ContentTemplate="{DataTemplate view:Page3}" />
            <ShellContent 
                Route="page4" 
                Title="page4" 
                ContentTemplate="{DataTemplate view:Page4}" />
        </Tab>
        <Tab 
            Title="Tab2" >
            <ShellContent 
                Route="tab2" 
                Title="tab2" 
                ContentTemplate="{DataTemplate view:Tab2Page}" />
        </Tab>
        <Tab 
            Title="Tab3" >
            <ShellContent 
                Route="tab3" 
                Title="tab3" 
                ContentTemplate="{DataTemplate view:Tab3Page}" />
        </Tab>
    </TabBar>
  </Shell>

Что я пробовал?

  • IsTabStop

  • Просто поместив 1 начальный ShellContent (Страница 1) во вкладке 1, а затем вручную добавляя / удаляя страницы (2, 3, 4) с помощью кода. Это прекрасно работает для android. Но iOS показывает только черную страницу после добавления новой страницы и удаления старой страницы из вкладки 1.

  • Размещение ShellContents за пределами TabBar. Но затем я теряю свой TabBar ...

Изображение оболочки: https://i.stack.imgur.com/WYugb.png

ОБНОВЛЕНИЕ:

Это работает в Android , но не в iOS (черная страница):
Наличие только одного ShellContent в XAML и добавление другого вручную в Code
AppShell.mytab.Items. Добавить (shell1);
AppShell.mytab.Items.Remove (shell0);

Когда я добавлю эту строку посередине:
Shell.Current.CurrentItem.Items [0 ] .CurrentItem = shell1; (Items [0] означает первую вкладку TabBar -> «Tab 1»)

Похоже, это работает, ура! и показывает следующую страницу, но выдает ошибку: System.NullReferenceException: «Ссылка на объект не установлена ​​для экземпляра объекта» ShellSectionRootRenderer.cs: 201

Похоже https://github.com/xamarin/Xamarin.Forms/issues/5428
и https://github.com/xamarin/Xamarin.Forms/pull/10500

Отсутствует другой поток Опция IsVisible https://github.com/xamarin/Xamarin.Forms/issues/5232

IsVisible был запланирован, но удален, поскольку проблем с именами https://github.com/xamarin/Xamarin.Forms/pull/9023



ОБНОВЛЕНИЕ 2!

СЕГОДНЯ Обновление / Выпуск из Xamarin.Forms 4.5.0.657 до 4.6.0.726 решил проблему. Добавление и удаление не работает нормально в iOS!

https://github.com/xamarin/Xamarin.Forms/pull/10500
Xamarin.Forms 4.6 Ветвь: последний коммит 18 часов go

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Обновление до Xamarin 4.6 исправило ошибку / проблему.

Вот мой код / ​​решение.

AppShell.xaml

<TabBar Route="tabBar">
        <Tab 
            x:Name="myTab" 
            Route="tab1"
            Icon="tab_icon1.png">
            <ShellContent 
                x:Name="shellStart"
                Route="route1A" 
                Title="title" 
                ContentTemplate="{DataTemplate view:Page1A}" />
        </Tab>
        <Tab 
            Route="tab2"
            Icon="tab_icon2.png">
            <ShellContent 
                Route="route2" 
                Title="title2" 
                ContentTemplate="{DataTemplate view:Page2}" />
        </Tab>
        </Tab>
        <Tab 
            Route="tab3"
            Icon="tab_icon3.png">
            <ShellContent 
                Route="route3" 
                Title="title3" 
                ContentTemplate="{DataTemplate view:Page3}" />
        </Tab>
    </TabBar>

AppShell.xaml.cs

public ShellContent shell0;
public ShellContent shell1;
public ShellContent shell2;
public ShellContent shell3;
public static Tab tabLocal;

конструктор

            tabLocal = myTab;
            shell0 = shellStart;
            shell1 = new ShellContent()
            {
                Content = new Page1B(),
                Title = "",
                Route = ""
            };
            shell2 = .... Page1C() ...
            shell3 = .... Page1D() ...
            ...

Переключение страницы 0 на 1

AppShell.tabLocal.Items.Add(shell1);
AppShell.tabLocal.Items.Remove(shell0);

Может быть, эти два метода для навигации полезны

protected async override void OnNavigating(ShellNavigatingEventArgs args)
protected override void OnNavigated(ShellNavigatedEventArgs args)
0 голосов
/ 29 апреля 2020

Вы можете остаться только первой страницей содержимого внутри вкладки в AppShell.

<TabBar x:Name="RootTab">
    <Tab  Title="Tab1">
        <ShellContent 
            Route="page1" 
            Title="page1" 
            ContentTemplate="{DataTemplate view:Page1}" />
    </Tab>
    <Tab 
        Title="Tab2" >
        <ShellContent 
            Route="tab2" 
            Title="tab2" 
            ContentTemplate="{DataTemplate view:Tab2Page}" />
    </Tab>
    <Tab 
        Title="Tab3" >
        <ShellContent 
            Route="tab3" 
            Title="tab3" 
            ContentTemplate="{DataTemplate view:Tab3Page}" />
    </Tab>
</TabBar>

И перемещаться между страницами, используя старые способы

// your "wizard"
await Navigation.PushAsync(new Page2());

Обновление

Если вы хотите скрыть кнопку назад, добавить прозрачное изображение в проект и установить в xaml

<Shell.BackButtonBehavior>
    <BackButtonBehavior IconOverride="transparent.png" IsEnabled="False"/>
</Shell.BackButtonBehavior>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...