Содержание
При использовании Shell в приложениях .NET MAUI, навигация по страницам может осуществляться как с использованием всплывающего меню, так и с использованием нижней панели вкладок. Для того, чтобы задействовать нижнюю панель вкладок в качестве элемента навигации верхнего уровня используются элементы TabBar.
Элемент TabBar
Чтобы включить в качестве элемента навигации нижнюю панель вкладок, необходимо определить в Shell элемент TabBar и разместить в нем один или несколько элементов Tab. Каждый Tab, в итоге, будет отображаться как вкладка. Здесь стоит отметить, что внешний вид панели вкладок зависит от платформы. Например, изменим код AppShell.xaml нашего приложения следующим образом:
<?xml version="1.0" encoding="UTF-8" ?>
<Shell
x:Class="AppShellEx.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:AppShellEx"
Title="AppShellEx">
<TabBar>
<Tab Title="Home">
<ShellContent ContentTemplate="{DataTemplate local:MainPage}"/>
</Tab>
<Tab Title="Detail">
<ShellContent ContentTemplate="{DataTemplate local:DetailPage}"/>
</Tab>
</TabBar>
</Shell>
Здесь мы разместили элементы меню на двух вкладках. В Windows мы увидим следующее меню:
В Android — это будет действительно нижняя панель вкладок
Кроме этого, по умолчанию, наличие в Shell элемента TabBar полностью отключает боковое меню. Проверить это достаточно просто — добавим в Shell элемент ShellContent или FlyoutItem, например:
<?xml version="1.0" encoding="UTF-8" ?>
<Shell
x:Class="AppShellEx.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:AppShellEx"
Title="AppShellEx">
<TabBar>
<Tab Title="Home">
<ShellContent ContentTemplate="{DataTemplate local:MainPage}"/>
</Tab>
<Tab Title="Detail">
<ShellContent ContentTemplate="{DataTemplate local:DetailPage}"/>
</Tab>
</TabBar>
<FlyoutItem Title="Detail" FlyoutIcon="phone.png" Route="Detail">
<ShellContent ContentTemplate="{DataTemplate local:DetailPage}"/>
</FlyoutItem>
</Shell>
Так как в Shell присутствует элемент TabBar, то последний элемент меню не будет виден в приложении.
Также, если TabBar содержит более пяти вкладок Tab, то на мобильном устройстве это приведет к тому, что все прочие вкладки скроются за кнопкой «More», а в Windows такое поведение будет только, если для вкладок не достаточно места на экране. Например, изменим код оболочки следующим образом:
<?xml version="1.0" encoding="UTF-8" ?>
<Shell
x:Class="AppShellEx.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:AppShellEx"
Title="AppShellEx">
<TabBar>
<Tab Title="1">
<ShellContent ContentTemplate="{DataTemplate local:MainPage}"/>
</Tab>
<Tab Title="2">
<ShellContent ContentTemplate="{DataTemplate local:DetailPage}"/>
</Tab>
<Tab Title="3">
<ShellContent ContentTemplate="{DataTemplate local:MainPage}"/>
</Tab>
<Tab Title="4">
<ShellContent ContentTemplate="{DataTemplate local:DetailPage}"/>
</Tab>
<Tab Title="5">
<ShellContent ContentTemplate="{DataTemplate local:MainPage}"/>
</Tab>
<Tab Title="6">
<ShellContent ContentTemplate="{DataTemplate local:DetailPage}"/>
</Tab>
<Tab Title="7">
<ShellContent ContentTemplate="{DataTemplate local:MainPage}"/>
</Tab>
<Tab Title="8">
<ShellContent ContentTemplate="{DataTemplate local:DetailPage}"/>
</Tab>
</TabBar>
</Shell>
Внешний вид панели вкладок в Windows будет таким:
а при нехватке места для размещения всех вкладок:
при нажатии на кнопку «…» появится контекстное меню с оставшимися пунктами. В Android вкладки будут сразу сгруппированы:
Внешний вид вкладок
Для изменения внешнего вида вкладок используются присоединенные свойства Shell:
| Свойство | Тип | Описание |
TabBarBackgroundColor |
Color |
определяет цвет фона для панели вкладок |
TabBarDisabledColor |
Color |
определяет цвет отключенных вкладок на панели |
TabBarForegroundColor |
Color |
определяет цвет переднего плана для панели вкладок |
TabBarTitleColor |
Color |
определяет цвет заголовков для панели вкладок |
TabBarUnselectedColor |
Color |
определяет цвет невыбранных вкладок на панели |
Например, изменим внешний вид вкладок в нашем меню:
<?xml version="1.0" encoding="UTF-8" ?>
<Shell
x:Class="AppShellEx.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:AppShellEx"
Title="AppShellEx">
<TabBar Shell.TabBarBackgroundColor="Coral" Shell.TabBarForegroundColor="Yellow" Shell.TabBarTitleColor="Blue">
<Tab Title="1">
<ShellContent ContentTemplate="{DataTemplate local:MainPage}"/>
</Tab>
<Tab Title="2">
<ShellContent ContentTemplate="{DataTemplate local:DetailPage}"/>
</Tab>
<Tab Title="3">
<ShellContent ContentTemplate="{DataTemplate local:MainPage}"/>
</Tab>
<Tab Title="4">
<ShellContent ContentTemplate="{DataTemplate local:DetailPage}"/>
</Tab>
<Tab Title="5">
<ShellContent ContentTemplate="{DataTemplate local:MainPage}"/>
</Tab>
<Tab Title="6">
<ShellContent ContentTemplate="{DataTemplate local:DetailPage}"/>
</Tab>
<Tab Title="7">
<ShellContent ContentTemplate="{DataTemplate local:MainPage}"/>
</Tab>
<Tab Title="8">
<ShellContent ContentTemplate="{DataTemplate local:DetailPage}"/>
</Tab>
</TabBar>
</Shell>
Здесь мы определили у элемента TabBar три свойства, отвечающие за цвет панели вкладок. Теперь запустим приложение и посмотрим на результат.
Итого
Для того, чтобы разместить элементы меню на панели вкладок используется элемент TabItem. Наличие такого элемента в Shell по умолчанию отключает боковое меню. Внешний вид вкладок зависит от платформы на которой запускается приложение, а также от значений присоединенных свойств Shell, отвечающих за цвета текста, фона вкладок и т.д.
